数码管实验报告

单片机实验报告

一、实验名称

数码管动态扫描显示01234567(实验五)

二、实验目的

(1)掌握数码管显示数字的原理。

(2)通过不同的编程实现灵活运用数码管。

三、实验原理

    数码管由7个发光二极管组成8字形构成的,加上小数点就是8个,分别把它命名为A,B,C,D,E,F,G,H。在共阳接法中,0(低电平)亮,1(高电平)灭。

原理图中把所有数码管的8个笔划段A-H同名端连在一起,而每一个显示器的公共机COM是各自独立受I\O线控制。CPU向字段输出口送出字型码时,所有显示器接收到的字型码相同。由8个PNP的三极管来控制这8位哪一位工作。在单片机里,首先显示一个数,然后关掉,然后在显示第二个数,又关掉,那么将看到连续的而数字显示,轮流点亮撒哦i案过程中,每位显示器的点亮时间是极为短暂的,由于人的视觉暂留和发光二级管的余光效应,是的给人的印象是一组稳定的显示数据,不会有闪烁感。

四、相关原理图

 

单片机实验报告

 

五、实验内容

数码管显示12345678

c程序:

#include <reg51.h>

#include <intrins.h>

unsigned char data dis_digit;

unsigned char code dis_code[11]={ 0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20,

0x60,0xff};//0,1,2,3,4,5,6,7,8,9,关显示,数码管码表

unsigned char data dis_buf[8];// 显示缓冲区

单片机实验报告

unsigned char data dis_index;

char code SST516[3] _at_ 0x003b;

void main()

{

       P0 = 0xff;

       P2 = 0xff;

       TMOD = 0x01;

       TH0 = 0xFC;

       TL0 = 0x17;

       IE = 0x82;

       dis_buf[0] = dis_code[0x1];

       dis_buf[1] = dis_code[0x2];

       dis_buf[2] = dis_code[0x3];

       dis_buf[3] = dis_code[0x4];

       dis_buf[4] = dis_code[0x5];

       dis_buf[5] = dis_code[0x6];

       dis_buf[6] = dis_code[0x7];

       dis_buf[7] = dis_code[0x8]; 

       dis_digit = 0xfe;

       dis_index = 0;

       TR0 = 1;

       while(1);}

void timer0() interrupt 1

// 定时器0中断服务程序, 用于数码管的动态扫描

// dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量

// dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,

//                          选通P2.0口数码管

// dis_buf   --- 显于缓冲区基地址   

{

       TH0 = 0xFC;

       TL0 = 0x17;  

       P2 = 0xff;                                         // 先关闭所有数码管

       P0 = dis_buf[dis_index];                            // 显示代码传送到P0口

       P2 = dis_digit;                                          //

       dis_digit = _crol_(dis_digit,1);                   // 位选通值左移, 下次中断时选通下一位数码管

       dis_index++;                                      //                               

       dis_index &= 0x07;                                   // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描

}

单片机实验报告

汇编程序:

CODE_SEG    SEGMENT CODE

DATA_SEG    SEGMENT DATA

    RSEG  DATA_SEG 

dis_digit:  DS      1

dis_index:  DS      1

dis_buf:    DS      8

stack:      DS      20

;===========================================================

CSEG    AT  00000H              ; Reset向量

    LJMP    MAIN

CSEG    AT  0000BH              ; 定时器0中断向量

    LJMP    TIMER0

;===========================================================

    RSEG  CODE_SEG 

    ORG   0080h

MAIN:

    MOV SP,#(stack-1)           ; 初始化堆栈指针

    MOV     P0,#0FFH            ; 初始化I/O口

    MOV     P2,#0FFH

    MOV     TMOD,#01H           ; 初始化timer0

    MOV     TH0,#0FCH

    MOV     TL0,#017H

    MOV     IE,#082H

   

    MOV DPTR, #DIS_CODE         ; 设定显示初值

    MOV A,#1

    MOVC    A,@A+DPTR

    MOV     dis_buf,A

    MOV A,#2

    MOVC    A,@A+DPTR  

    MOV     dis_buf+01H,A

    MOV A,#3

    MOVC    A,@A+DPTR

    MOV     dis_buf+02H,A

    MOV A,#4

    MOVC    A,@A+DPTR

    MOV     dis_buf+03H,A

