找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2080|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

51單片機的數(shù)碼管顯示程序調(diào)試的一些問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:907979 發(fā)表于 2021-4-18 20:08 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
這是關(guān)于串口通信的一個演示程序,功能是通過計算機發(fā)送數(shù)到單片機以數(shù)碼管范圍是(0-65535)的形式顯示,在演示過程中發(fā)現(xiàn)一到
32767也就是發(fā)送7fff之后的數(shù)據(jù)時數(shù)碼管亂碼


這是7fff數(shù)據(jù)的調(diào)試變量表


這是0x8000的


單片機源程序如下:
  1. #include <reg52.h>

  2. #define uchar unsigned char;
  3. #define uint  unsigned int ;
  4. uint sw,w,q,bai,shi,ge,num1,num2,aa,num;

  5. //定義數(shù)組存儲數(shù)碼管碼值
  6. uchar code table[]={
  7.         0x3f,0x06,0x5b,0x4f,
  8.         0x66,0x6d,0x7d,0x07,
  9.         0x7f,0x6f};
  10. uint arr[]={0,0,0};

  11. //配置管腳
  12. sbit dul=P2^6;
  13. sbit wel=P2^7;

  14. void UART_Init();
  15. void display();
  16.       
  17. //定義延時函數(shù)
  18. void delay(unsigned int x)
  19. {
  20.         unsigned int a;
  21.         unsigned int b;
  22.         for(a=0;a<x;a++)
  23.         {
  24.                 for(b=0;b<110;b++)
  25.                 {
  26.                 }
  27.         }
  28. }
  29.       

  30. void main()
  31. {
  32.         UART_Init();
  33.         while(1)
  34.         {
  35.                 display();
  36.         }
  37. }


  38. void UART_Init()
  39. {
  40.         TMOD=0x20;  //定時器1設(shè)置位 8位自動重載計數(shù)器
  41.         TH1 =0xfd;  //設(shè)置波特率為9600
  42.         TL1 =0xfd;
  43.         SM0 = 0;
  44.         SM1 = 1; //串口工作方式1,為10位數(shù)據(jù)異步收發(fā)器
  45.         REN = 1;//允許接收
  46.         EA = 1;
  47.         ES = 1;  //把串口中斷打開
  48.         TR1= 1;
  49.         aa=0;
  50. }

  51. void UART() interrupt 4
  52. {
  53.         aa++;
  54.         arr[aa]=SBUF;
  55.         RI=0;
  56.         if(aa==2)
  57.         {
  58.                 num=arr[1]*256+arr[2];      
  59.                 sw=num/100000;
  60.                 w=num/10000%10;
  61.                 q=num/1000%10;
  62.                 bai=num/100%10;
  63.                 shi=num/10%10;
  64.                 ge =num%10;
  65.                 aa=0;
  66.         }
  67. }


  68. void display()
  69. {
  70.         wel=1;
  71.         P0=0xfe;
  72.         wel=0;
  73.       
  74.         dul=1;
  75.         P0=table[sw];
  76.         dul=0;
  77.         delay(1);
  78.         P0=0xff;
  79.       
  80.         wel=1;
  81.         P0=0xfd;
  82.         wel=0;
  83.       
  84.         dul=1;
  85.         P0=table[w];
  86.         dul=0;
  87.         delay(1);
  88.         P0=0xff;
  89.       
  90.         wel=1;
  91.         P0=0xfb;
  92.         wel=0;
  93.       
  94.         dul=1;
  95.         P0=table[q];
  96.         dul=0;
  97.         delay(1);
  98.         P0=0xff;
  99.       
  100.         wel=1;
  101.         P0=0xf7;
  102.         wel=0;
  103.       
  104.         dul=1;
  105.         P0=table[bai];
  106.         dul=0;
  107.         delay(5);
  108.         P0=0xff;
  109.       
  110.         wel=1;
  111.         P0=0xef;
  112.         wel=0;
  113.       
  114.         dul=1;
  115.         P0=table[shi];
  116.         dul=0;
  117.         delay(1);
  118.         P0=0xff;
  119.       
  120.         wel=1;
  121.         P0=0xDf;
  122.         wel=0;
  123.       
  124.         dul=1;
  125.         P0=table[ge];
  126.         dul=0;
  127.         delay(1);
  128.         P0=0xff;
  129. }
復(fù)制代碼

我num數(shù)據(jù)類型定義位unsigned int型應(yīng)該沒有溢出啊我實在搞不懂所以請教一下各位哥到底哪出問題了

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:907979 發(fā)表于 2021-4-18 22:27 | 只看該作者
有點懵了
回復(fù)

