历史上的今天
返回首页

历史上的今天

今天是:2025年02月04日(星期二)

2020年02月04日 | PIC单片机之数码管

2020-02-04 来源:eefocus

大家好, 通过前一期的学习, 我们已经对ICD2 仿真烧写器和增强型PIC 实验板的使用方法及学习方式有所了解与熟悉,学会了如何用单片机来控制发光管、继电器、蜂鸣器、按键等资源,体会到了学习板的易用性与易学性,特别是当自己第一次动手编程点亮一个发光管时,相信对于初学者来说,一定很兴奋,很有成就感吧!现在我们就趁热打铁,再向上跨一步,一起来学习一下数码管的工作原理及使用方法,这一期实验将会更具生动性。


说到七段数码管,它在家电及工业控制中有着很广泛的应用, 例如用来显示温度、数量、重量、日期、时间等,具有显示醒目、直观的优点。在一般的人机对话中,输入器件一般都是以按键为主,但输出器件则以数码管或LCD 为主。数码管作为一种应用十分普遍的显示器件,可以在各种各样的设备上见到,如图1 所示就是某数字表头显示时候的效果图。它很适合用在对价格、亮度等条件比较敏感,同时基本上只要求显示数字量的时候,所以在数据显示,定时控制等场合用得很多。常见的数码管实物如图2 所示。


图1 数码管显示效果图


图1 数码管显示效果图


图2 数码管实物图

图2 数码管实物图


首先,我们先对相关理论知识进行一番了解。


我们可以看到图1中有8 位数码管,那么这些数码管是怎样来显示1,2,3,4……数字的呢?


别着急,我们一起慢慢来学。


数码管实际上是由7 个发光管组成“8”字形构成的, 加上小数点就是8 个。这些段分别由字母a,b,c,d,e,f,g,dp来表示。当数码管特定的段加上电压后,这些特定的段就会发亮,以形成我们眼睛看到的字样了。如:


显示一个“2”字,那么应当是a 亮、b 亮、g 亮、e 亮、d 亮、f 不亮、c 不亮、dp 不亮。


7 段数码管的段排列和内结构见图3。


图3 数码管结构图


图3 数码管结构图


由于驱动方式的差异,也就是对应在各个显示段是低电平还是高电平点亮,数码管又分成两种类型,即共阳极和共阴极数码管。所谓“共阳极”是指8 个LED 的阳极连接在一起组成公共端;同理“共阴极”则是8 个LED 的阴极连接在一起组成公共端。


其内部LED 的连接方式可以参考图4。



图4 数码管内部结构图


虽然通过上文原理的介绍,对数码管的工作原理已经了解,但当我们拿到一个数码管时要正确地应用它还是一时不知如何下手,比如我们现在要求数码管显示“5”,应该怎么办呢?首先我们需要明白一个事情,数码管是不认识“5”的,当然也不认识其他数字,所以千万别说,“给数码管写个“5”就行了”。数字只是种符号,对人来说是这样的,对单片机而言也是,单片机只是通过LED 把内部的结果用我们约定的方式显示出来而已,这个“约定”


就是数字该如何在LED 上显示的方法。比如我们需要显示的数字为0 到9,如图5 所示。



图5 显示数字效果图


假设我们使用共阴极数码管,那么我们就对照图3 和图4 来看看“5”是如何显示出来的。首先对数码管而言,我们要想显示数字“5”,我们可以发现有如下一些段是需要点亮的,即A、C、D、F、G。


知道了这些段需要点亮后,现在我们再来看一下增强型PIC 实验板上数码管的控制电路,因为我们需要将软件和硬件相结合进行考虑如何来编程。


图6 中的A,B,C,D,E,F,G,DP 分别与单片机的RC 口相连,用来控制显示数字的形状。Q3、Q4、Q5、Q6、Q7、Q8 这6 个三极管是用来片选数码管,用来打开或关闭某一路数码管,RA1、RA0、RA3、RA2、RA5、RA4 分别接在单片机的RA 口上,通过控制这些三极管的基极电平来打开或关闭数码管的显示,即起到“使能”作用。如S1 端为低电平,则允许相应的数码管显示,显示的字形则由RC 口所决定。


图6 数码管电路原理图


图6 数码管电路原理图




我们可以列出表1 这样的段码对应关系表,表中为数字“5”共阴段码。


表1 数码管显示数字“5”的段码表


表1 数码管显示数字“5”的段码表


参照上面的过程,我们又可以列出共阴和共阳数码管0~9 十个数字的段码表,如表2 所示,在不改变硬件对应关系的前提下,段码表可以通用。


表2 共阴、共阳数码管段码表


表2 共阴、共阳数码管段码表


现在我们已经了解了整个显示过程,所以我们也就有了写程序的思路:程序中应该有一个变量,每隔一定时间在0~9 之间变化,然后按照这个数据去查找段码表,把查到的数据送到RC 口,段码值我们参照表2 中共阳这一项。


