找回密码
 立即注册

QQ登录

只需一步,快速开始

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

大佬看看,单片机的数据传输如何做到一致呢?

[复制链接]
跳转到指定楼层
楼主
大佬帮忙看看,为什么数据从这个单片机传到另一个单片机上就不再是原来的数了
这个是传输数据的代码:
  1. #include <reg51.h>

  2. #define DPIO_DIG P0
  3. #define DPIO_PLACE P2

  4. sbit key1=P1^0;
  5. sbit key2=P1^1;
  6. sbit key3=P1^2;
  7. sbit key4=P1^3;

  8. unsigned char  code LED[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0x39,0xff};//共阳极数码管显示的从0~c,即段码,最后一个表示全灭
  9. unsigned char  LEDBuf[]={8,8,8,8};//数据显示缓冲区
  10. unsigned char  code PLACE_CODE[]={0x01,0x02,0x04,0x08};//存放位选的数组,同时放在rom存储器
  11. unsigned char KeyNum=0;
  12. unsigned int  Numcon=0;

  13. void DelayXms(unsigned int t)
  14. {
  15.         unsigned int i,j;
  16.         for(i=t;i>0;i--)
  17.                 for(j=120;j>0;j--);
  18. }

  19. void Key_Scan()
  20. {
  21.         static unsigned char i;
  22.         static bit sign=0;
  23.         if(!key1||!key2||!key3||!key4)
  24.         {      
  25.                 if(++i>=10 && sign==0)
  26.                 {
  27.                         sign=1;
  28.                         if(!key1)KeyNum=1;
  29.                         if(!key2)KeyNum=2;
  30.                         if(!key3)KeyNum=3;
  31.                         if(!key4)KeyNum=4;
  32.                 }
  33.         }
  34.         else
  35.         {
  36.                 i=0;
  37.                 sign=0;
  38.         }
  39. }

  40. void Disply()
  41. {
  42.         static unsigned char i;
  43.         DPIO_DIG=0xff;//消隐      
  44.         DPIO_PLACE=PLACE_CODE[i];//送位选      
  45.         DPIO_DIG =LEDBuf[i];//送段码
  46.         i=++i%4;
  47. }
  48. void main()
  49. {
  50. PCON &= 0x7F;                //波特率不倍速
  51.         SCON = 0x50;                //8位数据,可变波特率
  52.         TMOD &= 0x0F;                //清除定时器1模式位
  53.         TMOD |= 0x20;                //设定定时器1为8位自动重装方式
  54.         TL1 = 0xFD;                //设定定时初值
  55.         TH1 = 0xFD;                //设定定时器重装值
  56.         ET1 = 0;                //禁止定时器1中断
  57.         TR1 = 1;                //启动定时器1
  58.         while(1)
  59.         {
  60.                 Key_Scan();
  61.                 switch(KeyNum)
  62.                 {
  63.                         case 1 :if(Numcon<9999)Numcon++;KeyNum=0;break;
  64.                         case 2 :if(Numcon>0)Numcon--;KeyNum=0;break;
  65.                         case 3 :Numcon=0;KeyNum=0;break;
  66.                         case 4 :Numcon=88;KeyNum=0;break;
  67.                 }
  68.                 LEDBuf[0]=LED[Numcon/1000%10];
  69.                 LEDBuf[1]=LED[Numcon/100%10];
  70.                 LEDBuf[2]=LED[Numcon/10%10];
  71.                 LEDBuf[3]=LED[Numcon%10];
  72.                 Disply();
  73.                 DelayXms(1);
  74.                                                                 Disply();
  75.                 SBUF=Numcon;
  76.                 while(TI==0);
  77.                 TI=0;
  78.         }
  79. }
复制代码

