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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1686|回復: 6
收起左側

單片機從機檢測溫度并使用rs485發送數據,主機數碼管不顯示的問題

[復制鏈接]
ID:1111674 發表于 2024-3-11 23:09 | 顯示全部樓層 |閱讀模式
新手求解答
1710169592761.png
如圖所示,從機檢測溫度正常并顯示正常,發送時,無論是接收端還是發送端都一樣,但主機接收后,無法轉成正常數字并使用數碼管顯示,我在網上找到不到相關的案例,不知道是哪里出錯了。
發送端代碼
  1. void SendByte(unsigned char dat) {
  2.     RS485_DIR = 1; // 設置為發送模式
  3.     SBUF = dat;
  4.     while(!TI); // 等待發送完成
  5.     TI = 0; // 清除發送中斷標志
  6.     delay_us(10); // 發送一位數據所需的時間,需根據實際波特率調整
  7. }

  8. void SendThreeDigitNumber(unsigned char num) {
  9.     unsigned char digits[3];
  10.     unsigned int i;
  11.     digits[0] = '0' + (num / 100); // 獲得百位數字
  12.     digits[1] = '0' + ((num / 10) % 10); // 獲得十位數字
  13.     digits[2] = '0' + (num % 10); // 獲得個位數字

  14.     for( i = 0; i < 3; ++i) {
  15.         SendByte(digits[i]); // 發送每一位數字
  16.         delay_us(10); // 字節間的間隔時間,根據Modbus RTU協議或其他協議要求調整
  17.     }
  18.    
  19.                 SendByte(' ');//添加校驗位
  20.    
  21.     RS485_DIR = 0; // 設置為接收模式
  22. }

  23. void Serial_Init() {
  24.     TMOD = 0x20; // 設置定時器模式
  25.     TH1=0xfd;  //波特率9600
  26.     TL1=0xfd;
  27.     TR1 = 1; // 開啟定時器   
  28.     SCON = 0x50; // 設置串口模式
  29. }

  30. void main() {
  31.     Serial_Init();
  32.     while(1) {
  33.         unsigned char number = MAX6675_ReadReg(); // 示例數字
  34.         Display(number);

  35.         SendThreeDigitNumber(number); // 發送這個數字

  36.     }
  37. }
復制代碼
接收端代碼
  1. void Serial_Init() {
  2.     TMOD = 0x20;
  3.     TH1 = 0xFD; // 要確保這個波特率設置與發送端一致
  4.     TL1 = 0xFD;
  5.     TR1 = 1;
  6.     SCON = 0x90; // 設置方式2,允許接收(REN=1)
  7.     EA = 1;
  8.     ES = 1;
  9.         
  10. }

  11. void Serial_ISR() interrupt 4
  12. {

  13.     if(RI) {
  14.         RI = 0;
  15.         received_data[digit_index++] = SBUF; // 將接收到的數據存入數組

  16.         // 判斷是否接收到完整的三位數字
  17.         if(digit_index == 3) {
  18.           digit_index = 0;
  19.           tempNum = (received_data[0] - '0')* 100 + (received_data[1] - '0') * 10 + (received_data[2] - '0');
  20.                                         Display(tempNum);
  21.                                         delay_ms(100);//延時一段時間,等待顯示穩定
  22.                                         RS485_DIR = 0;
  23.         }
  24.                         
  25.     }
  26. }

  27. void main() {
  28.      Serial_Init();  
  29.              RS485_DIR = 0;
  30.     while(1)
  31.                 {
  32.       
  33.                         delay_ms(500);//延時一段時間,等待顯示穩定
  34.                 }                        
  35.         }
復制代碼
回復

使用道具 舉報

ID:883242 發表于 2024-3-12 14:42 | 顯示全部樓層
接收端main()里面你都寫了些啥?
回復

使用道具 舉報

ID:1111674 發表于 2024-3-13 00:11 | 顯示全部樓層
Hephaestus 發表于 2024-3-12 14:42
接收端main()里面你都寫了些啥?
  1. void main() {
  2.      Serial_Init();  
  3.              RS485_DIR = 0;
  4.     while(1)
  5.                 {
  6.       
  7.                         delay_ms(500);//延時一段時間,等待顯示穩定
  8.                 }                       
  9.         }
復制代碼
回復

使用道具 舉報

ID:161164 發表于 2024-3-13 09:00 | 顯示全部樓層
Display()函數的代碼呢?
還有,誰教你在中斷里用delay的?
回復

使用道具 舉報

ID:213173 發表于 2024-3-13 15:49 | 顯示全部樓層
本帖最后由 wulin 于 2024-3-14 06:08 編輯
[url=forum.php?mod=redirect&goto=findpost&pid=1194908&ptid=234782][/url]

