打开文本图片集
摘 要:由于单片机技术的发展,才能使LED七段数码管能够在减少驱动器的情况下直接被驱动。由于LED数码管显示技术的优势使得它被广泛应用在工业过程控制系统、智能仪表,智能产品等领域。文章重点介绍了LED(light emission diode)数码管动态显示在编程中的常见问题分析。
关键词:单片机;数码管;动态显示;问题分析
1 动态显示
1.1 动态显示的引入
用数码管显示信息时,每个数码管至少需要8个I/O口,如果需要多个数码管,则需要太多的I/O口,而单片机的I/O口是有限的。在实际应用中,一般采用动态显示的方式解决此问题。即将所有位数码管的段选线并联在一起,由位选控制端决定数码管的工作状态。多位数码管显示时应采用动态扫描方式。
1.2 动态显示的原理
所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人感觉好像各位数码管同时都在显示。动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。
2 两位数码管动态显示编程常见问题分析
文章主要针对实现两位数码管显示24进制数的功能,即显示的数据范围为00~23。在PROTEUS中选用的单片机的类型为AT89C51,7个电阻组成的排阻和2位共阴极的数码管。两位数码管动态显示原理图如图1所示
2.1 在KEIL软件使用时易出现的问题
(1)在KEIL软件中使用小写的p0~p3。KEIL软件编程时应注意区分字母的大小写。在端口P0~P3应用时均使用大写字母,如sbit led=P2^0; 因为在“regx51.h”文件中寄存器位置定义分别为 “sfr P0= 0x80;”,“sfr P1=0x90;”“sfr P2= 0xA0;”“sfr P3 = 0xB0;”。
(2)添加.c文件不成功。若是.c文件没有找到指定的存储位置,而是手动输入的名字,则在Keil软件中显示如: 。若是.c文件为空,说明在工程上添加.c文件不成功。添加.c文件成功在Keil软件中显示如: 。
(3)头文件未引用。若是使用“_crol_(变量,移动位数)”循环左移函数,必须引用头文件#include
(4)未生成“××.HEX”文件。选择Options for Target"Target1"选项,单击Output选项卡,选中Create HEX File (打上对钩),单击“确定”按钮,完成设置。
2.2 在KEIL软件中生成的“××.HEX”文件下载到PROTEUS单片机中,进行模拟演示时可能出现的问题
(1)软件编程和硬件匹配问题
a.段码的选择。在KEIL软件编程时,需要调用共阴极的数码管。由于数码管需要显示的数字包含0~9,所以在程序中需要调用0~9的编码,为了方便调用,常常把编码以数组的形式表示,如:unsigned char duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ;
b.位选的控制。两位数码管中选择性显示的控制,即位控端的控制,若使第一位数码管工作,P3.1必须为低电平,即P3=0xfe; 若使第二位数码管工作,P3.0必须为低电平,即P3=0xfd。
(2)数码管显示个位和十位颠倒
任何一个由两位数字组成的十进制数均可以由十位上的数字×10+个位数字表示。如:a=b×10+c,则a表示一个两位的十进制数,b表示十位上的数字,c表示个位上的数字。其中a存放在数组shijian[]中,而b、c则存放在数组geshi[]中。
a.数组当中数据调用顺序不正确。在geshi[]中,geshi[0]存放十位上的数字,geshi[1]存放个位上的数字。如:个位显示“3”,则程序编写为:P3=0xfe,P2= duanma[geshi[1]] 。
b.两位十进制数进行数字拆分不正确。十位上数字利用“/”(取整)算出, 个位上数字采用“%”(求余)得出。
个位上数字:geshi[1]=shijian[0]%10;
十位上数字:geshi[0]=shijian[0]/10;
(3)程序编译正确,但是下载至单片机数码管不显示数字或显示乱码。
a.软件编程所用的编码和硬件使用数码管的管型不一致。
b.软件编程时数码管的位选信号不正确。
c.数组中的数据未初始化。如geshi[]={0,0,0};则该数组中有3个数值,分别为geshi[0]、geshi[1]和geshi[2],若是在程序中出现“geshi[3]”,内部的数据取决于具体的编译器和系统,则geshi[3]具体的数值不一定,所以一般均需要进行必要的初始化。
d.调用数组中的数据不正确。
编写程序时,调用数组内的数据要正确。如:k=0x7f;for(i=0;i<8;i++){P3=k; P2=duanma[geshi[7-i]];k=_cror_(k,1);delay();} 当i=0时,P3=0x7f; P2=duanma[geshi[7]];先调用geshi[]中下标为7的数值,再调用duanma[]中下标为geshi[7]的数值送至P2。
e.数据范围不正确。如shijian[0]++;if(shijian[0]>256)shijian[0]=0; 对于无符号字符型数据的范围为0~255。若是需要和256进行比较,可以定义为“unsigned int shijian[]={0};” 。
综上所述,编写程序时常见问题的原因如下:
(1)学习者对C语言中的部分基础知识掌握不牢固;(2)学习者对相关单片机基础知识理解不透彻;(3)学习者对程序控制要求不
明确。
通过KEIL软件和PROTEUS软件的联合调试,学习者能够及时快捷地掌握单片机和C语言中的相关知识,理解相关器件的工作原理,进而掌握编写程序的一般方法和技巧。
参考文献
[1]张靖武.单片机系统的PROTEUS设计与仿真[M].北京:电子工业出版社,2007.
[2]谭浩强.C语言设计(第4版)[M].清华大学出版社,2010.