单片机实验报告

    MOV A,#5

    MOVC    A,@A+DPTR

    MOV     dis_buf+04H,A

    MOV A,#6

    MOVC    A,@A+DPTR

    MOV     dis_buf+05H,A

    MOV A,#7

    MOVC    A,@A+DPTR

    MOV     dis_buf+06H,A

    MOV A,#8

    MOVC    A,@A+DPTR

    MOV     dis_buf+07H,A  

    MOV     dis_digit,#0FEH         ; 初始从第一个数码管开始扫描

    MOV     dis_index,A

    SETB    TR0             ; 启动定时器0,开始动态扫描显示

MAIN_LP:                   

    ; 主程序循环,增加其它代码             

    SJMP    MAIN_LP

;===========================================================

    USING   0

TIMER0:

; 定时器0中断服程序, 用于数码管的动态扫描

; DIS_INDEX --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量

; DIS_DIGIT --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,

;       选通P2.0口数码管

; DIS_BUF   --- 显于缓冲区基地址       

    PUSH    ACC

    PUSH    PSW

    PUSH    AR0

    MOV     TH0,#0FCH

    MOV     TL0,#017H  

    MOV     P2,#0FFH        ; 先关闭所有数码管 

    MOV     A,#DIS_BUF      ; 获得显示缓冲区基地址

    ADD     A,DIS_INDEX     ; 获得偏移量

    MOV     R0,A            ; R0 = 基地址 + 偏移量

    MOV     A,@R0           ; 获得显示代码

    MOV     P0,A            ; 显示代码传送到P0口  

    MOV     P2,DIS_DIGIT        ;

    MOV A,DIS_DIGIT     ; 位选通值左移, 下次中断时选通下一位数码管

    RL  A

    单片机实验报告

    MOV DIS_DIGIT,A

    INC DIS_INDEX       ; DIS_INDEX加1, 下次中断时显示下一位

    ANL DIS_INDEX,#0x07     ; 当DIS_INDEX等于8(0000 1000)时, 清0

    POP     AR0

    POP     PSW

    POP     ACC

    RETI

; END OF timer0

;===========================================================

    RSEG  CODE_SEG

DIS_CODE:

 DB  28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h,30h,25h,0a9h,26h,0a1h,0b1h;数码管代码

    END

六、实验运行

 

第二篇:数码管实验报告

单片机仿真实验报告二:数码管

一、    仿真设计要求

用简单的汇编语言实现,利用AT89C52单片机的P0端口的P0.0~P0.7连接到一个共阴数码管的笔段上,数码管公共端接地。在数码管上循环显示0~9数字,时间间隔0.2S.

二、    数码管电路原理图

三、    程序设计内容及源程序


MAIN:MOV P0,#3FH

     ACALL DELAY

     MOV P0,#06H

     ACALL DELAY

     MOV P0,#5BH

        ACALL DELAY

     MOV P0,#4FH

        ACALL DELAY

        MOV P0,#66H

        ACALL DELAY

        MOV P0,#6DH

        ACALL DELAY

        MOV P0,#7DH

        ACALL DELAY

        MOV P0,#07H

        ACALL DELAY

        MOV P0,#7FH

           ACALL DELAY

           MOV P0,#6FH

           ACALL DELAY

        AJMP MAIN

DELAY: MOV R7,#255

   Y1:  MOV R6,#255

        DJNZ R6,$

       DJNZ R7,Y1

       RET

       END


四、    实验总结

了解二极管共阴共阳实验原理,运用了延时程序。

相关推荐