找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3790|回复: 6
打印 上一主题 下一主题
收起左侧

详细注释的单片机4位8段共阳数码管动态显示固定数字0123程序

[复制链接]
跳转到指定楼层
楼主
ID:99130 发表于 2022-4-2 10:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
4位8段共阳数码管动态显示固定数字0123
下面是我根据程序做的注释,如有错误之处请指正!
单片机源程序如下(每一行都有详细的注释):
  1. /*      4位8段共阳数码管显示固定数字:数码管的动态显示0123  

  2. 数码管显示原理

  3. 1.静态显示
  4. 多位数码管依然可以静态显示,但是显示时要么只显示一位数码管,
  5. 否则一体的多位同时显示必须时显示相同内容。
  6. 当多位数码管应用于某一系统时,它们的“位选”是可独立控制的,
  7. 而“段选”是连接在一起的,我们可以通过位选信号控制哪几个数码管亮,
  8. 而在同一时刻,位选选通的所有数码管上显示的数字始终都是一样的,
  9. 因为它们的段选是连接在一起的,所以送入所有数码管的段选的信号都是相同的,
  10. 那么他们显示的数字必定一样。(换言之,你可以通过位选控制那个数码管亮,但是亮的同时显示的数字必定相同)

  11. 2.动态显示
  12. 位选控制亮不亮,而段选控制显示数字,
  13. 那怎样显示不同的数字呢?这就利用了人体肉眼观察的能力。
  14. 举个例子,
  15. 假设段选1控制第一位数码管数字显示1,那么在显示第二个数码管是段选控制数码管显示2,
  16. 而位选控制灯第二位数码管亮,第一位数码管灭。但是给人的感受是第一位数码管并没有灭(实际已经灭了),
  17. 因为时间太短人体肉眼无法识别。这样就会发现数码管动态显示是向左或向右一位一位点亮。         */

  18. #include <reg52.h>//包含51系列头文件
  19. typedef unsigned char uchar;
  20.                               //typedef和define的作用是相似的(但实质却不一样),都是给unsigned char定义一个别名。
  21.                               //也就是说,在定义这个别名之后,你用uchar就等于unsigned char
  22.                               //unsigned char意为无符号字符型数据,占8位数,范围是0~255,简写缩写为uchar

  23.                               /*      typedef和define的区别
  24.                                typedef 是用来定义一种类型的新别名的,它不同于宏(#define),不是简单的字符串替换。
  25.                                它的新名字具有一定的封装性,所以新命名的标识符具有更易定义变量的功能。
  26.                                它是语言编译过程的一部分,但它并不实际分配内存空间。

  27.                                而 #define 只是简单的字符串替换(原地扩展),它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了。
  28.                                因此,它不会做正确性检查,不管含义是否正确它照样会带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。


  29.                                接下来看下面的示例代码:

  30.                                typedef char * PCHAR1;
  31.                                #define PCHAR2 char *
  32.                                PCHAR1 c1, c2;// c1、c2 都为char *,typedef为char *引入了一个新的别名
  33.                                PCHAR2 c3, c4;//相当于char * c3, c4;c3是char *,而c4是char      

  34.                                在定义上述的变量时,c1、c2 与 c3 按照预期都被定义成 char* 类型。
  35.                                值得注意的是,c4 却被定义成 char 类型,而不是我们所预期的 char*。
  36.                                其根本原因就在于 #define 只是简单的字符串替换,而 typedef 则是为一个类型引入一个新的别名。
  37.                               */
  38. uchar table[] =   
  39.                                //uchar是数组类型,占8位数,范围是0~255。
  40.                                //table是数组名称,可以自由定义,但不能和关键字重名,后面必须加[],内部可注明当前数组内的元素个数,也可不注明。
  41. {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};   
  42.                                //从前往后分别是0123456789

  43. uchar address[] =
  44.                                //uchar是数组类型,占8位数,范围是0~255。
  45.                                //address是数组名称,可以自由定义,但不能和关键字重名,后面必须加[],内部可注明当前数组内的元素个数,也可不注明。
  46. {0x7F,0xBF,0xDF,0xEF};         //从前往后分别是0111~1110,共阳数码管,故0为有效,分别对应数码的千百十个....

  47. void Delay(uchar m)
  48.                                //C语言定义延时函数主要通过无意义指令(void意为空)的执行来达到延时的目的。
  49.                                //delay为延时,void delay为延时子程序。
  50.                                //m代表需要延时多少毫秒,uchar范围是0-255
  51. {
  52.     unsigned char a, b;
  53.                                //定义两个个无符号字符型变量a和b
  54.     //for(; m > 0; m--)
  55.         for(b = m; b > 0; b--)
  56.                                //本句后面没有分号,所以编译器会默认第二个也就是下一行的for语句是本行延时语句的内部语句。
  57.             for(a = 2; a > 0; a--);
  58.                                //程序在执行时,第一个for语句中的b每减1次,第二个for语句便执行2次,因此一共执行m*2次。
  59. }
  60. int main()
  61.                                //void定义的函数没有返回值,int定义的函数返回整型值,int为有符号整型值,范围是-32768~32767
  62. {
  63.     uchar i = 0;
  64.                                //定义一个无符号字符型整数i为0
  65.     while(1)                   //while语句的作用是让程序停止在某处,或延时。
  66.                                //括号里面的1为表达式,表达式可以为一个常数,一个运算或一个带返回值的函数。
  67.                                //此句后没有跟分号,所以会默认后面第一个分号前的语句为它的内部语句。
  68.     {
  69.         if (i == 4)            //一轮循环亮起后从头开始。if为选择语句,i==4,两个==写在一起表示测试相等,
  70.                                //即判断等号两边的数是否相等。数字4为数码管是4个,对应前面的位码4个
  71.             i = 0;             //意思是从第一个数码管开始显示
  72.         
  73.         P3 = address[i];       //通过P3控制要亮的数码管位
  74.         P0 = table[i];         //通过P1控制要显示的数码管的段
  75.         ++i;                   //故i++1(i自加1),即第二个第三个第四个数码管相继显示
  76.         //Delay(1);            //快速动态显示
  77.         Delay(1000);           //延时1000ms,可消除鬼影,达到消影

  78.     }
  79. }
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:262 发表于 2022-4-3 02:14 | 只看该作者
这个单片机程序不错 特别适合初学者
回复

使用道具 举报

板凳
ID:297903 发表于 2022-4-3 08:55 | 只看该作者
只用延时的方法消除鬼影,会影响显示频率,数码管会闪烁!!
回复

使用道具 举报

地板
ID:99130 发表于 2022-4-3 10:32 | 只看该作者
GEECGYJ 发表于 2022-4-3 08:55
只用延时的方法消除鬼影,会影响显示频率,数码管会闪烁!!

是的!这是最基础的
回复

使用道具 举报

5#
ID:863362 发表于 2022-4-4 09:10 | 只看该作者
静态显示的时候,4个并行口各单独接一个8段数码管,可以同时显示不同的数字。
回复

使用道具 举报

6#
ID:435636 发表于 2022-4-6 11:12 | 只看该作者
51黑,有你更精彩
回复

使用道具 举报

7#
ID:435636 发表于 2022-4-6 11:17 | 只看该作者
P3 = address;       //通过P3控制要亮的数码管位
P0 = table;         //通过P1控制要显示的数码管的段

先片选,后输出显示码,就会消除
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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