給你寫一個示例
無標題.jpg

  1. //發送端
  2. #include <reg51.h>
  3. #include <intrins.h>

  4. sbit DIR=P3^7;

  5. typedef unsigned char uchar;
  6. typedef unsigned int uint;
  7. uchar code table[]={
  8.         0x3f,0x06,0x5b,0x4f,
  9.         0x66,0x6d,0x7d,0x07,
  10.         0x7f,0x6f,0x77,0x7c,
  11.         0x39,0x5e,0x79,0x71};
  12. uchar data dis_buf[10];
  13. uint count;//計數
  14. uint sec;//秒
  15. bit flag;//標志

  16. void Timer0_Init(void)                //5毫秒@11.0592MHz
  17. {
  18.         TMOD |= 0x01;                        //設置定時器模式
  19.         TL0 = 0x00;                                //設置定時初始值
  20.         TH0 = 0xEE;                                //設置定時初始值
  21.         TF0 = 0;                                //清除TF0標志
  22.         TR0 = 1;                                //定時器0開始計時
  23.         EA = 1;
  24.         ET0 = 1;
  25. }

  26. void InitUART(void)//9600
  27. {
  28.     TMOD |= 0x20;
  29.     SCON = 0x50;
  30.     TH1 = 0xFD;
  31.     TL1 = 0xFD;
  32.     PCON = 0x00;
  33. //    EA = 1;
  34. //    ES = 1;
  35.     TR1 = 1;
  36. }
  37. void SendOneByte(uchar c)
  38. {
  39.     SBUF = c;
  40.     while(!TI);
  41.     TI = 0;
  42. }

  43. void Display()
  44. {
  45.         static uchar i;
  46.         dis_buf[0]=table[sec/1000%10];
  47.         dis_buf[1]=table[sec/100%10];
  48.         dis_buf[2]=table[sec/10%10];
  49.         dis_buf[3]=table[sec%10];
  50.         P0=0x00;
  51.         P1&=0xc3;
  52.         P1|=~(0x04<<i);
  53.         P0=dis_buf[i];
  54.         i=++i%4;
  55. }

  56. void main()
  57. {
  58.         Timer0_Init();
  59.         InitUART();
  60.         DIR=1;
  61.         while(1)
  62.         {
  63.                 if(flag)
  64.                 {
  65.                         flag=0;

  66.                         Display();
  67.                         if(++count>=200)
  68.                         {
  69.                                 count=0;
  70.                                 if(++sec>9999)sec=0;
  71.                                 SendOneByte(0xff);//數據頭
  72.                                 SendOneByte(sec>>8);//高8位
  73.                                 SendOneByte(sec);//低8位
  74.                         }
  75.                 }
  76.         }
  77. }
  78. void Timer0Interrupt(void) interrupt 1
  79. {
  80.     TH0 = 0xEE;
  81.     TL0 = 0x00;
  82.     flag=1;
  83. }
復制代碼
  1. //接收端
  2. #include <reg51.h>
  3. #include <intrins.h>

  4. sbit DIR=P3^7;

  5. typedef unsigned char uchar;
  6. typedef unsigned int uint;
  7. uchar code table[]={
  8.         0x3f,0x06,0x5b,0x4f,
  9.         0x66,0x6d,0x7d,0x07,
  10.         0x7f,0x6f,0x77,0x7c,
  11.         0x39,0x5e,0x79,0x71};
  12. uchar data dis_buf[4];
  13. uchar data rec_buf[3];

  14. uint count;//計數
  15. uint sec;//秒
  16. bit flag;//標志
  17. bit sign;//標志

  18. void Timer0_Init(void)                //5毫秒@11.0592MHz
  19. {
  20.         TMOD |= 0x01;                        //設置定時器模式
  21.         TL0 = 0x00;                                //設置定時初始值
  22.         TH0 = 0xEE;                                //設置定時初始值
  23.         TF0 = 0;                                //清除TF0標志
  24.         TR0 = 1;                                //定時器0開始計時
  25.         EA = 1;
  26.         ET0 = 1;
  27. }

  28. void InitUART(void)//9600
  29. {
  30.     TMOD |= 0x20;
  31.     SCON = 0x50;
  32.     TH1 = 0xFD;
  33.     TL1 = 0xFD;
  34.     PCON = 0x00;
  35. //  EA = 1;
  36.     ES = 1;
  37.     TR1 = 1;
  38. }
  39. /*
  40. void SendOneByte(uchar c)
  41. {
  42.     SBUF = c;
  43.     while(!TI);
  44.     TI = 0;
  45. }*/

  46. void Display()
  47. {
  48.         static uchar i;
  49.         dis_buf[0]=table[sec/1000%10];
  50.         dis_buf[1]=table[sec/100%10];
  51.         dis_buf[2]=table[sec/10%10];
  52.         dis_buf[3]=table[sec%10];
  53.         P0=0x00;
  54.         P1&=0xc3;
  55.         P1|=~(0x04<<i);
  56.         P0=dis_buf[i];
  57.         i=++i%4;
  58. }

  59. void main()
  60. {
  61.         Timer0_Init();
  62.         InitUART();
  63.         DIR=0;
  64.         while(1)
  65.         {
  66.                 if(flag)
  67.                 {
  68.                         flag=0;
  69.                         Display();
  70.                         if(sign)
  71.                         {
  72.                                 sign=0;
  73.                                 sec=rec_buf[1]<<8|rec_buf[2];
  74.                                 rec_buf[0]=rec_buf[1]=rec_buf[2]=0;
  75.                         }
  76.                 }
  77.         }
  78. }
  79. void Timer0Interrupt(void) interrupt 1
  80. {
  81.     TH0 = 0xEE;
  82.     TL0 = 0x00;
  83.     flag=1;
  84. }

  85. void Serial_ISR() interrupt 4
  86. {
  87.         static uchar i;                    //靜態計數變量
  88.         RI=0;                                        //接收中斷請求標志位清0
  89.         rec_buf[i]=SBUF;                //接收到的數據串保存在緩存數組
  90.         if(rec_buf[0]==0xff)        //驗證數據頭(起始位)
  91.         {
  92.                 i++;
  93.                 if(i>=3)
  94.                 {
  95.                         sign=1;                        //接收完成標志置1
  96.                         i=0;                        //計數變量清0
  97.                 }
  98.         }
  99. }
