只能实现定时器中断,无法实现串口中断发送数据,但屏蔽掉定时器中断服务子程序后串口中断就好用,求大神帮忙看看哪里出了问题。
发送端程序
#include <REG52.h>//通用89C52头文件
sbit bz = P2^4 ; //端口定义
bit send_ed = 1 ;
sbit LED = P1^7 ;
char fe;
//发送
/***************************************************************************/
void init()
{
PS=1;
TMOD=0x21; //定时器1和2工作方式2(8位定时/计数)
PCON=0x00; //SMOD=0,不加倍
SCON=0x50; //串口工作方式1,允许接收
TH1=0xfd; //定时器1设置初值,波特率9600bit/s,
TL1=0xfd;
TR1=1; //启动定时器T1
EA=1; //打开总中断
ES=1; //打开串口中断
TH0 =(65536 - 5000) / 256;
TL0 = (65536 - 5000)% 256;
ET0 = 1;
TR0 = 1;
}
void fasong()
{
if(bz==0)
{
fe = 0;
}
else
{
fe = 1;
}
if(send_ed == 1)
{
ES=1;
SBUF = fe; //发送数据
send_ed = 0;
ES=0;
}
}
void main(void)//主函数
{
init();
while(1) //主循环
{
fasong();
}
}
void ser() interrupt 4//串口发送,中断方式
{
EA = 0;
if(TI == 1); //等待发送完成
TI=0; //清空发送标志位
send_ed = 1;
EA = 1;
}
void timer0() interrupt 1
{
TH1 = (65536 - 5000) / 256;
TL1 = (65536 - 5000) % 256;
LED = !LED;
}
接收端程序
#include <REG52.h>//通用89C52头文件
sbit bz = P1^0 ;
char fe;
bit new_rec = 0;
sbit LED = P1^7 ;
/***************************************************************************/
void init()
{
PS=1;
TMOD=0x21; //定时器1和2工作方式2(8位定时/计数)
PCON=0x00; //SMOD=0,不加倍
SCON=0x50; //串口工作方式1,允许接收
TH1=0xfd; //定时器1设置初值,波特率9600bit/s,
TL1=0xfd;
TR1=1; //启动定时器T1
EA=1; //打开总中断
// ES=1; //打开串口中断
TH0 =(65536 - 5000) / 256;
TL0 = (65536 - 5000)% 256;
ET0 = 1;
TR0 = 1;
}
void jieshou()
{
if(new_rec == 1)
ES=1;
fe=SBUF; //接收数据
new_rec = 0;
ES=0;
if(fe == 1) bz = 0;
if(fe == 0) bz = 1;
}
void main(void)//主函数
{
init();
while(1) //主循环
{
jieshou();
}
}
/***************************************************************************/
void ser() interrupt 4//串口接收,中断方式
{
EA = 0;
if(RI == 1) //如果收到.
RI = 0; //清除标志.
new_rec = 1;
EA = 1;
}
/***************************************************************************/
void timer0() interrupt 1
{
TH1 = (65536 - 5000) / 256;
TL1 = (65536 - 5000) % 256;
LED = !LED;
}
此帖出自
小平头技术问答
一周热门 更多>