我们使用MPLab IDE 软件来进行C 语言编程,它是我们的编程环境,同时我们可以通过使用ICD2仿真烧写器和增强型PIC 实验板连接进行程序的仿真调试和烧写步骤,具体的操作步骤,我们已经在前几期做了详细的说明和介绍,在此就不再重复,读者可以参阅以前的文章或直接登陆我们的网站查看资料。前面,我们已经对硬件原理和软件编写思路进行了了解,现在我们可以输入程序代码进行调试了。我们在MPLab IDE 软件中新建工程,加入源程序代码,同时进行芯片型号的选择和配置位的设置,我们实验所用的芯片型号为PIC16F877A。上面理论说了一大堆,现在我们可以从这里开始动手了。本来6 个数码管可以各自显示不同数字,RA口动态扫描,每个瞬间只有一个管显示,视觉上感到是6 位数。作为初次实验,我们的任务是要让六个数码管同时显示数字“0”~“9”字样,时间间隔为1 秒。


#include


const unsigned char display_numb[10]={0x


c0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0


x90};


void delay_1ms(void)


{


unsigned int n;


for(n=0;n<50;n++)


{


NOP();


}


}


void delay_ms(unsigned int time)


{


for(;time>0;time--)


{


delay_1ms();


}


}


void main(void)


{


TRISC=0X00;


TRISA=0X00;


while(1)


{


PORTC=display_numb[0];


PORTA=0X00;


delay_ms(1000);


PORTC=display_numb[1];


delay_ms(1000);


PORTC=display_numb[2];


delay_ms(1000);


PORTC=display_numb[3];


delay_ms(1000);


PORTC=display_numb[4];


delay_ms(1000);


PORTC=display_numb[5];


delay_ms(1000);


PORTC=display_numb[6];


delay_ms(1000);


PORTC=display_numb[7];


delay_ms(1000);


PORTC=display_numb[8];


delay_ms(1000);


PORTC=display_numb[9];


}


}


程序代码输入后,读者可以使用仿真模块或直接烧入编译好的HEX 文件来进行验证,前者模式可以单步执行,同时监控程序变量在运行过程中的变化;后者直接烧入HEX 文件,实验板直接脱机运行。


输入了这么长一段程序后,作为初学者一定对有些语句会有点疑问,下面我们就来一起结合实际,看一下一些关键程序语句的作用。


#include 语句用来加载PIC 库文件,数组display_numb 用来定义数字“0”~“9” 的字形码,也就是我们的表2 中所罗列的内容。voiddelay_1ms(void) 是延时1ms 的函数,void delay_ms(unsigned int time) 是延时X 毫秒的函数,具体为多少毫秒由形参time 变量决定,如我们执行函数 delay_ms(1000); 即表示为延时1000 毫秒= 延时1 秒的时间。语句“TRISC=0X00;” 用来设置RC 口的输入、输出状态,在此我们设置为输出;语句“TRISA=0X00;”用来设置RA 口的输入、输出状态,在此我们设置为输出。while(1) 是死循环语句,即周而复始地执行{ } 内的语句体,如我们现在的程序中的作用即是不停地执行 delay_ms(x);PORTC=display_numb[x]; 这两类语句,即给RC口送一个字形码,延时1 秒钟后,又给RC 口赋予一个新的字形码,在我们从实验结果上看来就是数码管在不停地显示6 个相同的“0”~“9”这些数字。留给读者设计,将一个6 位十进制数字(如201006)显示出来的程序。


数码管的原理与使用,我们暂讲到这里,接下来几期,我们将继续一起学习增强型PIC 实验板的其他各部分资源的原理与使用,使你对单片机应用的各方面知识都有所入门与提高。增强型PIC 实验板系统资源丰富,可做实验有:6 位LED 数码管、8 路LED、直控键盘、蜂鸣器喇叭、继电器试验、I2C 总线接口、SPI 总线接口、160X 液晶、128X64液晶、红外接收头接口、步进电机驱动接口、AD模/ 数转换接口、串行时钟芯片DS1302、温度传感器DS18B20 接口、RS232 串口通讯、外扩展接口以便外接更多的实验资源。


推荐阅读

史海拾趣

CUI公司的发展小趣事

近年来,智能化和物联网技术的快速发展为电子行业带来了前所未有的机遇。CUI技术作为实现电子设备智能化和互联互通的关键环节之一,得到了广泛的应用。一些企业针对智能化和物联网的需求,开发出具有特殊功能的CUI材料,如柔性CUI、透明CUI等,为电子产品的创新提供了有力支持。

请注意,以上故事仅为概述性质,并非针对特定公司的实际发展历程。每个公司的具体情况可能因市场环境、技术实力、管理策略等因素而有所不同。如果需要了解特定公司的具体发展故事,建议查阅相关公司的官方网站、新闻报道或行业分析报告。

Dolphin Interconnect Solutions Asa公司的发展小趣事

