學習單片機,編了一個串口程序,實現功能是,由上位機發送1給單片機時,蜂鳴器以400ms頻率發聲,發2時以200ms頻率發聲,發3時以100ms頻率發聲,發4時關閑蜂鳴器,程序如下:
#include<reg52.h> unsigned int flag,R_date,S_date,counter; unsigned char t; sbit beep=P0^1; void UART_init() { TMOD=0x21; PCON=0x80; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TH1=0xf3; TL1=0xf3; REN=1; ET0=1; TR1=1; SM0=0; SM1=1; EA=1; ES=1; TR0=1; PS=1; //串口中斷高優先 PT0=0; //定時器0中斷低優先 } void main() { UART_init(); while(1) { if(flag==1) { ES=0; SBUF=S_date; while(!TI); TI=0; ES=1; flag=0; } } } void UART() interrupt 4 { RI=0; R_date=SBUF; S_date=R_date; flag=1; switch(S_date) { case 1: t=8;break; case 2: t=4;break; case 3: t=2;break; case 4: beep=0;break; default: break; } } void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; counter++; if(counter==t) { counter=0; beep=~beep; } }
晶振12M,波特率4800,實現的功能是:發出的數據又返回來了,但是不能控制單片機,S_date數據好像沒有進入switch語句,開始我考慮是不是優先級的問題,就設置了串口優先或者定時器優先,還是不起作用,高手指教,謝謝! |