"上位机发送1给单片机时,蜂鸣器以400ms频率发声"上篇的终于调出来,我这人真的比较笨,调了一天,网上很多的例程是有问题的

 /*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
#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就好了!

你可能感兴趣的:(单片机学习)