这个是接收数据的代码:
  1. # include <reg51.h>
  2. #define DPIO_DIG P0
  3. #define DPIO_PLACE P2


  4. unsigned char  code LED[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0x39,0xff};//共阳极数码管显示的从0~c,即段码,最后一个表示全灭
  5. unsigned char  LEDBuf[]={8,8,8,8};//数据显示缓冲区
  6. unsigned char  code PLACE_CODE[]={0x01,0x02,0x04,0x08};//存放位选的数组,同时放在rom存储器


  7. void DelayXms(unsigned int t)
  8. {
  9.         unsigned int i,j;
  10.         for(i=t;i>0;i--)
  11.                 for(j=120;j>0;j--);
  12. }

  13. void Disply()
  14. {
  15.         static unsigned char i;
  16.         DPIO_DIG=0xff;//消隐      
  17.         DPIO_PLACE=PLACE_CODE[i];//送位选      
  18.         DPIO_DIG =LEDBuf[i];//送段码
  19.         i=++i%4;
  20. }
  21. void main()
  22. {
  23. unsigned int  Numcon=0;
  24. PCON &= 0x7F;                //波特率不倍速
  25.         SCON = 0x50;                //8位数据,可变波特率
  26.         TMOD &= 0x0F;                //清除定时器1模式位
  27.         TMOD |= 0x20;                //设定定时器1为8位自动重装方式
  28.         TL1 = 0xFD;                //设定定时初值
  29.         TH1 = 0xFD;                //设定定时器重装值
  30.         ET1 = 0;                //禁止定时器1中断
  31.         TR1 = 1;                //启动定时器1

  32.         
  33.    while(1)
  34.   {
  35.                
  36.                 while(RI==0);
  37.                 RI=0;
  38.                 Numcon=SBUF;
  39.                 LEDBuf[0]=Numcon/1000;
  40.           LEDBuf[1]=Numcon/100%10;
  41.           LEDBuf[2]=Numcon/10%10;
  42.                 LEDBuf[3]=Numcon%10;
  43.                 Disply();
  44.                
  45.   }
  46.         
  47. }
复制代码


下面这个是仿真图,我想要的是数码管显示一致,但是不知道哪里的问题,拜托了。

51hei图片20211201224750.png (71.79 KB, 下载次数: 39)

51hei图片20211201224750.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:624769 发表于 2021-12-1 23:33 | 只看该作者
Numcon 是 2个字节
SBUF 是 1个字节,你觉得 能行么?

发送这边的问题也就不提了, 接收这边, 你一个中断都不开的,你想正常完成 串口接收,LED动态扫描?
串口通讯这块没搞明白,
LED动态扫描也没搞明白,
就连最基础的 字节长度  也没有概念,
你就已经打算开始玩双机同步了?
步子是不是跨的有点大了?
回复

使用道具 举报

板凳
ID:982620 发表于 2021-12-1 23:38 | 只看该作者
188610329 发表于 2021-12-1 23:33
Numcon 是 2个字节
SBUF 是 1个字节,你觉得 能行么?

那把numcon改成temp,可以吗
回复

使用道具 举报

地板
ID:213173 发表于 2021-12-2 06:24 | 只看该作者

发送
  1. #include <reg51.h>

  2. #define DPIO_DIG P0
  3. #define DPIO_PLACE P2

  4. sbit key1=P1^0;
  5. sbit key2=P1^1;
  6. sbit key3=P1^2;
  7. sbit key4=P1^3;

  8. unsigned char  code LED[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0x39,0xff};//共阳极数码管显示的从0~c,即段码,最后一个表示全灭
  9. unsigned char  LEDBuf[]={0xc0,0xc0,0xc0,0xc0};//数据显示缓冲区
  10. unsigned char  code PLACE_CODE[]={0x01,0x02,0x04,0x08};//存放位选的数组,同时放在rom存储器

  11. unsigned char KeyNum=0;
  12. unsigned int  Numcon=0,num=0;
  13. bit flag=0;

  14. void DelayXms(unsigned int t)
  15. {
  16.         unsigned int i,j;
  17.         for(i=t;i>0;i--)
  18.                 for(j=120;j>0;j--);
  19. }

  20. void Key_Scan()
  21. {
  22.         static unsigned char i;
  23.         static bit sign=0;
  24.         if(!key1||!key2||!key3||!key4)
  25.         {      
  26.                 if(++i>=10 && sign==0)
  27.                 {
  28.                         sign=1;
  29.                         if(!key1)KeyNum=1;
  30.                         if(!key2)KeyNum=2;
  31.                         if(!key3)KeyNum=3;
  32.                         if(!key4)KeyNum=4;
  33.                 }
  34.         }
  35.         else
  36.         {
  37.                 i=0;
  38.                 sign=0;
  39.         }       
  40. }
  41. /*----------------------------
  42. 串口发送一个字节数据
  43. ----------------------------*/
  44. void SendData(unsigned char dat)
  45. {
  46.         SBUF = dat;
  47.         while(!TI);
  48.         TI = 0;
  49. }

  50. void Disply()
  51. {
  52.         static unsigned char i;
  53.         DPIO_DIG=0xff;//消隐      
  54.         DPIO_PLACE=PLACE_CODE[i];//送位选      
  55.         DPIO_DIG =LEDBuf[i];//送段码
  56.         i=++i%4;
  57. }

  58. void main()
  59. {
  60.         PCON &= 0x7F;                //波特率不倍速
  61.         SCON = 0x50;                //8位数据,可变波特率
  62.         TMOD &= 0x0F;                //清除定时器1模式位
  63.         TMOD |= 0x20;                //设定定时器1为8位自动重装方式
  64.         TL1 = 0xFD;                //设定定时初值
  65.         TH1 = 0xFD;                //设定定时器重装值
  66.         ET1 = 0;                //禁止定时器1中断
  67.         TR1 = 1;                //启动定时器1
  68.         while(1)
  69.         {
  70.                 Key_Scan();
  71.                 switch(KeyNum)
  72.                 {
  73.                         case 1 :if(Numcon<9999)Numcon++;KeyNum=0;break;
  74.                         case 2 :if(Numcon>0)Numcon--;KeyNum=0;break;
  75.                         case 3 :Numcon=0;KeyNum=0;break;
  76.                         case 4 :Numcon=88;KeyNum=0;break;
  77.                 }
  78.                 if(Numcon!=num)//数据有变化
  79.                 {
  80.                         num=Numcon;
  81.                         LEDBuf[0]=LED[num/1000%10];
  82.                         LEDBuf[1]=LED[num/100%10];
  83.                         LEDBuf[2]=LED[num/10%10];
  84.                         LEDBuf[3]=LED[num%10];
  85.                         SendData(0xaa);//数据头
  86.                         SendData(num>>8);//高8位
  87.                         SendData(num);//低8位
  88.                 }
  89.                 Disply();
  90.                 DelayXms(1);
  91.         }
  92. }
