1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 51单片机上数码管的静态显示和动态显示

51单片机上数码管的静态显示和动态显示

时间:2019-04-30 04:22:15

相关推荐

51单片机上数码管的静态显示和动态显示

一、TX1C数码管介绍

共阴极和共阳极数码管,实验板上是共阴极数码管,6位一体的数码管。

连接原理图如下面两图:连在一起的段线(段选线即abcdefgh)控制数码管亮什么数字,独立的公共端(位选线即共阴极或共阳极)控制哪一位数码管亮。因为段线是连接在一起的,所以显示的数字是一样的,共阴极一端是独立的公共端,所以低六位分别控制哪位数码管亮。用两个锁存器可以控制任意数码管显示任意数字。

一、数码管的静态显示

静态显示就是位选打开的数码管上显示的数字都相同,因为段选是连接在一起的。

1、数码管的前三位显示666

#include <reg52.h>sbit wela=P2^7;sbit dula=P2^6;void main(){wela=1;//位选打开,即锁存端置高,锁存器的输出随输入变化P0=0xf8;//1111 1000,前三位点亮wela=0;//位选关闭,即锁存端置低,锁存器保持之前的状态,就是让前三个数码管亮dula=1;P0=0x7d;//将数码管显示6数字,0111 1101dula=0;while(1){}}

2、6位数码管间隔500毫秒同时显示996ICU

#include <reg52.h>sbit dula=P2^6;sbit wela=P2^7;unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x3e};//0到F的编码,最后一个是U,0011 1110void delayms(unsigned int xms){unsigned int i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void main(){wela=1;P0=0xc0;//1100 0000,六个数码管亮wela=0;while(1){dula=1;P0=table[9];//数组是从0开始的,显示9dula=0;delayms(500);dula=1;P0=0;dula=0;delayms(300);//由于连续两个9,中间熄灭300毫秒dula=1;P0=table[9];dula=0;delayms(500);dula=1;P0=table[6];//显示6dula=0;delayms(500);dula=1;P0=table[1];//由于显示不了I,所以用1代替一下dula=0;delayms(500);dula=1;P0=table[12];//显示Cdula=0;delayms(500);dula=1;P0=table[16];//显示Udula=0;delayms(300);}}

由于中间两个9,显示效果不太好。

二、数码管的动态显示

所谓的动态显示就是从第一个数码管到最后一个数码管依次显示数字,把显示数字进行延时,就成了每个数码管依次显示了,然后把时间缩得很短很短,数码管在轮流高速显示,人眼看不出来了,给人的感觉就是同时显示了。

下段代码就是显示996ICU字样

#include <reg52.h>#define uint unsigned int//宏定义,给unsigned int 重新命名为uint,方便使用sbit dula=P2^6;sbit wela=P2^7;unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x3e};//0到F的编码,最后一个是U,0011 1110void delayms(uint xms);void main(){dula=0;wela=0;/*关闭位选,不然下面刚打开段选时,9也就是ox6f点亮的数码管都会显示9,只不过很快,眼睛看不见,如果加一个延时语句就能看见了,可以在下面第一个dula=0语句后加while(1)测试一下*/while(1){dula=1;P0=table[9];//第一个数码管显示9dula=0;P0=0xff;//消影。如果不加,后面打开第一个数码管之前先把9也就是0x6f给打开位选的P0,程wela=1;//序跑的很快看不见,如果慢点就能看到数码管出现混乱现象P0=0xfe;//打开第一个数码管wela=0;delayms(1);wela=1;//如果不加这三个语句就会看到数码管没有亮的部分会有微弱亮度P0=0xff;//原因是往下执行时,位选的fe先给下面段选,第一个数码管快速显示fewela=0;/*然后下面的table[9]就显示给了第一个数码管,因为这两个数都是9,换个数字就明显了,所以在没有延时高速显示下会有微弱亮度,如果慢点可能会出现混乱现象,所有显示的数字亮很多是因为有延时,所以直接关闭第一个数码管就解决问题了,由于高速显示也就看不到第一个数码管灭了*/dula=1;P0=table[9];dula=0;P0=0xff;wela=1;P0=0xfd;//打开第二个数码管wela=0;delayms(1);wela=1;P0=0xff;wela=0;dula=1;P0=table[6];//显示6dula=0;P0=0xff;wela=1;P0=0xfb;//打开第三个数码管wela=0;delayms(1);wela=1;P0=0xff;wela=0;dula=1;P0=table[1];//显示I,用1代替dula=0;P0=0xff;wela=1;P0=0xf7;//打开第四个数码管wela=0;delayms(1);wela=1;P0=0xff;wela=0;dula=1;P0=table[12];//显示Cdula=0;P0=0xff;wela=1;P0=0xef;//打开第五个数码管wela=0;delayms(1);wela=1;P0=0xff;wela=0;dula=1;P0=table[16];//显示Udula=0;P0=0xff;wela=1;P0=0xdf;//打开第六个数码管wela=0;delayms(1);wela=1;P0=0xff;wela=0;}}void delayms(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}

刚开始delayms函数的时间放长一点,delayms(500),让它以0.5秒的速度依次显示,慢慢减小时间到delayms(1)1毫秒就体会的深一点了。

三、总结

1、编码方法

本实验板上共阴极数码管编码如下:unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};此编码是0到F,即0为0011 1111,1为0000 0110.不同的电路编码可能不同,知道数码管显示的原理就可以编码。在数组类型后面多了一个code关键字。注意:在单片机中定义数组是占用内存空间的,而定义编码时是直接分配到程序空间,编译后,编码占用的是程序存储空间,而不是内存空间。

2、消影很重要,不然数码管会混乱或者数字之外的部分会有余辉。在第二段代码中,关闭的位选人眼是看不见的,给人同时显示的原因就是高速显示和二极管点亮之后的余辉作用。

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