9679|9

12

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

关于两个单片机的串口通信问题 [复制链接]

大家好,我是新手,有个问题想请教大家。两个单片机U1(下图左边)和U2(下图右边),都要有收发功能,一个单片机U1根据自己接口的按键,给另一个单片机U2发送控制数据,U2根据收到的数据控制与其相连的的LED亮灭,U2也会根据与自身相连的按键,发送出数据给单片机U1,控制与U1相连数码管的字符显示。下面是代码和原理图,仿真不通过,不知道错在哪里,求高手指导一下。

这里是代码,分别是U1和U2的:
  1. //U1
  2. #include

  3. sbit K1=P1^0;
  4. sbit K2=P1^1;
  5. sbit K3=P1^2;

  6. unsigned char tb;//transmitted byte,所发送的字节
  7. unsigned char rb;//received byte,所接收的字节

  8. void delay(unsigned int i)
  9. {
  10.         unsigned int m,n;
  11.         for(m=i;m>0;m--)
  12.         for(n=125;n>0;n--);
  13. }

  14. void main()
  15. {               
  16.         EA=1;//全局中断开
  17.         ES=1;//串口中断开
  18.         ET1=1;//计时器1中断开
  19.         TMOD=0x20;//计时器1工作方式2
  20.         TH1=0xfd;//波特率9600
  21.         TL1=0xfd;
  22.         SCON=0x50;//串口初始化方式1,REN=1,允许接收
  23.         PCON=0x00;//SMOD=0,波特率不倍增
  24.         TR1=1;//打开计时器1

  25.         //tb=0x00;

  26.         while(1)
  27.         {
  28.                 REN=0;
  29.                 //发送
  30.                 if(K1==0)
  31.                 {
  32.                         delay(50);
  33.                         if(K1==0)
  34.                                 tb=0xfe;
  35.                 }

  36.                 if(K2==0)
  37.                 {
  38.                         delay(50);
  39.                         if(K2==0)
  40.                                 tb=0x7f;
  41.                 }

  42.                 if(K3==0)
  43.                 {
  44.                         delay(50);
  45.                         if(K3==0)
  46.                                 tb=0xff;
  47.                 }
  48.                                        
  49.                 SBUF=tb;
  50.                 while(TI==0);
  51.                 TI=0;
  52.                                 
  53.                 //接收
  54.                 REN=1;
  55.                 rb=SBUF;
  56.                 while(RI==0);
  57.                 RI=0;
  58.                 P2=rb;
  59.                 REN=0;               
  60.         }                                
  61. }
复制代码
这个是U2的:
  1. //U2
  2. #include

  3. //定义共阴极七段码管的数字0~F,以及小数点、空白、全显示
  4. #define SEG0 0x3f
  5. #define SEG1 0x06
  6. #define SEG2 0x5b
  7. #define SEG3 0x4f
  8. #define SEG4 0x66
  9. #define SEG5 0x6d
  10. #define SEG6 0x7d
  11. #define SEG7 0x07
  12. #define SEG8 0x7f
  13. #define SEG9 0x6f
  14. unsigned char digits[]={SEG0,SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8,SEG9};

  15. sbit K4=P1^0;

  16. unsigned char tb;
  17. unsigned char rb;

  18. void main()
  19. {        
  20.         EA=1;//全局中断开
  21.         ES=1;//串口中断开
  22.         ET1=1;//计时器1中断开
  23.         TMOD=0x20;//计时器1工作方式2
  24.         TH1=0xfd;//波特率9600
  25.         TL1=0xfd;
  26.         SCON=0x50;//串口初始化方式1,接收REN=1
  27.         PCON=0x00;//SMOD=0,波特率不倍增
  28.         TR1=1;//打开计时器1
  29.         P2=0xff;
  30.         rb=0;
  31.         while(1)
  32.         {               
  33.                 //REN=0;
  34.                
  35.                 //发送
  36.                                 
  37.                 if(K4==0)
  38.                 {        
  39.                         delay(50);
  40.                         if(K4==0)
  41.                         {
  42.                                 tb=(tb+1)%10;
  43.                                 tb=digits[tb];                        
  44.                                 SBUF=tb;
  45.                                 while(TI==0);
  46.                                 TI=0;
  47.                         }
  48.                 }
  49.                
  50.                 //接收
  51.                 REN=1;
  52.                 rb=SBUF;
  53.                 while(RI==0);
  54.                 RI=0;
  55.                 P2=rb;
  56.                 REN=0;
  57.         }        
  58. }
