实验四、数码管动态扫描显示实验
一、实验目的
1.学习和理解数码管动态扫描的工作原理
2.学习和掌握数码管动态扫描的电路接口设计及程序编写
二、实验设备
1.仿真器
2.单片机最小系统教学实验模块
3.动态数码管显示模块
三、实验要求
使8位数码管显示“0 1 2 3 4 5 6 7”字样。
四、实验原理
4.1 8段数码管显示原理
数码管中的每一段相当于一个发光二极管,8段数码管则具有8个发光二极管。对于“共阳极”的数码管,内部每个发光二极管的阳极被接在一起,成为该各段的公共选通线;发光二极管的阴极则成为段选线。对于“共阴极”数码管,则正好相反,内部发光二极管的阴极接在一起,阳极成为段选线。这两种数码管的驱动方式是不同的。当需要点亮“共阳极”数码管的一段时,公共段需接高电平(即写逻辑1)、该段的段选线接低电平(即写逻辑0),从而该段被点亮。当需要点亮“共阴极”数码管的一段时,公共段需接低电平(即写逻辑0)、该段的段选线接高电平(即写逻辑1),该段被点亮。
数码管的段位顺序如右图所示:
一般来说在一个字节中按照abcdefg dp的顺序放置字型码,比如在一个“共阴极”数码管上要显示“1”,则b、c段需被点亮,因此在段选线中写入60H。例如使用P0口接段选线,则使用下面的语句即可点亮数码管: MOV P0,#06H
对应规则:
a----->D7
b----->D6
c----->D5
d----->D4
e----->D3
f----->D2
g----->D1
dp---->D0
4.2 多位数码管的显示
在多位8段数码管显示时,为了简化硬件电路,通常将所有位的段选线相应地并联在一起,由一个单片机的8位I/O口控制,形成段选线的多路复用。而各位数码管的共阳极或共阴极分别由单片机独立的I/O口线控制,顺序循环地点亮每位数码管,这样的数码管驱动方式就称为“动态扫描”。在这种方式中,虽然每一时刻只选通一位数码管,但由于人眼具有一定的“视觉残留”,只要延时时间设置恰当,便会感觉到多位数码管同时被点亮了。
8位8段LED动态显示器电原理图如图2-1所示。
图2-1 8位8段LED动态显示器电原理图
图2-1所示为一个8位8段LED动态显示器电路原理图。其中段选线占用一个8位I/O口,位选线占用一个8位I/O口,由于各位的段选线并联,段线码的输出对各位来说都是相同的。因此,同一时刻,如果各位位选线都处于选通状态的话,8位LED将显示相同的字符。若要各位LED能够显示出与本位相应的显示字符,就必须采用扫描显示方式,即在某一位的位选线处于选通状态时,其它各位的位选线处于关闭状态,这样,8位LED中只有选通的那一位显示出字符,而其它位则是熄灭的。同样,在下一时刻,只让下一位的位选线处于选通状态,而其他的位选线处于关闭状态。如此循环下去,就可以使各位“同时”显示出将要显示的字符。由于人眼有视觉暂留现象,只要每位显示间隔足够短,则可造成多位同时亮的假象,达到显示的目的。
五、实验步骤
8位共阳极数码管动态扫描显示的单片机电路连线如图2-2所示,图中的三角形符号是加在位选线上的驱动,即74HC245,这一举措使得数码管能够得到合适的亮度。
图2-2 扫描8位LED动态显示器
1、按照图2-2的电路原理,用导线正确连接动态扫描方式实验模块和单片机最小系统模块。
2、示例程序如下:
ORG 0000H
START: MOV R1,#01h
MOV R0,#00H
MOV R2,#08H
DISP: MOV DPTR,#TAB
MOV A,R0
MOVC A,@A+DPTR
MOV P0,A
MOV A,R1
MOV P1,A
ACALL DL10MS
INC R0
MOV A,R1
RL A
MOV R1,A
DJNZ R2,DISP
AJMP START
DL10MS:MOV R7,#01H
DL0: MOV R6,#0FH
DL1: nop
nop
DJNZ R6,DL1
DJNZ R7,DL0
RET
tab: db 03h,09FH,25h,0Dh,099h,49h,41h,01Fh,01h,09h,0BFH
END ; 0 1 2 3 4 5 6 7的字型码
将程序调入仿真器进行调试,直至达到实验要求。
六、实验报告
1. 画出实验电路原理图,并简要分析电路的执行过程。
2. 画出单片机程序的流程图,给出程序清单,并给予适当注释。
3. 电路中74HC245的作用是什么?
4. 如果将数码管换成共阳极,电路中要做那些修改?程序中要做哪些修改,给出共阳极数码管动态扫描显示的电路和程序清单。
5.实验过程中遇到哪些问题,是如何解决的?
第二篇:数码管动态扫描实验实验报告及程序
实验七 数码管动态扫描实验
姓名 专业 学号 2010412381 成绩
一、实验目的
1. 掌握Keil C51软件与protues软件联合仿真调试的方法;
2. 掌握单片机对数码管的动态显示控制方式;
3. 掌握定时器的基本使用及编程方法。
二、实验仪器与设备
1.微机1台 2.Keil C51集成开发环境 3.Proteus仿真软件
三、实验内容
1. 用Proteus设计一8位数码管动态扫描显示电路。要求利用P0口 做数码管的段选线,P1.0~P1.2与74LS138译码器的3个输入端相连,其译码输出Y0~Y7作为数码管的位选线。参考电路见后面实验报告。
2. 编写程序,将数字1~8分别显示在8个数码管上,要求显示无闪烁。
3. 延长每个数码管选通的时间(如500ms),观察动态扫描过程。
4. 编写程序,利用Proteus中的“激励源/DCLOCK/数字类型/时钟”产生频率为1HZ的方波输出,并利用定时/计数器T1统计脉冲的个数,将统计结果动态实时的显示在数码管上。
5. 提高时钟频率(如100KHZ),观察显示情况。
四、实验原理
1. 动态扫描法:
1) 动态扫描法是对各数码管循环扫描、轮流显示的方法。由于一次只能让一个数码管显示,因此,要显示8位的数据,必须让数码管一个一个轮流显示才可以,同时每个数码管显示的时间大约在1ms到4ms之间,所以为了保证正确显示,每隔1ms,就得刷新一个数码管。当扫描显示频率较高时,利用人眼的视觉暂留特性,看不出闪烁现象,这种显示需要一个接口完成字型码的输出(段选),另一接口完成各数码管的轮流点亮(位选)。
2) 在进行数码显示的时候,要对显示单元开辟8个显示缓冲区,每个显示缓冲区装有显示的不同数据即可。
3) 对于显示的字型码数据采用查表方法来完成。
2. P0口
P0口作为地址/数据总线使用时是一个真正的双向端口;而作通用I/O口时,只是一个准双向口,由于其内部漏极开路,应外接10KΩ的上拉电阻,否则无法输出高电平。
3. 74LS138:3线—8线译码器
引脚排列:
1
真值表:
五、实验步骤
1.用Proteus设计数码管动态扫描显示电路;
2.在Keil C51中编写键盘识别程序,编译通过后,与Proteus联合调试; 3.启动仿真,观察数码管显示是否正确;
4.用Proteus设计脉冲计数电路,仿真调试、运行程序并查看结果。 六、电路设计、调试及程序
1) 实验电路:
2
2) 实验程序: ‘1’~‘8’显示:
#include<reg51.h>
#define uchar unsigned char #define uint unsigned int uchar code
table[]={0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F}; uchar code
address[]={0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff}; void delay(uint m) {
while(m--); }
void main() {
uchar m=0; while(1) {
if(m==8){ m=0;} P1=address[m]; P0=table[m++]; delay(500); } }
利用T1统计脉冲个数: #include<reg51.h>
#define uchar unsigned char #define uint unsigned int uchar code
table[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6f}; uchar code
address[]={0xff,0xfe,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8};
uchar data dis_buf[8]; uchar i,j; uint count;
unsigned long int num;
void delay(uint m) {
while(m--);
}
void display() {
while(1) {
num=count*65536+TH1*256+TL1; for(j=0;j<8;j++) {
dis_buf[j]=num%10, num=num/10; }
for(i=0;i<8;i++) {
P1=address[i];
P0=table[dis_buf[i]]; delay(500); }
if(num>99999999) {
num=0;count=0;delay(500); } } }
void main() {
TMOD=0x50; TH1=0x00; TL1=0x00; EA=1; ET1=1; TR1=1;
display(); }
void time1(void) interrupt 3 {
TH1=0x00; TL1=0x00; count++; }
3
3) 调试过程及结果分析
分别对两个实验内容进行仿真调试,调整延时时间与时钟频率,观察两个实验内容的变化。内容一中数字1~8分别无闪烁的显示在了数码管上,延长扫描时间后,观察到数字从左到右循环扫描;内容二中脉冲个数以数字时钟的周期间隔显示在数码管上,提高时钟频率后,速度相应加快。
七、实验问题、解决及总结
实验内容一没有什么问题,内容二中考虑到取值范围,应将总计数脉冲数num定义为无符号长整形变量,实验时会出现计数不到99999999就返回的情况,原因是计数变量count应定义为无符号整型变量,否则计数超出范围。另外,程序将八位数字全部写出后作为table【】的未知变量显得啰嗦冗长,可用一个for循环代替,循环中令dis_buf【】=num%10;num=num/10;即可实现取出8位数字的功能。
通过本次实验,掌握了数码管的动态扫描方法,也掌握了定时器的计数功能的使用方法,并且更加熟练地将零散的程序模块组合成一个完整的程序,能更快的找到程序中的问题。
4