/*1.由上位機發送1給單片機時,蜂鳴器以400ms頻率發聲
,發2時以200ms頻率發聲,
發3時以100ms頻率發聲,
發4時關閒蜂鳴器
頻率 11.0592M HZ
0011 0001 49(十) 31(16) 1
0011 0010 50 32 2
0011 0011 51 33 3
*/
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uint num;
uint temp;//用於記錄num的變化
uchar a;
uint flag;
sbit buzzer=P2^3;
void delay(uint z);
void init();
void main()
{
init();
while(1)
{
if(flag==1)
{
flag=0;
ES=0;
SBUF=a;
while(!TI);
TI=0;
TR0=1;
P1=a;
if(a=='1')//注意數字1與字符1的區別
{
//buzzer=~buzzer;
//delay(200);
//buzzer=~buzzer;
//delay(200);
temp=4;
}
if(a=='2')
{
temp=2;
}
if(a=='3')
{
temp=1;
}
if(a=='4')
{
TR0=0;
buzzer=1;
ES=1;
}
}
}
}
void init()
{
TMOD=0x21;//定時器T1選擇工作方式2
TH1=0xfd;
TL1=0xfd;//定時器T1裝初值
TR1=1;
SM0=0;
SM1=1;//SCON中設定定時器工作方式爲1
REN=1;//SOCN中開串行接受
EA=1;
ES=1;//IE中開串行口中斷
num=0;
temp=0;
TH0=(65536-45972)/256;
TL0=(65536-45872)%256;
ET0=1;
}
void ser() interrupt 4
{
RI=0;
a=SBUF;//沒有返回給上位機顯示a的值
flag=1;
}
void enter0() interrupt 1//50ms
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num++;
if(num==temp)
{
num=0;
buzzer=~buzzer;
ES=1;
}
}
void delay(uint z)//用於調試,main函數中沒用到
{
uint x,y;
for(x=z;x>0;x--)
for(y=123;y>0;y--);
}
有時候串口調試工具會短路,重啓一下MCU就好了!