找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1728|回复: 7
打印 上一主题 下一主题
收起左侧

我的单片机串口通信,目的是发送什么就接受什么,程序总是出现问题

[复制链接]
跳转到指定楼层
楼主
50黑币
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4.         

  5. void main()
  6. {
  7.         TMOD=0x20;                //选择定时器1工作方式2-8位自动重装
  8.         TH1=0xe8;
  9.         TL1=0xe8;                        //设置波特率=((2^smod)* F)/(32*12*(256-N)=9600                //smod=0
  10.         REN=1;
  11.         SM0=0;                                //选择串口通信模式1
  12.         SM1=1;
  13.         TR1=1;                                //定时器1开启
  14.         EA=1;                                        //中断总开关
  15.         ES=1;                                        //串行中断允许位
  16.         while(1);
  17. }        

  18. void inter()interrupt 4
  19. {
  20.                 uchar s;
  21.                 RI=0;                //接收
  22.                 s=SBUF;
  23.                 RI=0;
  24.                 SBUF=s;
  25.                 while(!TI);
  26.                 TI=0;
  27. }
复制代码
接收和发送内容不对等,如图

2022-02-28_080828.png (35.9 KB, 下载次数: 52)

2022-02-28_080828.png

2022-02-28_080723.png (33.49 KB, 下载次数: 51)

2022-02-28_080723.png

最佳答案

查看完整内容

你没弄清楚51 串口中断要求,你收发都写到一起了,造成中断嵌套了。1、无论收发都会进中断;2、发一般写到主程序,包括TI清零;3、额外提醒,中断中对RI要先判断啊,否则发信触发中断也读一遍成什么了。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:844772 发表于 2022-2-27 16:00 | 只看该作者
你没弄清楚51 串口中断要求,你收发都写到一起了,造成中断嵌套了。1、无论收发都会进中断;2、发一般写到主程序,包括TI清零;3、额外提醒,中断中对RI要先判断啊,否则发信触发中断也读一遍成什么了。
回复

使用道具 举报

板凳
ID:625730 发表于 2022-2-27 16:44 | 只看该作者
出现的是什么问题? 一般是先把串口配置好之后,SM0=0;SM1=1;再REN=1;,允许串口接收。
回复

使用道具 举报

地板
ID:997450 发表于 2022-2-28 08:12 | 只看该作者
TEC 发表于 2022-2-27 16:44
出现的是什么问题? 一般是先把串口配置好之后,SM0=0;SM1=1;再REN=1;,允许串口接收。

图片发了,有没有可能是编码问题?我用的Keil
回复

使用道具 举报

5#
ID:301191 发表于 2022-2-28 15:53 | 只看该作者
顶一下
回复

使用道具 举报

6#
ID:1007106 发表于 2022-2-28 16:27 | 只看该作者
先配置好串口
回复

使用道具 举报

7#
ID:466505 发表于 2022-2-28 17:10 | 只看该作者
中断要判定是接收中断还是发送中断
回复

使用道具 举报

8#
ID:143186 发表于 2022-3-3 11:10 | 只看该作者
不要发送123,用两位数试一下,例如发送12,看返回什么
回复

使用道具 举报

9#
ID:514254 发表于 2022-3-3 11:28 | 只看该作者
  1. #include <reg51.h>
  2. /**************************************************
  3. 接收数据中断服务子函数
  4. ***************************************************/
  5. void RXD_CHAR() interrupt 4
  6. {
  7.     unsigned char RXD_data;
  8.     if(RI==1) {                                //判断串行接收中断
  9.         RXD_data = SBUF;        //读取数据
  10.         P0 = RXD_data;                 //显示所读取的数据
  11.         RI = 0;                                //接收完毕,清中断标志
  12.     }                               
  13. }
  14. void main()
  15. {
  16.     TMOD = 0x20;                //将定时器1作为比特率的产生器
  17.     TH1  = 0xFD;                //比特率设置为9600bit/s
  18.     SCON = 0x50;                //串行工作模式为1,允许接收01010000                                  
  19.     EA = 1;                                //开总中断
  20.     ES = 1;                                //开串行中断
  21.     TR1 = 1;                        //启动定时器1
  22.    
  23.         while(1) {
  24.         ;        
  25.     }
  26. }
复制代码


仅供参考
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表