学习单片机,编了一个串口程序,实现功能是,由上位机发送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语句,开始我考虑是不是优先级的问题,就设置了串口优先或者定时器优先,还是不起作用,高手指教,谢谢!
要对每个中断设置不同的寄存器组哦。如void inter0() interrupt 1(中断号) unsing 1(使用第1组寄存器),推荐篇博文给你http://blog.163.com/pc8mcu@126/blog/static/996517962009190215892/
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |