久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1390|回復: 3
收起左側

大佬看看,單片機的數據傳輸如何做到一致呢?

[復制鏈接]
ID:982620 發表于 2021-12-1 22:50 | 顯示全部樓層 |閱讀模式
大佬幫忙看看,為什么數據從這個單片機傳到另一個單片機上就不再是原來的數了
這個是傳輸數據的代碼:
  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
回復

使用道具 舉報

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 | 顯示全部樓層
無標題.jpg
發送
  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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人a视频片观看免费 | 色呦呦网站 | 国产九九精品视频 | 玖玖在线精品 | 国产精品视频一区二区三区, | 久久久久国产精品人 | 性国产xxxx乳高跟 | 视频一区 亚洲 | 91久久 | 成人在线不卡 | 97精品国产一区二区三区 | 一区二区三区免费 | 国产精品久久久久久久久久妞妞 | 国产麻豆乱码精品一区二区三区 | 中文字幕一区在线观看视频 | 欧美精品在线视频 | 国产美女视频黄 | 在线黄av | 手机av免费在线 | 亚洲欧美在线视频 | 国产精品18久久久久久久 | 亚洲不卡在线视频 | 午夜久久| 亚洲一区二区三区高清 | 国产精品久久久久aaaa九色 | 亚洲成人国产精品 | 欧美一区二区三区在线观看视频 | 成人网在线看 | 亚洲国产精选 | 亚州精品天堂中文字幕 | 香蕉视频一区二区 | 天堂av中文在线 | 天天干狠狠操 | 国产精品视频偷伦精品视频 | 一区二区国产在线观看 | 乱一性一乱一交一视频a∨ 色爱av | 毛片黄片免费看 | 天天天操操操 | 天天干天天爱天天操 | 久久精品成人一区 | 久草视|