复制代码
接收
  1. #include <reg51.h>
  2. #define DPIO_DIG P0
  3. #define DPIO_PLACE P2

  4. unsigned char  code LED[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0x39,0xff};//共阳极数码管显示的从0~c,即段码,最后一个表示全灭
  5. unsigned char  LEDBuf[]={0xc0,0xc0,0xc0,0xc0};//数据显示缓冲区
  6. unsigned char  code PLACE_CODE[]={0x01,0x02,0x04,0x08};//存放位选的数组,同时放在rom存储器
  7. unsigned char  rec_buf[3];
  8. bit flag=0;
  9. void DelayXms(unsigned int t)
  10. {
  11.         unsigned int i,j;
  12.         for(i=t;i>0;i--)
  13.                 for(j=120;j>0;j--);
  14. }

  15. void Disply()
  16. {
  17.         static unsigned char i;
  18.         DPIO_DIG=0xff;//消隐      
  19.         DPIO_PLACE=PLACE_CODE[i];//送位选      
  20.         DPIO_DIG =LEDBuf[i];//送段码
  21.         i=++i%4;
  22. }
  23. void main()
  24. {
  25.         unsigned int  Numcon=0;
  26.         PCON &= 0x7F;                //波特率不倍速
  27.         SCON = 0x50;                //8位数据,可变波特率
  28.         TMOD &= 0x0F;                //清除定时器1模式位
  29.         TMOD |= 0x20;                //设定定时器1为8位自动重装方式
  30.         TL1 = 0xFD;                //设定定时初值
  31.         TH1 = 0xFD;                //设定定时器重装值
  32.         ET1 = 0;                //禁止定时器1中断
  33.         TR1 = 1;                //启动定时器1
  34.         EA=1;        //总中断开
  35.         ES=1;        //串口中断开
  36.         while(1)
  37.         {
  38.                 if(flag)
  39.                 {
  40.                         flag=0;
  41.                         if(rec_buf[0]==0xaa)//数据验证、解析
  42.                         {
  43.                                 rec_buf[0]=0x00;
  44.                                 Numcon=rec_buf[1]<<8|rec_buf[2];
  45.                                 LEDBuf[0]=LED[Numcon/1000%10];
  46.                                 LEDBuf[1]=LED[Numcon/100%10];
  47.                                 LEDBuf[2]=LED[Numcon/10%10];
  48.                                 LEDBuf[3]=LED[Numcon%10];
  49.                         }
  50.                         else//错误
  51.                         {
  52.                                 LEDBuf[0]=0xbf;//'-'
  53.                                 LEDBuf[1]=0xbf;
  54.                                 LEDBuf[2]=0xbf;
  55.                                 LEDBuf[3]=0xbf;
  56.                         }
  57.                 }
  58.                 Disply();
  59.                 DelayXms(1);
  60.         }        
  61. }

  62. void UARTInterrupt() interrupt 4
  63. {
  64.         static unsigned char i;
  65.         RI=0;                                                //接收中断请求标志位清0
  66.         rec_buf[i]=SBUF;                //保存SBUF接收到的数据
  67.         if(rec_buf[0]==0xaa)        //验证数据头
  68.         {
  69.                 i++;
  70.                 if(i>=3)
  71.                 {
  72.                         i=0;
  73.                         flag=1;                        //数据串接收完成标志置1
  74.                 }
  75.         }
  76. }
复制代码




回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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