数码管动态扫描实验实验报告及程序

实验七 数码管动态扫描实验

姓名 专业 学号 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

 

第二篇:数码管动态扫描显示实验

实验三  定时器和中断实验

一、实验目的

1、学习51单片机内部定时器的使用方法。

2、掌握中断处理程序的方法。

3、掌握数码管与单片机的连接方法和简单显示编程方法。

4、学习和理解数码管动态扫描的工作原理。

二、实验内容

1、使用定时器T0,定时1秒,控制P1口发光管循环点亮。

2、使用定时器T0,定时1秒,控制1个数码管循环显示数字0~9,每秒钟数字加一。

3、使用软件定时1秒,控制2个数码管循环显示秒数0~59,每秒钟数字加一。

4、使用定时器T0,定时1秒,控制2个数码管循环显示秒数0~59,每秒钟数字加一。

三、实验电路图

四、实验说明

1、数码管的基本概念

(1) 段码

数码管中的每一段相当于一个发光二极管,8段数码管则具有8个发光二极管。本次实验使用的是共阴数码管,公共端是1、6,公共端置0,则某段选线置1相应的段就亮。公共端1控制左面的数码管;公共端6控制右面的数码管。正面看数码管的引脚、段选线和数据线的对应关系为:

            

图1  数码管封装图              图2  数据线与数码管管脚连接关系

段码是指在数码管显示某一数字或字符时,在数码管各段所对应的引脚上所加的高低电平按顺序排列所组成的一个数字,它与数码管的类型(共阴、共阳)和与数据线的连接顺序有关。

(2)位码

位码也叫位选,用于选中某一位数码管。在实验图中要使第一个数码管显示数据,应在公共端1上加低电平,即使P2.7口为0,而公共端6上加高电平,即使P2.6口为1。位码与段码一样和硬件连接有关。

(3)拉电流与灌电流

单片机的I/O 口与其他电路连接时,I/O 电流的流向有两种情况:一种是当该I/O 口为高电平时,电流从单片机往外流,称作拉电流;另一种是该I/O 口为低电平时,电流往单片机内流,称为灌电流。一般I/O 的灌电流负载能力远大于拉电流负载能力,对于一般的51 单片机而言,拉电流最大4mA,灌电流为20mA。一般在数码管显示电路中采用灌电流方式(用共阳数码管),可以得到更高的亮度。本实验电路中采用拉电流方式(用共阴数码管)。

2、多位数码管的动态显示

在多位8段数码管显示时,为了简化硬件电路,通常将所有位的段选线相应地并联在一起,由一个单片机的8位I/O口控制,形成段选线的多路复用。而各位数码管的共阳极或共阴极分别由单片机独立的I/O口线控制,顺序循环地点亮每位数码管,这样的数码管驱动方式就称为“动态扫描”。在这种方式中,虽然每一时刻只选通一位数码管,但由于人眼具有一定的“视觉残留”,只要延时时间设置恰当,便会感觉到多位数码管同时被点亮了。

多位8段LED动态显示器电路,其中段选线占用一个8位I/O口,位选线占用一个8位I/O口,由于各位的段选线并联,段线码的输出对各位来说都是相同的。因此,同一时刻,如果各位位选线都处于选通状态的话,8位LED将显示相同的字符。若要各位LED能够显示出与本位相应的显示字符,就必须采用扫描显示方式,即在某一位的位选线处于选通状态时,其它各位的位选线处于关闭状态,这样,8位LED中只有选通的那一位显示出字符,而其它位则是熄灭的。同样,在下一时刻,只让下一位的位选线处于选通状态,而其他的位选线处于关闭状态。如此循环下去,就可以使各位“同时”显示出将要显示的字符。由于人眼有视觉暂留现象,只要每位显示间隔足够短,则可造成多位同时亮的假象,达到显示的目的。

3、定时器

内部定时/计数器用作定时器时,是对机器周期计数。每个机器周期的长度是12个振荡器周期。当为定时工作方式1时,定时时间的计算公式为:

