关于两个单片机的串口通信问题

2019-03-24 18:34发布

大家好,我是新手,有个问题想请教大家。两个单片机U1(下图左边)和U2(下图右边),都要有收发功能,一个单片机U1根据自己接口的按键,给另一个单片机U2发送控制数据,U2根据收到的数据控制与其相连的的LED亮灭,U2也会根据与自身相连的按键,发送出数据给单片机U1,控制与U1相连数码管的字符显示。下面是代码和原理图,仿真不通过,不知道错在哪里,求高手指导一下。
194437ox7am2nnc0ntnc1v.png.thumb.jpg.png
这里是代码,分别是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 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
ddlxiaoxu
1楼-- · 2019-03-25 16:36
两个结合到一起就行了
主机从机都用
#include<reg51.h>
#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由软件清零;
}
cdinten
2楼-- · 2019-03-25 21:16
谢谢,确实需要这样操作,一开始我也是想的用中断,但是我在中断中还去用while(RI==0);这样的语句去等待,估计是这里死循环了。现在测试没问题了,接下来是按键消抖的问题了,太感谢你了。

一周热门 更多>