使用道具 舉報

板凳
ID:814525 發(fā)表于 2021-4-18 23:16 | 只看該作者
#define uchar unsigned char;
#define uint  unsigned int ;
宏定義錯誤,后面;號去掉。
回復(fù)

使用道具 舉報

地板
ID:213173 發(fā)表于 2021-4-19 07:50 | 只看該作者

數(shù)據(jù)類型使用不當會發(fā)生錯誤,給你改了,仔細對比就知道哪里錯。
  1. #include <reg52.h>

  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. uchar aa,bb;
  5. uint  num;

  6. //定義數(shù)組存儲數(shù)碼管碼值
  7. uchar code table[]={
  8.         0x3f,0x06,0x5b,0x4f,
  9.         0x66,0x6d,0x7d,0x07,
  10.         0x7f,0x6f};
  11. uchar arr[2];

  12. //配置管腳
  13. sbit dul=P2^6;
  14. sbit wel=P2^7;

  15. void delay(uint x);
  16. void UART_Init();
  17. void display();
  18.       
  19. //定義延時函數(shù)
  20. void delay(uint x)
  21. {
  22.         uint a,b;
  23.         for(a=0;a<x;a++)
  24.                 for(b=0;b<110;b++);
  25. }
  26.       
  27. void main()
  28. {
  29.         UART_Init();
  30.         while(1)
  31.         {
  32.                 display();
  33.         }
  34. }

  35. void UART_Init()
  36. {
  37.         TMOD=0x20;  //定時器1設(shè)置位 8位自動重載計數(shù)器
  38.         TH1 =0xfd;  //設(shè)置波特率為9600
  39.         TL1 =0xfd;
  40.         SM0 = 0;
  41.         SM1 = 1; //串口工作方式1,為10位數(shù)據(jù)異步收發(fā)器
  42.         REN = 1;//允許接收
  43.         EA = 1;
  44.         ES = 1;  //把串口中斷打開
  45.         TR1= 1;
  46.         aa=0;
  47. }

  48. void UART() interrupt 4
  49. {
  50.         RI=0;
  51.         arr[aa]=SBUF;       
  52.         aa++;
  53.         if(aa==2)
  54.         {
  55.                 aa=0;
  56.                 num=arr[0]<<8|arr[1];      
  57.         }
  58. }

  59. void display()
  60. {
  61.         P0=0x00;//段消隱
  62.         dul=1;
  63.         dul=0;
  64.         switch(bb)
  65.         {               
  66.                 case 0:
  67.                 P0=0xfe;
  68.                 wel=1;       
  69.                 wel=0;
  70.                 P0=table[0];
  71.                 dul=1;
  72.                 dul=0;
  73.                 break;
  74.        
  75.                 case 1:
  76.                 P0=0xfd;
  77.                 wel=1;
  78.                 wel=0;
  79.                 P0=table[num/10000%10];
  80.                 dul=1;
  81.                 dul=0;
  82.                 break;
  83.        
  84.                 case 2:
  85.                 P0=0xfb;
  86.                 wel=1;
  87.                 wel=0;
  88.                 P0=table[num/1000%10];
  89.                 dul=1;
  90.                 dul=0;
  91.                 break;

  92.                 case 3:       
  93.                 P0=0xf7;
  94.                 wel=1;
  95.                 wel=0;
  96.                 P0=table[num/100%10];
  97.                 dul=1;
  98.                 dul=0;
  99.                 break;
  100.        
  101.                 case 4:
  102.                 P0=0xef;
  103.                 wel=1;
  104.                 wel=0;
  105.                 P0=table[num/10%10];
  106.                 dul=1;
  107.                 dul=0;
  108.                 break;
  109.        
  110.                 case 5:
  111.                 P0=0xdf;
  112.                 wel=1;
  113.                 wel=0;
  114.                 P0=table[num%10];
  115.                 dul=1;
  116.                 dul=0;
  117.                 break;
  118.         }
  119.         delay(1);
  120.         bb++;
  121.         if(bb==6)
  122.                 bb=0;
  123. }
復(fù)制代碼
回復(fù)

使用道具 舉報

5#
ID:907979 發(fā)表于 2021-4-19 14:26 | 只看該作者
wulin 發(fā)表于 2021-4-19 07:50
數(shù)據(jù)類型使用不當會發(fā)生錯誤,給你改了,仔細對比就知道哪里錯。

謝謝哥,我這就對比調(diào)試一下
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表