请问这段代码哪里有问题?怎么改?
/*中断实现串口通信 */
#include<reg52.h>
unsigned char flag;
void main()
{
void init();
init();
while(1)
{
while(!flag)
;
ES = 0;
P1 = SBUF;
flag = 0;
SBUF = P1;
while(!TI) //TI发送中断标志
;
TI = 0;
ES = 1;
}
}
void init()
{
TMOD = 0x20; //定时器1工作方式2自动重装8位计时器
TH1 = 0xfd; //波特率9600
TH0 = 0xfd;
SM0 = 0; //串行口工作方式1
SM1 = 1;
EA = 1;
ET1 = 1;
TR1 = 1;
ES = 1;
REN = 1; //串行数据允许接收位
}
void serial() interrupt 4
{
flag = 1;
RI = 0; //接收完数据后硬件将RI置1,必须软件归0
}
5 个解决方案
#1
我的目的是发一个数据给单片机。然后把数据赋给P1口。。再把该数据传回来。
#2
void init()
{
TMOD = 0x20; //定时器1工作方式2自动重装8位计时器
TH1 = 0xfd; //波特率9600
TH0 = 0xfd;
SM0 = 0; //串行口工作方式1
SM1 = 1;
EA = 1;
ET1 = 1; //去掉这个语句就程序就正确了
TR1 = 1;
ES = 1;
REN = 1; //串行数据允许接收位
}
//ET1 = 1; //去掉这个语句就程序就正确了
为什么??
#3
又你楼主你,呵呵,加与不加,先说说前后的效果的区别是?
我想是这样的,首先,你这里没必要打开定时器1中断,因为此时的定时器1是作为你的波特率发生器。而既然你打开了中断,应该就会有中断,而不管你有没有写中断函数,但是中断到了之后,还是会转到对应的中断地址执行。就是会有个跳变过程。这种跳转,可能会中断你的串口传输,而且频繁发生,对你串口传输更不利。还有一个可能是中断后,一些标志位没有办法清。。
我想是这样的,首先,你这里没必要打开定时器1中断,因为此时的定时器1是作为你的波特率发生器。而既然你打开了中断,应该就会有中断,而不管你有没有写中断函数,但是中断到了之后,还是会转到对应的中断地址执行。就是会有个跳变过程。这种跳转,可能会中断你的串口传输,而且频繁发生,对你串口传输更不利。还有一个可能是中断后,一些标志位没有办法清。。
#4
楼上正解
#5
利用串口中断来接收数据的话,格式必须是:
void serial() interrupt 4
{
if(RI)
{
你的程序
}
if(TI)
{
你的程序
}
}
楼主犯了和我刚开始学习时一样的错误,你看看问我的这个就知道了
http://topic.csdn.net/u/20100528/21/d63b9a47-0918-48ef-a822-5ca338fe76c9.html
void serial() interrupt 4
{
if(RI)
{
你的程序
}
if(TI)
{
你的程序
}
}
楼主犯了和我刚开始学习时一样的错误,你看看问我的这个就知道了
http://topic.csdn.net/u/20100528/21/d63b9a47-0918-48ef-a822-5ca338fe76c9.html
#1
我的目的是发一个数据给单片机。然后把数据赋给P1口。。再把该数据传回来。
#2
void init()
{
TMOD = 0x20; //定时器1工作方式2自动重装8位计时器
TH1 = 0xfd; //波特率9600
TH0 = 0xfd;
SM0 = 0; //串行口工作方式1
SM1 = 1;
EA = 1;
ET1 = 1; //去掉这个语句就程序就正确了
TR1 = 1;
ES = 1;
REN = 1; //串行数据允许接收位
}
//ET1 = 1; //去掉这个语句就程序就正确了
为什么??
#3
又你楼主你,呵呵,加与不加,先说说前后的效果的区别是?
我想是这样的,首先,你这里没必要打开定时器1中断,因为此时的定时器1是作为你的波特率发生器。而既然你打开了中断,应该就会有中断,而不管你有没有写中断函数,但是中断到了之后,还是会转到对应的中断地址执行。就是会有个跳变过程。这种跳转,可能会中断你的串口传输,而且频繁发生,对你串口传输更不利。还有一个可能是中断后,一些标志位没有办法清。。
我想是这样的,首先,你这里没必要打开定时器1中断,因为此时的定时器1是作为你的波特率发生器。而既然你打开了中断,应该就会有中断,而不管你有没有写中断函数,但是中断到了之后,还是会转到对应的中断地址执行。就是会有个跳变过程。这种跳转,可能会中断你的串口传输,而且频繁发生,对你串口传输更不利。还有一个可能是中断后,一些标志位没有办法清。。
#4
楼上正解
#5
利用串口中断来接收数据的话,格式必须是:
void serial() interrupt 4
{
if(RI)
{
你的程序
}
if(TI)
{
你的程序
}
}
楼主犯了和我刚开始学习时一样的错误,你看看问我的这个就知道了
http://topic.csdn.net/u/20100528/21/d63b9a47-0918-48ef-a822-5ca338fe76c9.html
void serial() interrupt 4
{
if(RI)
{
你的程序
}
if(TI)
{
你的程序
}
}
楼主犯了和我刚开始学习时一样的错误,你看看问我的这个就知道了
http://topic.csdn.net/u/20100528/21/d63b9a47-0918-48ef-a822-5ca338fe76c9.html