"上位機發送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<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就好了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章