#define uint unsigned int
uint num,temp;
uchar a;
sbit beep=P2^3;
void main()
{
TMOD=0x21;//设置定时器1为工作方式2,定时器0为工作方式1
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
ET0=1;//定时器0开中断//
TR0=1;//启动定时器0//
num=0;
temp=0;
while(1)
{
if(RI==1)//若为1,说明接受到数据//
{
RI=0;//软件清零//
a=SBUF;
switch(a)
{
case 1:
num++;
temp++;
if(temp==8)
{
temp=0;
beep=~beep;
}
break;
}
}
}
}
void T0_time() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
}
运行无错误,但是实现不了功能。
逻辑有问题,没有RI,beep就完全不会变化,而且还要累计8次,也就是说,你得每秒发400X2X8个1,才能听到400Hz的声音。
400ms频率?是400Hz吧?想多久呢,不停?
正确做法:
定义一个标志,表上当前响还是不响。串口用查询或中断都可以,检测到1,就打开这个标志。
定义一个800Hz频率中断的定时器。在中断里检测标志,如果标志开启,就翻转一次IO.