5007|5

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

51单片机中断实现串口通信的问题。 [复制链接]


  1. 请问这段代码哪里有问题?怎么改?
  2. /*中断实现串口通信 */
  3. #include
  4. unsigned char flag;

  5. void main()
  6. {
  7.     void init();

  8.     init();
  9.     while(1)
  10.     {
  11.         while(!flag)
  12.             ;
  13.         ES = 0;
  14.         P1 = SBUF;
  15.         flag = 0;      
  16.         SBUF = P1;  
  17.         while(!TI) //TI发送中断标志   
  18.             ;            
  19.         TI = 0;
  20.         ES = 1;  
  21.            
  22.     }        
  23. }

  24. void init()
  25. {
  26.     TMOD = 0x20; //定时器1工作方式2自动重装8位计时器
  27.     TH1 = 0xfd; //波特率9600
  28.     TH0 = 0xfd;
  29.     SM0 = 0;     //串行口工作方式1
  30.     SM1 = 1;
  31.     EA = 1;
  32.     ET1 = 1;
  33.     TR1 = 1;
  34.     ES = 1;
  35.     REN = 1;  //串行数据允许接收位
  36. }

  37. void serial() interrupt 4
  38. {
  39.     flag = 1;
  40.     RI = 0; //接收完数据后硬件将RI置1,必须软件归0
  41. }
复制代码

最新回复

利用串口中断来接收数据的话,格式必须是: void serial() interrupt 4 {     if(RI)    {    你的程序    }     if(TI)    {     你的程序    } } 楼主犯了和我刚开始学习时一样的错误,你看看问我的这个就知道了 http://topic.eeworld.net/u/20100528/21/d63b9a47-0918-48ef-a822-5ca338fe76c9.html  详情 回复 发表于 2010-6-2 21:11
点赞 关注

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我的目的是发一个数据给单片机。然后把数据赋给P1口。。再把该数据传回来。
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

  1. void init()
  2. {
  3.     TMOD = 0x20; //定时器1工作方式2自动重装8位计时器
  4.     TH1 = 0xfd; //波特率9600
  5.     TH0 = 0xfd;
  6.     SM0 = 0;     //串行口工作方式1
  7.     SM1 = 1;
  8.     EA = 1;
  9.     ET1 = 1; //去掉这个语句就程序就正确了
  10.     TR1 = 1;
  11.     ES = 1;
  12.     REN = 1;  //串行数据允许接收位
  13. }

  14. //ET1 = 1; //去掉这个语句就程序就正确了
  15. 为什么??
复制代码
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
又你楼主你,呵呵,加与不加,先说说前后的效果的区别是?

我想是这样的,首先,你这里没必要打开定时器1中断,因为此时的定时器1是作为你的波特率发生器。而既然你打开了中断,应该就会有中断,而不管你有没有写中断函数,但是中断到了之后,还是会转到对应的中断地址执行。就是会有个跳变过程。这种跳转,可能会中断你的串口传输,而且频繁发生,对你串口传输更不利。还有一个可能是中断后,一些标志位没有办法清。。
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

5
 
楼上正解
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

6
 
利用串口中断来接收数据的话,格式必须是:
void serial() interrupt 4
{
    if(RI)
   {
   你的程序
   }
    if(TI)
   {
    你的程序
   }

}
楼主犯了和我刚开始学习时一样的错误,你看看问我的这个就知道了
http://topic.eeworld.net/u/20100528/21/d63b9a47-0918-48ef-a822-5ca338fe76c9.html
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表