找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1680|回复: 4
收起左侧

51单片机的数码管显示程序调试的一些问题

[复制链接]
ID:907979 发表于 2021-4-18 20:08 | 显示全部楼层 |阅读模式
这是关于串口通信的一个演示程序,功能是通过计算机发送数到单片机以数码管范围是(0-65535)的形式显示,在演示过程中发现一到
32767也就是发送7fff之后的数据时数码管乱码


这是7fff数据的调试变量表
1.png

这是0x8000的
2.png

单片机源程序如下:
  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. //定义数组存储数码管码值
  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. //定义延时函数
  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设置位 8位自动重载计数器
  41.         TH1 =0xfd;  //设置波特率为9600
  42.         TL1 =0xfd;
  43.         SM0 = 0;
  44.         SM1 = 1; //串口工作方式1,为10位数据异步收发器
  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. }
复制代码

我num数据类型定义位unsigned int型应该没有溢出啊我实在搞不懂所以请教一下各位哥到底哪出问题了

回复

使用道具 举报

ID:907979 发表于 2021-4-18 22:27 | 显示全部楼层
有点懵了
回复

使用道具 举报

ID:814525 发表于 2021-4-18 23:16 | 显示全部楼层
#define uchar unsigned char;
#define uint  unsigned int ;
宏定义错误,后面;号去掉。
回复

使用道具 举报

ID:213173 发表于 2021-4-19 07:50 | 显示全部楼层

数据类型使用不当会发生错误,给你改了,仔细对比就知道哪里错。
  1. #include <reg52.h>

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

  6. //定义数组存储数码管码值
  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. //定义延时函数
  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设置位 8位自动重载计数器
  38.         TH1 =0xfd;  //设置波特率为9600
  39.         TL1 =0xfd;
  40.         SM0 = 0;
  41.         SM1 = 1; //串口工作方式1,为10位数据异步收发器
  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. }
复制代码
回复

使用道具 举报

ID:907979 发表于 2021-4-19 14:26 | 显示全部楼层
wulin 发表于 2021-4-19 07:50
数据类型使用不当会发生错误,给你改了,仔细对比就知道哪里错。

谢谢哥,我这就对比调试一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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