找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机数码管实验程序(动态、静态显示)注释很详细

[复制链接]
跳转到指定楼层
楼主
基于AT89C52单片机的数码管类实验
电路原理图如下


单片机源程序如下:
  1. /***************************************************************************
  2. 标题:        数码管的显示
  3. 效果:        显示00-99,动态显示+变化显示
  4. ******************************************************************************/
  5. //头文件:
  6. #include "reg51.h"

  7. //变量定义:
  8. unsigned char table[]=
  9.                         {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  10.                                         //表:共阳数码管 0-9
  11. //引脚定义:               
  12. sbit SMG_q = P1^0;        //定义数码管阳级控制脚(千位)
  13. sbit SMG_b = P1^1;        //定义数码管阳级控制脚(百位)
  14. sbit SMG_s = P1^2;        //定义数码管阳级控制脚(十位)
  15. sbit SMG_g = P1^3;        //定义数码管阳级控制脚(个位)

  16. //函数声明:
  17. void display(unsigned char da);//定义显示函数,参数为显示内容,只显示两位数
  18. void delay(void);

  19. //主函数,C语言的入口函数:                        
  20. void main(void)  
  21. {
  22.         unsigned char i=0;                //作为查表的索引号
  23.         unsigned char ldata;        //变量用作0~99计数
  24.         unsigned int j;                        //此变量作为计数跳变刷新时间
  25.         while(1)
  26.         {        
  27.                 j=5000;                        
  28.                 while(j--){               
  29.                         display(ldata);        //刷新5000次,约1秒,注:在C语言里是没有周期可计算的哦~~~
  30.                 }                                                
  31.                 if(ldata<99)
  32.                         ldata++;                //刷新完成约1秒,变量做加计数
  33.                 else
  34.                         ldata=0;
  35.         }
  36. }

  37. //显示函数,参数为显示内容,只显示两位数
  38. void display(unsigned char da)
  39. {
  40.         SMG_q=0;                        //选择十位数码管
  41.         P0=table[da/10];        //获取十位值,查表输出定义好的数码管段值与P0口,显示相应的0-9
  42.         delay();                        //延时
  43.         P0=0XFF;                        //清除数码管显示,因是共阳型,所以不是0
  44.         SMG_q=1;                        //关闭十位数码管

  45.         SMG_b=0;                        //选择个位数码管
  46.         P0=table[da%10];        //获取个位值,查表输出定义好的数码管段值与P0口,显示相应的0-9
  47.         delay();                        //延时
  48.         P0=0XFF;                        //清除数码管显示,因是共阳型,所以不是0
  49.         SMG_b=1;                        //关闭个位数码管
  50. }

  51. //延时子函数,短暂延时
  52. void delay(void){               
  53.         unsigned char i=10;
  54.         while(i--);
  55. }
复制代码
  1. /***************************************************************************
  2. 标题:        数码管的显示
  3. 效果:        显示1234,从这个例子可以学习多位数码管的动态显示技术
  4. ******************************************************************************/
  5. //头文件:
  6. #include "reg51.h"

  7. //变量定义:
  8. unsigned char table[]=
  9.                         {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  10.                                         //表:共阳数码管 0-9
  11. //引脚定义:               
  12. sbit SMG_q = P1^0;        //定义数码管阳级控制脚(千位)
  13. sbit SMG_b = P1^1;        //定义数码管阳级控制脚(百位)
  14. sbit SMG_s = P1^2;        //定义数码管阳级控制脚(十位)
  15. sbit SMG_g = P1^3;        //定义数码管阳级控制脚(个位)

  16. //函数声明:
  17. void delay(void); //延时子函时

  18. //主函数,C语言的入口函数:               
  19. void main(void)  
  20. {
  21.         unsigned char i=0;        //作为查表的索引号
  22.         while(1)                        //不停的循环扫描,不扫描则不显示或显示不正确,即为动态显示,
  23.         {        //数码管显示 1234,可自行修改
  24.                 SMG_q=0;                //选择千位数码管
  25.                 P0=table[1];        //查找"1"定义好的数码管段值与P0口输出,显示相应的1
  26.                 delay();                //加入短暂延时
  27.                 P0=0XFF;                //清除数码管显示,因是共阳型,所以不是0
  28.                 SMG_q=1;                //关闭千位数码管

  29.                 SMG_b=0;                //选择百位数码管
  30.                 P0=table[2];        //查找"2"定义好的数码管段值与P0口输出,显示相应的2
  31.                 delay();                //加入短暂延时
  32.                 P0=0XFF;                //清除数码管显示,因是共阳型,所以不是0
  33.                 SMG_b=1;                //关闭百位数码管
  34.                
  35.                 SMG_s=0;                //选择十位数码管
  36.                 P0=table[3];        //查找"2"定义好的数码管段值与P0口输出,显示相应的2
  37.                 delay();                //加入短暂延时
  38.                 P0=0XFF;                //清除数码管显示,因是共阳型,所以不是0
  39.                 SMG_s=1;                //关闭十位数码管

  40.                 SMG_g=0;                //选择个位数码管
  41.                 P0=table[4];        //查找"2"定义好的数码管段值与P0口输出,显示相应的2
  42.                 delay();                //加入短暂延时
  43.                 P0=0XFF;                //清除数码管显示,因是共阳型,所以不是0
  44.                 SMG_g=1;                //关闭个位数码管
  45.         }
  46. }

  47. //延时子函数,短暂延时
  48. void delay(void){               
  49.         unsigned char i=10;
  50.         while(i--);
  51. }
复制代码
  1. /***************************************************************************
  2. 标题:        数码管的显示
  3. 效果:        静态显示一位数码管,显示0-9
  4. ******************************************************************************/
  5. //头文件:
  6. #include "reg51.h"

  7. //变量定义:
  8. unsigned char table[]=
  9.                         {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  10.                                         //表:共阳数码管 0-9
  11. //引脚定义:               
  12. sbit SMG_q = P1^0;        //定义数码管阳级控制脚(千位)
  13. sbit SMG_b = P1^1;        //定义数码管阳级控制脚(百位)
  14. sbit SMG_s = P1^2;        //定义数码管阳级控制脚(十位)
  15. sbit SMG_g = P1^3;        //定义数码管阳级控制脚(个位)

  16. //函数声明:
  17. void delay(unsigned int d_time); //延时子函时,

  18. //主函数,C语言的入口函数:               
  19. void main(void)  
  20. {
  21.         unsigned char i;                //定义循环变量
  22.         while(1)
  23.         {
  24.                 SMG_q=0;                        //选择千位数码管,这是静态显示,P0口输出显示,不需要刷新,也可选择百位、十位或个位;
  25.                                                         //也可两位或全部同时输出显示
  26.                 for(i=0;i<10;i++)        //循环显示0-9
  27.                 {               
  28.                         P0=table[i];        //查表输出数码管段值给P0口,显示相应的0-9
  29.                         delay(500);                //延时
  30.                 }
  31.         }
  32. }

  33. //延时子函数,参数范围 0-65536
  34. void delay(unsigned int tmp)
  35. {
  36.         unsigned char j;
  37.         while(tmp--){               
  38.                 j=255;
  39.                 while(j--);                     
  40.         }
  41. }
复制代码
  1. /***************************************************************************
  2. 标题:        数码管的显示
  3. 效果:        静态显示一位数码管,显示一个"5"
  4. ******************************************************************************/
  5. //头文件:
  6. #include "reg51.h"

  7. //引脚定义:               
  8. sbit SMG_q = P1^0;        //定义数码管阳级控制脚(千位)
  9. sbit SMG_b = P1^1;        //定义数码管阳级控制脚(百位)
  10. sbit SMG_s = P1^2;        //定义数码管阳级控制脚(十位)
  11. sbit SMG_g = P1^3;        //定义数码管阳级控制脚(个位)

  12. //主函数,C语言的入口函数:               
  13. void main(void)  
  14. {
  15.         SMG_q=0;                //打开千位数码管,这是静态显示,P0口输出显示,不需要刷新,也可选择百位、十位或个位;
  16.                                         //也可两位或全部同时输出显示               
  17.         P0=0x92;                //输出数码管段值给P0口,显示相应的5,
  18.                                         //0-9的段值分别是(共阳):0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90

  19.         while(1);                //程序停止
  20.                
  21. }
复制代码
  1. /***************************************************************************
  2. 标题:        数码管的显示
  3. 效果:        显示1234,缓冲显示
  4. ******************************************************************************/
  5. //头文件:
  6. #include "reg51.h"

  7. //变量定义:
  8. code unsigned char table[]=
  9.                         {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  10.                                         //表:共阳数码管 0-9
  11. unsigned char l_disbuff[4]={1,2,3,4,};//显示缓冲
  12. unsigned char l_posit=0;        //显示位置

  13. //引脚定义:               
  14. sbit SMG_q = P1^0;        //定义数码管阳级控制脚(千位)
  15. sbit SMG_b = P1^1;        //定义数码管阳级控制脚(百位)
  16. sbit SMG_s = P1^2;        //定义数码管阳级控制脚(十位)
  17. sbit SMG_g = P1^3;        //定义数码管阳级控制脚(个位)

  18. //函数声明:
  19. void delay(unsigned int timer); //延时子函时
  20. void display();                //显示

  21. //主函数,C语言的入口函数:               
  22. void main(void)  
  23. {
  24.         unsigned int i=10000,j=1000;
  25.         while(1)                        //不停的循环扫描,不扫描则不显示或显示不正确,即为动态显示,
  26.         {
  27.                 display();                //调用显示缓冲内容
  28.                 delay(10);
  29.         }
  30. }

  31. //延时子函数,短暂延时
  32. void delay(unsigned int timer){               
  33.         while(timer--);
  34. }

  35. //显示函数,参数为显示内容
  36. void display()
  37. {
  38.         P0=0XFF;                        //
  39.         switch(l_posit){
  40.         case 0:                //选择千位数码管,关闭其它位
  41.                 SMG_q=0;
  42.                 SMG_b=1;        
  43.                 SMG_s=1;               
  44.                 SMG_g=1;
  45.                 P0=table[l_disbuff[0]];        //输出显示内容
  46.                 break;
  47.         case 1:                //选择百位数码管,关闭其它位
  48.                 SMG_q=1;
  49.                 SMG_b=0;        
  50.                 SMG_s=1;               
  51.                 SMG_g=1;
  52.                 P0=table[l_disbuff[1]];
  53.                 break;
  54.         case 2:                //选择十位数码管,关闭其它位
  55.                 SMG_q=1;
  56.                 SMG_b=1;        
  57.                 SMG_s=0;               
  58.                 SMG_g=1;
  59.                 P0=table[l_disbuff[2]];
  60.                 break;
  61.         case 3:                //选择个位数码管,关闭其它位
  62.                 SMG_q=1;
  63.                 SMG_b=1;        
  64.                 SMG_s=1;               
  65.                 SMG_g=0;
  66.                 P0=table[l_disbuff[3]];
  67.                 break;
  68.         }
  69.         l_posit++;                //每调用一次将轮流显示一位
  70.         if(l_posit>3)
  71.                 l_posit=0;        
  72. }
复制代码

以上Keil代码下载:
纯代码.7z (16.66 KB, 下载次数: 14)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:262 发表于 2022-5-23 03:36 | 只看该作者
注释够详细 对初学者有参考价值
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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