復制代碼



回復

使用道具 舉報

ID:1111674 發表于 2024-3-13 18:17 | 顯示全部樓層
lkc8210 發表于 2024-3-13 09:00
Display()函數的代碼呢?
還有,誰教你在中斷里用delay的?
  1. int gsmg_code[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

  2. void SMG_DisChar(unsigned char place, unsigned char num)
  3. {
  4.                    switch(place)//位選
  5.                 {
  6.                         case 3: LED1=1;LED2=0;LED3=0;LED4=0;break;
  7.                         case 2: LED1=0;LED2=1;LED3=0;LED4=0;break;
  8.                         case 1: LED1=0;LED2=0;LED3=1;LED4=0;break;
  9.                         case 0: LED1=0;LED2=0;LED3=0;LED4=1;break;
  10.                 }
  11.                 SMG_A_DP_PORT=gsmg_code[num];//傳送段選數據
  12.                 delay_10us(200);//延時一段時間,等待顯示穩定

  13. }

  14. void Display(unsigned int temp)
  15. {
  16.                         SMG_DisChar(3,temp/1000);  //千
  17.                         SMG_DisChar(2,temp%1000/100);//百
  18.                         SMG_DisChar(1,temp%1000%100/10);//十
  19.                   SMG_DisChar(0,temp%1000%100%10);//個
  20. }
復制代碼
回復

使用道具 舉報

ID:1111674 發表于 2024-3-13 18:20 | 顯示全部樓層
lkc8210 發表于 2024-3-13 09:00
Display()函數的代碼呢?
還有,誰教你在中斷里用delay的?

都是自己翻普中的資料文檔的,有什么資料或書籍可以推薦嗎?有時覺得代碼邏輯沒問題,但就是不行,也不確定有什么規則是不清楚的,有些坑進了也不知道錯在哪里。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久免费在线观看 | 日韩在线免费 | 国产不卡一区在线观看 | 二区三区视频 | 日韩毛片免费视频 | 视频一二三区 | 国产亚洲精品久久久久久豆腐 | 激情六月丁香婷婷 | 一区二区视频在线 | 欧美日韩三级 | 国产一区二区免费电影 | 日本一区二区三区免费观看 | 日韩有码一区 | 国产成人高清视频 | 91精品一区 | 欧美aaaaa | 黑人巨大精品欧美一区二区免费 | 成人福利网| 免费观看av网站 | 亚洲欧美中文日韩在线v日本 | 久久不卡区| 成人综合久久 | 精品99爱视频在线观看 | 精品欧美一区二区三区精品久久 | 黄视频网站免费观看 | 国产毛片毛片 | 国产精品一区二区三区在线 | 成人午夜激情 | 中文字幕精品一区二区三区精品 | 欧美一区二区三区精品免费 | 亚洲精品www久久久 www.蜜桃av | 日韩三级在线观看 | 久久久久久久久久久福利观看 | 国产区视频在线观看 | 99re热精品视频国产免费 | 久久精品—区二区三区 | av毛片| 欧美www在线| 久久综合一区 | 中文字幕一区二区三区不卡 | 欧美男人的天堂 |