高手在么?我的单片机(stc89c52)想输出一个频率为38.5khz的信号,晶振是12,程序怎么写

int c;
TH0=0x0FF;
TL0=0x0F1;
a=1;
b=1;
_nop_( );
a=0,b=0;
_nop_( );
_nop_( );
_nop_( );
_nop_( );
_nop_( );
_nop_( );
_nop_( );
_nop_( );
_nop_( );
_nop_( );

利用定时器T0自动装载方式,每13us使P11脚轮流输出高低电平,达到输出38.5khz信号。
完整程序如下:
#include <STC89C52.H>
#define uchar unsigned char
#define uint unsigned int

#define ENABLE_ISP 0x82 //晶振<20MHz

sbit P10 = P1^0;

void init ();
void timer0_ISR (void) interrupt 1 using 0
{
EA=0;
TH0 = 0xf2;//26us~38.5KHZ (0xff-0x13=0xf2)
P10=!P10; //P1.1引脚输出38.5khz
EA=1;
}

void init ()
{
TMOD =0x12;
//TMOD =(TMOD & 0xf0) | 0x01;
TH0 = 0xf2;
ET0 = 1;
TR0 = 1;
EA = 1;
P1=0xff;
P1M1=0x11111111B;
P1M0=0x11111111B;
}
void main ()
{
init();
while (1)
{
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-10-04
用定时器中断做,按照12M经过分频得到,计算出定时器的初始值
第2个回答  2011-10-04
38.5kHz,单片机弄不了那么准的。
第3个回答  2011-10-04
单片机(stc89c52)想输出一个频率为38.5khz的信号,晶振是12,12T模式,1个机器周期1us,38KHZ好像13us左右就中断一次,单片机就别干别的工作了。13us以内,好像本次中断还没处理完呢,下个中断就又来了。
非要做的话,最好把晶振频率提高,而且单片机工作于1T模式下。追问

我那个是做只能车,那38.5是给灯发信号让它以这个频率亮,在用传感器检测频率光,中间语句少不了,我程序要接的语句是
if(F1==0)
SetSpeed('0','F','0');
else if(F2==0)
SetSpeed('F','0','0');
else if(F1&&F2==1)
SetSpeed('0','0','F');
怎么延时可以使得输出的a和b频率为38.5KHZ

追答

实在抱歉,俺不懂你这语言,俺只研究汇编。
你这语言,汇编出来后,语句更多,12MHZ晶振,12T模式下,单片机肯定异常。这点,我可以肯定。

相似回答