查询方式实现由上位机发送1给单片机,蜂鸣器以400ms频率发声

#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.