在全球化的背景下,Dolphin Interconnect Solutions ASA积极实施国际化战略。公司不仅在欧美等发达国家建立了完善的销售网络,还通过参加国际展会、举办技术研讨会等方式,提高了品牌知名度和市场影响力。同时,Dolphin还加强了与国际知名企业的合作,共同推动电子行业的发展。

COTO TECHNOLOGY公司的发展小趣事

随着业务的不断扩展,COTO TECHNOLOGY开始寻求全球范围内的合作与发展。1998年,公司收购了位于荷兰的Philips干簧开关事业部,组建了Coto Technology B.V.,进一步增强了其在全球市场的竞争力。此后,COTO还通过与其他企业的战略合作,不断拓宽业务领域,实现了从单一产品制造商向综合性电子解决方案提供商的转变。

FINECHIPS公司的发展小趣事

FINECHIPS公司自成立以来,始终将技术创新视为企业发展的核心驱动力。公司投入大量资源于研发部门,专注于集成电路(IC)和电子元器件的技术创新。在某一关键时期,FINECHIPS成功研发出一款高性能、低功耗的模拟开关芯片,该芯片凭借其卓越的性能迅速获得市场认可,不仅在国内市场占据一席之地,还成功打入国际市场,为公司带来了显著的品牌影响力和市场份额增长。

DATEL Inc公司的发展小趣事

进入21世纪,随着电子医疗的兴起,DATEL Inc.看到了新的发展机遇。公司开始研发适用于医疗领域的数据采集产品,如医用传感器、生命体征监测仪等。通过与医疗机构紧密合作,DATEL Inc.成功推出了一系列高性能、高可靠性的医疗数据采集产品,为医疗行业的数字化转型做出了重要贡献。

DBLECTRO公司的发展小趣事

近年来,随着物联网和大数据技术的快速发展,迪贝电子也积极探索将这些新技术应用于其产品中。公司推出了一系列智能气体检测和分析系统,这些系统可以通过物联网技术实现远程监控和数据传输,为用户提供更加便捷、高效的服务。同时,迪贝电子还利用大数据技术对用户的使用数据进行深度挖掘和分析,为产品的研发和优化提供了有力的支持。这些创新举措使得迪贝电子在气体检测及分析领域保持了领先地位,并为其未来的发展奠定了坚实的基础。

问答坊 | AI 解惑

新型VMOS管IRF7389

请教有关新型VMOS管IRF7389的知识…

查看全部问答>

收集点灯泡验光控制器设计的资料 单片机做的

MCU准备用89C51    然后电流传感器用来测电流  AD转换用那个芯片好?  主要是确定了元器件 电路怎么连。。。。…

查看全部问答>

spi驱动问题

请教各位大哥: 驱动insmod成功,也创建了节点,但是open就出现错误。内核版本2.6.18,pxa270的片子。 Unable to handle kernel NULL pointer dereference at virtual address 00000019 pgd = c0b7c000 [00000019] *pgd=a0385031, *pte=0000000 ...…

查看全部问答>

求救:关于AD6654

   小弟今日购买了一款AD6654/PCBZ评估板,在测试过程中出现几个问题,ADI的售后服务真是不敢恭维,一点忙也帮不上,主要的问题是在使用配套的软件AD6654 Evaluation Software 的过程中,在关于NCO频率的设置的一栏中,几个参数怎么设计 ...…

查看全部问答>

PB5 定制wince内核,遇到的奇怪的问题

由于嵌入式机器rom的限制,在定制wince内核的时候,不加入MFC,然而后来在后续开发中发现需要使用消息队列,假如消息后重新定制,在PB中发现始终无法使用GetMessage(加入了库函数和lib文件),困惑 请教:不加入MFC及其他.Net Framwork的东西,只加 ...…

查看全部问答>

推荐用于测试CE程序的PPC

现需要真机进行CE程序测试,希望价格便宜的PPC,具体蓝牙,无限功能,PPC系统软件可刷到WM5.0,现在选型阶段,不知道哪款最好!谢谢…

查看全部问答>

发一个PIC的开源机器人!~

PIC的开源机器人!~ [ 本帖最后由 wanghongyang 于 2010-10-7 19:43 编辑 ]…

查看全部问答>

求助,avr128的串口通信问题

我用AVR128的串口进行数据收发,接收用中断方式,单步执行时,发现数据不能全部接受到,掉了几个字节,也就造成我对这个数组的CRC校验出错,全速运行时,字节全部接收正确,但对接收数组的数据的CRC校验还是错,请问是什么原因呢??急…

查看全部问答>

FIFO FPGA VERILOG

 你懂的。。FIFO,verilog\\实现,内含工程的各种文件,仿真文件也有。欢迎下载。…

查看全部问答>

大家是怎么用固件库3.5

以前用的是V3.0的固件库,使用的是固件库中文手册,它把每个参数的含义以及每个子函数的示例都有,这样使用或查找起来很方便。 现在使用V3.5的库,感觉改动的还是很大的,现在只有CHM文件了,没有使用手册了,不知道大家是如何看这个文件及使用的 ...…

查看全部问答>