找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 717|回复: 1
收起左侧

单片机数码管显示数字程序 请赐教

[复制链接]
ID:1054848 发表于 2022-12-1 14:34 | 显示全部楼层 |阅读模式
我的C代码和仿真放在RAR中了。请赐教
51hei.png

单片机源程序如下:
  1. #include <reg52.h>
  2. sbit ADDR2 =P1^2;
  3. sbit ADDR1 =P1^1;
  4. sbit ADDR0 =P1^0;
  5. sbit ENLED =P1^4;
  6. sbit ADDR3 =P1^3;

  7. unsigned char code LedChar[16]=        //数码管状态值初始化
  8. {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  9. 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};

  10. void main()
  11. {  
  12.     unsigned int i=0, x;
  13.     unsigned char Second=0;//定义一个一秒之后自增1的变量
  14.     ADDR3=1;//使能三八译码器
  15.     ENLED=0;//
  16.    
  17.     while(1)
  18.     {   
  19.         for(x=0; x<20627; x++)//软件调试得出这个循环耗时1秒
  20.         {
  21.             P0=0xFF;//P0端口状态全部熄灭数码管里的LED达到刷新作用
  22.             switch(i)
  23.             {
  24.                 case 0:
  25.                 ADDR2=0; ADDR1=0; ADDR0=0; P0=LedChar[Second%10];       i++; break;
  26.                 case 1:
  27.                 ADDR2=0; ADDR1=0; ADDR0=1; P0=LedChar[(Second/10)%10];  i++; break;     
  28.                 case 2:
  29.                 ADDR2=0; ADDR1=1; ADDR0=0; P0=LedChar[(Second/100)%10]; i=0; break;  
  30.             }  
  31.         }
  32.         Second++;//一秒之后变量自加1
  33.     }
  34. }
  35. //===========================================================
  36. //C语言网

  37. /*栏目----单片机编程----第四章 数码管*/
  38. //同时显示不同的数字


  39. /*
  40. 在上一讲的代码中几个数码管只能同时显示相同的数字和字母,这一讲我们实现同时3个数码管点亮但每个数码管显示的数字都不一样,所以我们做一个用来显示一个变量一秒后自加1的显示效果。

  41. 例如,此时时间过去了162秒

  42. 数码管2



  43. 1.取余
  44. 先定义一个8位的变量Second,最多能计到255秒,所以我们只用到3个数码管而已,这3个数码管的显示只能显示0~9。

  45. 这里我们首先来了解一下取余。

  46. 162%10=2;

  47. (162/10)%10=6;

  48. (162/100)%10=1;

  49. 大家要知道Second是unsigned char无符号整型变量,比如当Second等于169时,(Second/10)是等于16的,后面的小数直接舍去,就算小数是9也照样舍去,没有四舍五入的说法。

  50. 到这里我们也就不难理解,当Second为162时,分别让3个数码管显示各自的位数,数码管2显示百位数1,数码管1显示十位数6,数码管0显示个位数2。



  51. 2.代码分析
  52. 首先要同时点亮3个数码管就必须让三八译码器的IO0~IO2轮流快速输出低电平,然后在数码管0被点亮的瞬间之后P0被赋值为LedChar[Second%10],这样数码管0就显示了这个变量的个位数。

  53. 然后又到了数码管1被点亮,马上P0被赋值为LedChar[(Second/10)%10],数码管1显示了这个变量的十位数。

  54. 接着就是到了数码管2被点亮,马上P0被赋值为LedChar[(Second/100)%10],数码管2显示了这个变量的百位数。

  55. 大家要有一个意识,那就是随着每次IO0, IO1, IO2输出低电平之后的瞬间,P0都会改变它8个IO端口输出状态以显示不同的数字。



  56. 3.代码
  57. #include <reg52.h>
  58. sbit ADDR2=P1^2;
  59. sbit ADDR1=P1^1;
  60. sbit ADDR0=P1^0;
  61. sbit ENLED=P1^4;
  62. sbit ADDR3=P1^3;

  63. unsigned char code LedChar[16]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};//数码管状态值初始化

  64. void main()
  65. {  
  66.     unsigned int i=0, x;
  67.     unsigned char Second=0;//定义一个一秒之后自增1的变量
  68.     ADDR3=1;//使能三八译码器
  69.     ENLED=0;//
  70.    
  71.     while(1)
  72.     {   
  73.         for(x=0; x<20627; x++)//软件调试得出这个循环耗时1秒
  74.         {
  75.             P0=0xFF;//P0端口状态全部熄灭数码管里的LED达到刷新作用
  76.             switch(i)
  77.             {
  78.                 case 0:
  79.                 ADDR2=0; ADDR1=0; ADDR0=0; P0=LedChar[Second%10];       i++;break;
  80.       
  81.                 case 1:
  82.                 ADDR2=0; ADDR1=0; ADDR0=1; P0=LedChar[(Second/10)%10];  i++;break;     
  83.       
  84.                 case 2:
  85.                 ADDR2=0; ADDR1=1; ADDR0=0; P0=LedChar[(Second/100)%10]; i=0; break;  
  86.             }  
  87.         }
  88.         Second++;//一秒之后变量自加1
  89.     }
  90. }


  91. 4.代码实现原理
  92. 我们知道for循环的持续时间为1秒,我们拆开代码分析就像这样

  93. 第一次for循环执行的内容为

  94. P0=0xFF;
  95. ADDR2=0; ADDR1=0; ADDR0=0; P0=LedChar[Second%10];i++;
  96. 第二次for循环执行的内容为

  97. P0=0xFF;
  98. ADDR2=0; ADDR1=0; ADDR0=1; P0=LedChar[(Second/10)%10];i++;
  99. 第三次for循环执行的内容为

  100. P0=0xFF;
  101. ADDR2=0; ADDR1=1; ADDR0=0; P0=LedChar[(Second/100)%10];i=0;
  102. 一直循环下去,也就达到了三八译码器IO0~IO2轮流快速地切换输出低电平了,也就做到同时点亮的作用,直到for循环持续的时间结束就“Second++;”但这条语句执行地很快于是又重新for循环了,但是Second却改变了数字,LedChar[Second%10]也就不是之前的状态值了。
  103. */
复制代码

仿真.rar

27.92 KB, 下载次数: 6, 下载积分: 黑币 -5

回复

使用道具 举报

ID:262 发表于 2022-12-1 16:56 | 显示全部楼层
程序的注释很详细 感谢您的赐教
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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