(216—计数初值)╳晶振周期╳12    或   (216—计数初值)╳机器周期

因为实验系统的晶振12MHZ,机器周期等于1us。最大定时时间为:

 (216—0)╳1/12╳10-6╳12=65536╳10-6(s)= 65.536ms。

所以需要配合软件记数。如要延时1秒,T0取最大定时时间,则需要T0中断16次,所用时间为

65536*16=1048576μs≈1s

因此在T0中断处理程序中,要判断中断次数是否到16次,若不到16次,则只使中断次数加1,然后返回,若到了16次,定时1秒时间到。

如要延时1秒,T0取50ms定时时间,则需要T0中断20次,所用时间为

50ms*20=1000ms=1s

因此在T0中断处理程序中,要判断中断次数是否到20次,若不到20次,则只使中断次数加1,然后返回,若到了20次,定时1秒时间到。

五、参考程序框图及部分程序

1、使用定时器T1,定时1秒,控制P1口发光管循环点亮。

 

;利用定时器精确延时1秒

;循环点亮P1口接的八只发光二极管。 

ORG 0000H

AJMP START

ORG 001BH  ;T1中断入口地址

AJMP INT_T1

ORG  0030H

START:     MOV  SP,#60H

    MOV TMOD,#10H ;置T1为方式1

    MOV TL1,#0B0H  ;延时50mS的时间常数

    MOV TH1,#3CH

    MOV R0,#0FEH

    MOV R1,#20

    SETB TR1;启动定时器1,开始定时

    SETB ET1

    SETB EA   ;开中断

    SJMP $

INT_T1:;T1中断服务子程序

    PUSH ACC;保护现场

    PUSH PSW

    PUSH DPL

    PUSH DPH

    CLR TR1;关闭定时器1,停止定时

    MOV TL1,#0B0H;定时50mS常数

    MOV TH1,#3CH      

    DJNZ R1,EXIT

    MOV  R1,#20;延时一秒的常数

    MOV  A,R0;

    MOV  P1,A  ;送P1口显示

    SETB C

    RLC A

    MOV R0,A

EXIT: SETB TR1;启动定时器1,开始定时

    POP DPH;恢复现场

    POP DPL

    POP PSW

    POP ACC

RETI

END

2、使用定时器T0,定时1秒,控制1个数码管循环显示数字0~9,每秒钟数字加一。

 

ORG 0000H

AJMP START

ORG 000BH  ;T0中断入口地址

AJMP INT_T0

ORG  0030H

START:     MOV  SP,#60H

    MOV TMOD,#01H ;置T0为方式1

    MOV TL0,#0B0H  ;延时50mS的时间常数

    MOV TH0,#3CH

    MOV R0,#00H   ;数码管显示单元

    MOV R1,#20    ;定时次数

    SETB TR0;启动定时器1,开始定时

    SETB ET0

    SETB EA   ;开中断

Slop:  acall display

        SJMP Slop

INT_T0:;T0中断服务子程序

    PUSH ACC;保护现场

    PUSH PSW

    PUSH DPL

    PUSH DPH

    CLR TR0;关闭定时器1,停止定时

    MOV TL0,#0B0H;延时50mS常数

    MOV TH0,#3CH      

    DJNZ R1,EXIT

    MOV  R1,#20;重置定时次数

    MOV A,R0

    INC A  ;数码管显示单元内容加一

    MOV R0,A

    CJNE A,#10,EXIT

    MOV R0,#00H   ; 数码管显示单元清0

EXIT: SETB TR0;启动定时器0,开始定时

    POP DPH;恢复现场

    POP DPL

    POP PSW

    POP ACC

RETI

;显示子程序

display: mov a,R0     

    mov dptr,#numtab;指定查表启始地址

    MOVC A,@A+DPTR    ;得到段码

    mov P0,a   ; 段码送P0口

    clr P2.7   ;送位码

    acall delay1 ;延时10ms

    setb P2.7

    ret

;延时子程序

delay1:MOV    R2,#20