复制代码

[ 本帖最后由 cdinten 于 2013-11-26 19:01 编辑 ]
此帖出自51单片机论坛

最新回复

两个结合到一起就行了 主机从机都用 #include #define uchar unsigned char #define uint unsigned int #define duan P1 #define dis  P2 void main() {         uchar key_in=0xff;  //I/O口作输入时,检测外设状态,允许输出高电平         TMOD=0x20;           //设置为定时器1方式2         TH1=0xfd;                 //装初值,波特率设为9600         TL1=0Xfd;         EA=1;                         //开总中断         ET1=1;                         //允许定时器1中断         TR1=1;                         //开启定时器1中断         SCON=0x50;                 //串口控制寄存器设置,方式1、开串口接收。SM0=0;SM1=1;REN=1;         ES=1;                         //开串口中断         while(1)         {                                  if(key_in != duan)                 {                         key_in=duan;                         SBUF=key_in;           //发送数据                         while(!TI);            //等待数据发送,由TI判断发送是否结束                         TI=0;                 }                } } void chuankou() interrupt 4        //串口中断函数 {         dis=SBUF;                           //接收数据         RI=0;                              //RI由软件清零; }  详情 回复 发表于 2013-11-26 21:45

点评

什么叫代码中显示不出来? 两个显示没有用延时子函数吧 单片机的串口通信有三条线 “RXD TXD GND ” 两个单片机的GND也要连在一起 为什么没有等待按键弹起的语句 定时器1开中断貌似没用啊 我就大概看了一下吧  详情 回复 发表于 2013-11-26 19:41
点赞 关注(1)
 

回复
举报

12

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
头文件包含是正确的,不知道为什么代码中显示不出来~~
此帖出自51单片机论坛
 
 
 

回复

3

帖子

1

TA的资源

一粒金砂(中级)

板凳
 

回复 楼主cdinten 的帖子

什么叫代码中显示不出来?
两个显示没有用延时子函数吧
单片机的串口通信有三条线 “RXD TXD GND ”  两个单片机的GND也要连在一起 为什么没有等待按键弹起的语句 定时器1开中断貌似没用啊
我就大概看了一下吧 我也是刚学的  大家一起讨论讨论
此帖出自51单片机论坛

点评

那个代码中显示不出来,说的是我在帖子中贴出的代码,include后面的头文件包含莫名其妙地没有显示出来,不是仿真的时候数码管没有显示。另外,我的数码管是共阴的,接线不会有问题。你所说的共地问题在实际连接线路  详情 回复 发表于 2013-11-26 21:38
定时器1 是产生波特率用的  详情 回复 发表于 2013-11-26 21:16
 
 
 

回复

503

帖子

1

TA的资源

纯净的硅(初级)

4
 
由于单片机速度快   仿真以后两个单片机都进入了while(RI==0);中 形成了死循环    在按键子也就不起作用了(出了复位的)   数码管不显示可能是共阴共阳的选错了   
数码管的数组直接写到数组里就行       实际中就像楼上说的的共地  仿真估计就默认了

下面的是只是主机发送数据到从机的
  1. #include   主机
  2. #define duan P1
  3. void main()
  4. {
  5.         unsigned char i;
  6.         unsigned char key=0xff;
  7.         dis=0x00;
  8.         duan=0xff;
  9.         TMOD=0x20;
  10.         TH1=0xfd;
  11.         TL0=0xfd;
  12.         EA=1;
  13.         TR1=1;
  14.         SCON=0x50;
  15.         PCON=0x00;
  16.         ES=1;
  17.         while(1)
  18.         {

  19.                 if(key!=duan)
  20.                 {
  21.                         key=duan;
  22.                         SBUF=key;
  23.                         while(!TI);
  24.                         TI=0;
  25.                 }
  26.                           
  27.         }
  28. }
