基于单片机的数码管电路设计

描述

前面一课通过流水灯实验,学会了流水灯电路模型设计,掌握了循环移位和时间延迟算法的程序编写。本次实验完成数码管显示电路模型设计和编程,在实验过程中,学习数码管显示电路设计、数码管循环显示数字的算法。

认识数码管

数码管是半导体发光器件,用于显示数字、字母、简单图形符号等内容。数码管基本单元是发光二极管,数码管内部由多个发光二极管管构成,多个发光二极管在同一时间的不同状态,组合为不同的数字、字母或图形符号。

数码管型号多样,有单位数码管、双位数码管、四位数码管、八位数码管等等,单位数码管仅能显示一个数字、字母或图形符号,多位数码管可以显示多个数字、字母或图形符号。实际上,多位数码管都可以由单位数码管构成,例如4个单位数码管可以构成四位数码管。

不管将几位数码管连在一起,数码管的显示原理都是一样的,都是靠点亮内部的发光二极管来发光,下面我们来看看单位数码管是如何显示数字的。

单位数码管一般由7个发光二极管组成,有共阴,共阳两种,八个引脚,七个引脚接7个发光二极管,一个引脚是公共端,若共阴,该引脚接地,若共阳,该引脚接电源的正极。

单片机

单位数码管内部基础电路如上图所示,显示一个数字需要7个小段,每个小段需要一个发光二极管,因此数码管的引脚至少为8个,其中7个引脚分别接二极管的正极或负极,另外1个引脚为公共端,若数码管为共阴极,该引脚接地,若数码管为共阳极,该引脚接电源。

对于共阳极数码管来说,7个发光二极管的正极连接在一起形成公共端,该公共端接电源,负极分别接单片机的I/O端口,当我们给数码管任一个阴极低电平时,对应的这个发光二极管就点亮了。例如:若需要数码管显示数字0,g引脚送低电平,其它引脚送高电平,这样数码管就显示数字0了;若需要数码管显示数字8,将所有引脚(公共端除外)送入低电平,数码管就显示数字8了。因此,若需要数码管显示数字,只需要给发光二极管引脚送入低电平或高电平就可以了。

数码管电路设计

本次实验设计要求通过单片机P0口控制数码管循环显示数字0 ~ 9,实验需要用到单位数码管器件。在“Pick Devices”对话框搜索关键词“7SEG”,选择“7SEG-MPX1-CA”型号的数码管,该数码管是7段共阳极数码管,可以显示数字0~9和小数点,它有9个引脚,8个引脚用于连接P0口的8位端口,1个引脚为公共端,连接电源的正极。

单片机

数码管内部发光二极管点亮时,大约需要几个毫安以上的电流,而且电流不可过大,电流过大可能会烧毁发光二极管,因此需要在P0端口和数码管引脚之间接入限流电阻,限流电阻值不能太大,也不能大小。限流电阻的阻值计算过程如下:一个发光二极管的额定电压一般是1.5~2.5V,电阻不大于50欧姆,电流约为0.04A,单片机引入的电源电压为5V,限流电阻的阻值约为R=U/I=5/0.04=125欧姆。计算值仅是个近似值,可以选择100~500欧姆以内的阻值。

电路设计如下图所示:

单片机

数码管编程

让数码管循环显示数字0 ~ 9,需要对数字0~9进行编码,对应数字的编码值用于控制P0各端口的电平输出,从而控制数码管内部各发光二极管的状态,显示出编码对应的数字。

“7SEG-MPX1-CA”型号的数码管数字0~9的编码为:

unsigned char led[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

0xC0为数字0的编码,其二进制数为11000000,该值送入单片机P0口,P0口的第7、6端口为高电平,5、4、3、2、1、0端口为低电平,与5、4、3、2、1、0端口连接的发光二极管被点亮,与7、6端口连接的发光二极管为熄灭状态,其中端口7位小数点,端口6位g段,显示数字0。

0xF9为数字1的编码,其二进制数为11111001,该值送入单片机P0口,P0口的7、6、5、4、3、0端口为高电平,与其连接的发光二极管为熄灭状态,P0口的2、1端口为低电平,与其连接的发光二极管被点亮,即b、c段点亮,显示数字1。

同学们可以自行分析2~9数字的编码。C程序代码如下:

#include < reg51.h >
#include < stdio.h >
unsigned char led[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
void delay(unsigned int millisecond)
{
       unsigned int i,j;
       for(i=millisecond;i >0;i--)
              for(j=120;j >0;j--);
}
void main(void)
{
    unsigned int i;
while(1)
        {
               for(i=0;i< 10;i++)
               {
                            P0 = led[i];
                            delay(500);
               }
        }
 }

led[]为数字0~9编码数组,delay()为时间延迟函数,在main()函数内部,使用while循环让程序持续执行,在while循环内部,使用for循环遍历led[]数组,获取每个数字的编码,并将编码赋值给P0。

实验小结

通过这次实验,了解了数码管显示数字和字符的原理,学会了数码管显示电路设计,掌握了数码管显示控制编程技术。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分