学习单片机,编了一个串口程序,实现功能是,由上位机发送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语句,开始我考虑是不是优先级的问题,就设置了串口优先或者定时器优先,还是不起作用,高手指教,谢谢! |