L1:    MOV    R3,#248

    DJNZ   R3,$

    DJNZ   R2,L1

    RET

;实验板上的7段数码管0~9数字的共阴显示代码

numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH

END

3、使用软件定时1秒,控制2个数码管循环显示秒数0~59,每秒钟数字加一。

(1)在设计过程中使用一个存储单元作为秒计数单元,当一秒钟到来时,就让秒计数单元加1,当秒计数达到60时,就自动返回到0,重新秒计数。

(2)对于秒计数单元中的数据要把它十位数和个数分开,方法一:采用对10整除和对10求余;方法二:采用分数、合数法。

(3)在数码管上显示数,通过查表的方式完成。

(4)一秒时间的产生采用软件精确延时的方法来完成,经过精确计算得到1秒时间为1.002秒。

 方法一汇编源程序

;----------10毫秒延时子程序

DELY10ms:  MOV R4,#20

D1: MOV R5,#248

    DJNZ R5,$

    DJNZ R4,D1

RET

;-------主程序

Second EQU 30H
ORG 0
START: acall init

NEXT: acall display

       Ljmp next

Init: MOV Second,#00H

       ret

display: MOV R3,#50

dis2:MOV A,Second
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR

MOV P0,A      ;送出十位数字的段码

CLR p2.7      ;送位码

Acall dely10ms

Setb p2.7
MOV A,B
MOVC A,@A+DPTR

MOV P0,A      ;送出个位数字的段码
CLR p2.6
LCALL DELY10mS

Setb p2.6

djnz r3,dis2 ;20毫秒循环执行50次,时间约1秒

INC Second
MOV A,Second
CJNE A,#60,ret0

Mov Second,#00h

Ret0: ret
TABLE: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH

END

方法二汇编程序:

temp equ 22h ;计数器个位和十位数值存放内存位置

ORG 0000H     ;程序执行开始地址

LJMP START        ;跳到标号START执行

;-------------------- 主程序 ---------------------------

START:     mov temp,#0   ;初始化计数器,从0开始

stlop:     acall display ;调用显示子程序

        acall add1 ;对计数器加1

        mov a,temp

        cjne a,#60H,next ;判断计数器是否满60?

        mov temp,#0   ;满60就清零重新开始

        next:  ljmp stlop ;不满就循环执行

;显示子程序

display:   mov r1,#50

dis1:      mov a,temp    ;将temp中的十六进制数转换成10进制

        anl a,#0Fh

        mov dptr,#numtab;指定查表启始地址

        MOVC A,@A+DPTR    ;查数字的段码

        mov P0,a   ;送出个位数字的段码

        clr P2.7   ;送出位码

        acall delay1 ;显示10ms

        setb P2.7     ;关闭位选

        mov a,temp;将temp中的十六进制数转换成10进制

        anl a,#0F0h

        swap a

        mov dptr,#numtab;指定查表启始地址

        MOVC A,@A+DPTR    ;查数字的段码

        mov P0,a   ;送出十位数字的段码

        clr P2.6   ;送位码

        acall delay1 ;显示10ms

        setb P2.6

       djnz r1,dis1

        ret

;延时子程序

delay1:MOV    R2,#20

L1:    MOV    R3,#248

        DJNZ   R3,$

        DJNZ   R2,L1

        RET

;加一子程序

add1:  mov a,temp

        inc a

       da a

       mov temp,a

        ret

;实验板上的7段数码管0~9数字的共阴显示代码

numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH

end

4、使用定时器T0,定时1秒,控制2个数码管循环显示秒数0~59,每秒钟数字加一。

本题请大家参考前面的例题独立完成。

六、实验报告

1、说明实验目的和内容。

2、画出实验电路原理图,并简要分析电路的执行过程。

3、完成实验内容(4)的程序设计框图并说明编程思想,并给出程序清单。

4、根据实验内容,调式程序,观察、分析程序的运行过程。

5、给出实验结果并进行分析。

6、实验体会。

七、预习实验四

相关推荐