1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 51单片机教程:数码管动态显示(0~99999999)74hc138驱动

51单片机教程:数码管动态显示(0~99999999)74hc138驱动

时间:2023-06-18 21:16:26

相关推荐

51单片机教程:数码管动态显示(0~99999999)74hc138驱动

数码管动态显示0~99999999

一、共阴极8位数码管原理

首先了解一些必要知识

1、多位数码管是扫描显示,也就是同一时刻只有一个数码管显示

2、视觉暂留效果:第一个数码管显示完,第二个数码管接着显示,接着后面数码管一次显示,当显示(扫描)足够快的时候,人眼是看不到闪烁的,就认为多个数码管是同时显示的

3、多位数码管只能同时显示多个一样的数字,要显示不同数字需要扫描显示

比如说要显示12345678,你看起来8个数码管是同时亮的,其实同一时刻只有一个数码管是亮的

我们把时间放慢,看看数码管都发生了什么变化:

1、第1毫秒

2、第二毫秒

3、第三毫秒

4、第四毫秒

5、第五毫秒

6、第六毫秒

7、第七毫秒

8、第八毫秒

当数码管的扫描频率大于50hz的时候人眼是基本分不清的,也就是你的扫描8个数码管的周期控制在20ms内就可以实现动态显示不闪烁。

二、了解原理后打开proteus仿真,画电路图

这里用了74hc138,不会用的可以百度一下芯片用法

三、编写代码

代码功能,显示从0自加到99999999

#include <reg51.h>typedef unsigned long u32; //对数据类型进行声明定义typedef unsigned int u16;typedef unsigned char u8;sbit LSA=P3^0;//74hc138的A B C引脚定义sbit LSB=P3^1;sbit LSC=P3^2;#define SMG P0//定义数码管段数据接口P0u8 buff[8];//显示缓冲数组u8 a[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//分别显示0 1 2 3 4 5 6 7 8 9void delay_ms(u16 t){u16 i,j;for(i=0; i<t; i++)for(j=0; j<120; j++);}void update(u32 val) //更新缓冲数组{//分离各位数据buff[0]=val/10000000%10;//12345678/10000000%10=1;buff[1]=val/1000000%10; //12345678/1000000%10=2;buff[2]=val/100000%10;//12345678/100000%10=3;buff[3]=val/10000%10;//12345678/10000%10=4;buff[4]=val/1000%10;//12345678/1000%10=5;buff[5]=val/100%10; //12345678/100%10=6;buff[6]=val/10%10;//12345678/10%10=7;buff[7]=val%10; //12345678%10=8;}void display(void) //显示函数{u8 n;for(n=0; n<8; n++){switch(n) //先位选{case 0:LSC=0;LSB=0;LSA=0;break;case 1:LSC=0;LSB=0;LSA=1;break;case 2:LSC=0;LSB=1;LSA=0;break;case 3:LSC=0;LSB=1;LSA=1;break;case 4:LSC=1;LSB=0;LSA=0;break;case 5:LSC=1;LSB=0;LSA=1;break;case 6:LSC=1;LSB=1;LSA=0;break;case 7:LSC=1;LSB=1;LSA=1;break;}SMG=a[buff[n]];//后发送段数据delay_ms(1);//小延时,显示更稳定}}void main(void){u32 num=0; //要显示的数据u16 t; //延时用while(1){update(num); //更新显示缓冲数组for(t=0; t<50; t++) //用for循环来延时不然显示不正常{display();//显示缓冲数组}num++; //显示数据自加}}

执行效果:一开始显示00000000,然后自动加一,一会变成00000035,直到溢出

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。