找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC89C52单片机数码管显示00~99,间隔1S程序

[复制链接]
跳转到指定楼层
楼主
一、实验思路
动态数码管就是我们的单片机运行的太快,以至于我们的肉眼没有办法看到间隔,所以我们改一下数据,就可以了,有时候我们用的就是人的视觉暂留,我们在使用数码管时,得知道是共阴还是共阳,在这里,我使用的是共阴的数码管,使用的是12Mhz的晶振,如果我们使用的是11.0592MHz,

这是我们数码管的原理图,数码管其实就是发光二极管显示,共阴,然后我们可以根据段码计算出来的自己想要显示的数字,这里有一些



二、代码原理
我们用定时器显示,如果我们定时器定时2ms,那么2ms就中断一次,而我们在中断里面定义一个 数字,当达到500时,就是500×2ms=1S,然后使数据更新一边,变成下一个数字,我们有俩个数组,一个是存放段码的,另一个是存放实际值的,我们可以十位和各位分别显示,存放到另一个数组里面,然后在经过138译码器显示出来。
三 、实验源码


四、实验现象



还有一点就是那个消隐,P0=0x00;的那个就是消隐,如果没有消隐,显示的数字则会很不清晰;
可能代码还存在点问题,希望大家能够批评指正!
单片机源程序如下:
  1. /*************************************
  2. 本人用的是普中的开发板,然后138和数码管的连接图会贴贴出来,
  3. 芯片是stc89c52 ,晶振是12MHz,仅供交流使用
  4. *************************************/
  5. #include <reg52.h>
  6. typedef unsigned char u8;
  7. typedef unsigned int u16;
  8. #define TIME 500
  9. sbit LSA=P2^2;  //引脚的定义
  10. sbit LSB=P2^3;
  11. sbit LSC=P2^4;
  12. u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  13.                                         0x7f,0x6f};//数码管段码,共阴极段码
  14. u8 disbuff[2];//存放00~99的数组
  15. unsigned char t=0;//数值00~99
  16. /*****************************************************
  17. 函数名称:void In0Init()
  18. 函数功能:定时器0初始化
  19. 输入参数:无
  20. 输出参数:无
  21. *****************************************************/
  22. void In0Init()
  23. {
  24.           TMOD = 0x01;                //开启定时器0
  25.     TH0 = 0xF8;                        //赋初值
  26.     TL0 = 0x30;
  27.     EA = 1;                                        //开启总中断
  28.     ET0 = 1;                                //开启定时器0的中断
  29.     TR0 = 1;
  30. }
  31. /*****************************************************
  32. 函数名称:void DigDisplay()
  33. 函数功能:数码管显示
  34. 输入参数:无
  35. 输出参数:无
  36. *****************************************************/
  37. void DigDisplay()
  38. {
  39. u8 i,j;
  40. for (i=0;i<2;i++)
  41.         {
  42.         switch(i)//位选,选择哪一位亮
  43.                 {
  44.                 case(0): LSA=1;LSB=1;LSC=1;break;
  45.                 case(1): LSA=0;LSB=1;LSC=1;break;
  46.                
  47.                 }
  48.            P0=disbuff[i];
  49.                 j=10;                                        //消隐,要不然会很模糊
  50.                 while(j--);
  51.                 P0=0x00;
  52.         }
  53. }
  54. /*****************************************************
  55. 函数名称:void DealNumber()
  56. 函数功能:处理数字,拆分一位一位的显示
  57. 输入参数:无
  58. 输出参数:无
  59. *****************************************************/
  60. void DealNumber()
  61. {
  62.         disbuff[0]=smgduan[t/10];//处理十位
  63.         disbuff[1]=smgduan[t%10];//处理各位
  64. }
  65. /*****************************************************
  66. 函数名称:void main ()
  67. *****************************************************/
  68. void main ()
  69. {
  70.         In0Init();
  71. while(1)
  72. {
  73.         DealNumber();
  74.         DigDisplay();
  75. }
  76. }
  77. /*****************************************************
  78. 函数名称:void Timer0Interrupt(void) interrupt 1
  79. 函数功能:中断服务函数
  80. 输入参数:无
  81. 输出参数:无
  82. *****************************************************/
  83. void Timer0Interrupt(void) interrupt 1
  84. {unsigned int n;
  85.     TH0 = 0xF8; //重新赋初值
  86.     TL0 = 0x30;
  87.            n++;                                //当n==500时,则为1s
  88.           if(n==TIME)//TIME定义为500,用户可以自己修改
  89.           {
  90.                         t++;                //实际的数值
  91.                         n=0;
  92.            }
  93.                 if(t==100)//如果t==99;然后重新显示00
  94.                 {
  95.                 t=0;
  96.                 }
  97. }
复制代码


全部资料51hei下载地址:
显示00~99.7z (1.5 MB, 下载次数: 16)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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