复制代码
  1. #include//从机
  2. sbit leden=P1^2;
  3. sbit wei=P1^1;
  4. sbit line=P1^3;
  5. sbit lcd_en=P1^7;
  6. void main()
  7. {
  8.         unsigned int i;
  9.         lcd_en=0;
  10.         P0=0X00;
  11.         line=0;
  12.         P0=0xff;
  13.         wei=0;
  14.         leden=1;
  15.         P2=0XF0;
  16.         TMOD=0x20;
  17.         TH1=0xfd;
  18.         TL1=0xfd;
  19.         EA=1;
  20.         ET1=1;
  21.         TR1=1;
  22.         SCON=0x50;
  23.         ES=1;
  24.         while(1)
  25.         {
  26.      
  27.            for(i=6553;i>0;i--);               
  28.         }
  29. }
  30. void chuankou() interrupt 4
  31. {
  32.         P2=SBUF;
  33.         RI=0;
  34. }
复制代码
此帖出自51单片机论坛

点评

你给的演示代码我知道,但是只能从U1发送给U2,要求是U2也能给U1相互发送消息,不知道如何处理。  详情 回复 发表于 2013-11-26 21:34
 
 
 

回复

503

帖子

1

TA的资源

纯净的硅(初级)

5
 

回复 板凳zhudabin 的帖子

定时器1 是产生波特率用的
此帖出自51单片机论坛
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

6
 

回复 4楼ddlxiaoxu 的帖子

你给的演示代码我知道,但是只能从U1发送给U2,要求是U2也能给U1相互发送消息,不知道如何处理。
此帖出自51单片机论坛

点评

两个结合到一起就行了 主机从机都用 #include #define uchar unsigned char #define uint unsigned int #define duan P1 #define dis P2 void main() { uchar key_in=0xff; //I/O口作输入时,检测外设状  详情 回复 发表于 2013-11-26 21:45
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 板凳zhudabin 的帖子

那个代码中显示不出来,说的是我在帖子中贴出的代码,include后面的头文件包含莫名其妙地没有显示出来,不是仿真的时候数码管没有显示。另外,我的数码管是共阴的,接线不会有问题。你所说的共地问题在实际连接线路的时候确实要连在一起,但是在protues中可以分开连接。
此帖出自51单片机论坛
 
 
 

回复

503

帖子

1

TA的资源

纯净的硅(初级)

8
 

回复 6楼cdinten 的帖子

两个结合到一起就行了
主机从机都用
#include
#define uchar unsigned char
#define uint unsigned int
#define duan P1
#define dis  P2
void main()
{
        uchar key_in=0xff;  //I/O口作输入时,检测外设状态,允许输出高电平
        TMOD=0x20;           //设置为定时器1方式2
        TH1=0xfd;                 //装初值,波特率设为9600
        TL1=0Xfd;
        EA=1;                         //开总中断
        ET1=1;                         //允许定时器1中断
        TR1=1;                         //开启定时器1中断
        SCON=0x50;                 //串口控制寄存器设置,方式1、开串口接收。SM0=0;SM1=1;REN=1;
        ES=1;                         //开串口中断

        while(1)
        {               
                  if(key_in != duan)
                {
                        key_in=duan;
                        SBUF=key_in;           //发送数据
                        while(!TI);            //等待数据发送,由TI判断发送是否结束
                        TI=0;
                }       
        }
}
void chuankou() interrupt 4        //串口中断函数
{
        dis=SBUF;                           //接收数据
        RI=0;                              //RI由软件清零;
}
此帖出自51单片机论坛

点评

谢谢,确实需要这样操作,一开始我也是想的用中断,但是我在中断中还去用while(RI==0);这样的语句去等待,估计是这里死循环了。现在测试没问题了,接下来是按键消抖的问题了,太感谢你了。  详情 回复 发表于 2013-11-26 21:56
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

9
 

回复 8楼ddlxiaoxu 的帖子

谢谢,确实需要这样操作,一开始我也是想的用中断,但是我在中断中还去用while(RI==0);这样的语句去等待,估计是这里死循环了。现在测试没问题了,接下来是按键消抖的问题了,太感谢你了。
此帖出自51单片机论坛
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

10
 

居然十年了

此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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