串行通讯是不是和动态的多个数码管动态显示c程序显示一样啊,一次亮一个数码管动态显示c程序,只是速度快,就以为每个数码管动态显示c程序都凉了

轻松学PIC之数码管篇 PIC单片机学习系列教程
域名:&&& &&&&&&& || ||
轻松学PIC之数码管篇 PIC单片机学习系列教程
&&&&大家好,通过前一期的学习,我们已经对ICD2仿真烧写器和增强型PIC实验板的使用方法及学习方式有所了解与熟悉,学会了如何用单片机来控制发光管、继电器、蜂鸣器、按键等资源,体会到了学习板的易用性与易学性,当自己一次动手编程点亮一个发光管时,相信对于初学者来说,一定很兴奋,很有成就感吧!现在我们就趁热打铁,再向上跨一步,一起来学习一下数码管的原理及使用方法,这一期实验将会更具生动性。
&&&&说到七段数码管,它在家电及工业控制中有着很广泛的应用,例如用来显示温度、数量、重量、日期、时间等等,具有显示醒目、直观的优点。在一般的人机对话中,输入器件一般都是以按键为主,但输出器件则以数码管或LCD为主。数码管作为一种应用十分普遍的显示器件,可以在各种各样的设备上见到,例如图1就是某数字表头显示时候的效果图。它很适合用在对价格、亮度等条件比较敏感,同时基本上只要求显示数字量的时候,所以在数据显示,定时控制等场合用得很多。常见的数码管实物如图2所示。
图1 数码管显示效果图
图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 数码管结构图
由于驱动方式的差异,也就是对应在各个显示段是低电平还是高电平点亮,数码管又分成两种类型,即共阳极和共阴极数码管。所谓“共阳极”即是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口所决定。
我们可以列出表1这样的段码对应关系表,表中为数字“5”共阴段码。
表1:数码管显示数字“5”的段码表
参照上面的过程,我们又可以列出共阴和共阳数码管0-9十个数字的段码表,如表2所示,在不改变硬件对应关系的前提下,段码表可以通用。
表2:共阴、共阳数码管段码表
&&&&现在我们已经了解了整个显示过程,所以我们也就有了写程序的思路:程序中应该有一个变量,每隔一定时间在0-9之间变化,然后按照这个数据去查找段码表,把查到的数据送到RC口,段码值我们参照表2中共阳这一项。
&&&&我们使用MPLab IDE软件来进行C语言编程,它是我们的编程环境,同时我们可以通过使用ICD2仿真烧写器和增强型PIC实验板连接进行程序的仿真调试和烧写步骤,具体的操作步骤,我们已经在前几期做了详细的说明和介绍,在此就不再重复说明,读者朋友可以参阅以前的文章或直接登陆我们的网站查看资料。前面,我们已经对硬件原理和软件编写思路进行了了解,现在我们可以输入程序代码进行调试了,我们在MPLab IDE软件中新建工程,加入源程序代码,同时进行芯片型号的选择和配置位的设置,我们实验所用的芯片型号为PIC16F877A。上面理论说了一大堆,我们从这里开始动手喽:)我们的任务是要让六个数码管显示数字“0”――“9”字样,时间间隔为1秒。
#include&pic.h&
const unsigned char
display_numb[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90};
void delay_1ms(void)
for(n=0;n&50;n++)
void delay_ms(unsigned int time)
for(;time&0;time--)
delay_1ms();
void main(void)
TRISC=0X00;
TRISA=0X00;
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];
delay_ms(1000);
PORTC=display_numb[10];
&&& 程序代码输入后,读者朋友可以使用仿真模块或直接烧入编译好的HEX文件来进行验证,前者模式可以单步执行,同时监控程序变量在运行过程中的变化;后者直接烧入HEX文件,实验板直接脱机运行。输入了这么长一段程序后,作为初学者的读者一定对有些语句会有点疑问,下面我们就来一起结果实际,看一下一些关键程序语句的作用。
&&&&#include&pic.h& 语句用来加载PIC库文件, 数组display_numb用来定义数字“0”--“9”的字形码,也就是我们的表2中所罗列的内容。void delay_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口赋予一个新的字形码,在我们从实验结果上看来就是数码管在不停地显示“0”――“9”这些数字。
图7 数码管实验演示图
&&&&数码管的原理与使用我们讲到这里,接下来几期,我们将继续一起学习增强型PIC实验板的其它各部分资源的原理与使用,使你对单片机应用的各方面知识都有所入门与提高。增强型PIC实验板系统资源丰富,可做实验有:6位LED数码管、8路LED、直控键盘、蜂鸣器喇叭、继电器试验、I2C总线接口、SPI总线接口、160X液晶、128X64液晶、红外接收头接口、步进电机驱动接口、AD模/数转换接口、串行时钟芯片DS1302、温度传感器DS18B20接口、RS232串口通讯、外扩展接口以便外接更多的实验资源。
以上部分内容转载于网上,如有涉及到版权问题,请即通知本人删除 ICP备号
联系地址:浙江省杭州市西湖科技园西园七路3号4层 邮政编码:310011
电话总机:0 产品咨询:转分机1 技术支持:转分机2 传真:转分机3
杭州晶控电子有限公司 版权所有
COPYRIGHT2003――2010 HANGZHOU KinCony ELECTRONICS CO.,LTD All rights reserved数码管动态显示 - CSDN博客
数码管动态显示
所谓的动态显示就是数码管不断变化,当变化速度超过人眼的识别范围时看起来就像数码管一直显示。
数码管动态显示时需要用到两个锁存器,一个是段锁存,一个是位锁存。一般开发板上使用的数码管动态显示,一组为八个数码管,这里可以称之为八位,每个数码管为一位,位锁存器就是决定哪一位亮起来,而位锁存器决定亮的那一位显示什么。动态显示一般先传段码,决定下一次显示什么内容,再传位码,使下一位亮起,段码和位码的内容都是事先定义一个全局数组,然后查表实现,一般位码数组内容是不做变化的,想改变显示内容只要改变相应位的段码就行。
unsigned char regport[8] = {}; //显示内容自定义
unsigned char bitport[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};& //因为位码的作用是让数码管一个一个按顺序亮,所以一般不做改变。
定义使用的I/O口
#define SEGPORT P0
sbit bit_select = P2^0;
sbit seg_select = P2^1;
void delay_us(unsigned char t)
&&& while(--t);
&&& for(i = 0; i & 8; i ++)
&&&&&&& SEGPORT = regdate[i];
&&&&&&& seg_select = 1;
&&&&&&& seg_select = 0;
&&&&&&& SEGPORT = regdata[i];
&&&&&&& bit_select = 1;
&&&&&&& bit_select = 0;
&&&&&&&&delay_us(2);
此时发现使用上述延时会有重影出现,这是因为段码先传入,位码后做变化,当每次变化延时足够长时,正确显示时间远大于位码变化时间,所以几乎看不出,延时越短重影越明显。想解决重影,只要先把数码管全关闭,之后操作段码和位码的变化,位码一变化完成就打开数码管,这样就能消除重影。
改进后程序如下
&&& for(i = 0; i & 8; i ++)
&&&&&&& SEGPORT = 0
&&&& &&&bit_select = 1;
&&&&& &&bit_select = 0;
&&&&&&& SEGPORT = 0
&&&&&&& seg_select = 1;
&&&&&&& seg_select = 0;
&&&&&&& SEGPORT = regdate[i];
&&&&&&& seg_select = 1;
&&&&&&& seg_select = 0;
&&&&&&& SEGPORT = regdata[i];
&&&&&&& bit_select = 1;
&&&&&&& bit_select = 0;
&&&&&&&&delay_us(2);
本文已收录于以下专栏:
相关文章推荐
第一章 div布局
前几课内容
.htm是早期的后缀,因为那时只能支持长度为3的后缀,因此html与htm是一样的。
shtml是服务器先处理然后再交给浏览器处理
#HTML小知识#之#...
51单片机 数码管的静态显示和动态显示 附有代码示例
51单片机,要求用 8 位数码管动态显示 12 位学号。还要用按键调整走动速度,C语言的。题目链接:/question/14761...
在单片机前几章的学习中,学习的单片机C语言、流水灯的点亮实验之类都太基础,所以没有PO在CSDN上。
从第六章开始,难度稍微有所提升,所以决定开始写博客,记录下在单片机学习中的所思所想。首先用大白...
去年回答的一个题目,被网友翻了出来,提出了很多问题。今天补写了一些说明,发表出来。题目:用两个动态数码管从0显示到60,由89C51的P1口输出,不加译码器,直接连接数码管,注意是动态数码管,不是两个...
基于单片机STC89C52RC,使用定时器1,采用动态扫描的方法,在数码管前三位显示秒表,精确到0.01秒...
基于51单片机的74HC164驱动六位数码管动态显示程序
有需要资料的请回原文下载
#define uchar unsigned...
之前的数码管只能实现 一个数字同时显示 在多个数码管中,但是如果要显示 123 这个 百位数的话 就无法显示出来。
现在就通过不断的很短的时间内 去刷新 多个数码管来显示(由于跟新的速度快,人眼是看...
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 数码管动态显示c程序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信