南昌大学单片机实验报告上交稿

实  验  报  告

实验课程:       单片机原理与应用实验         

学生姓名:             刘路平                 

    号:            5502211040               

专业班级:      电力系统及其自动化111       

         

20##年 12 月 16 日

  南昌大学实验报告

学生姓名:   刘路平          号: 5502211040   专业班级:    电力系统111      

实验类型:□ 验证 □ 综合 □ 设计创新 实验日期:         实验成绩:             

                     实验一 I/O 口输入、输出实验

一、实验目的

掌握单片机P1口、P3口的使用方法。

二、实验内容

以P1 口为输出口,接八位逻辑电平显示,LED 显示跑马灯效果。以P3 口为输入口,接八

位逻辑电平输出,用来控制跑马灯的方向。

三、实验要求

根据实验内容编写一个程序,并在实验仪上调试和验证。

四、实验说明和电路原理图

P1口是准双向口,它作为输出口时与一般的双向口使用方法相同。由准双向口结构可知当

P1口作为输入口时,必须先对它置高电平使内部MOS管截止。因为内部上拉电阻阻值是20K~40K,

故不会对外部输入产生影响。若不先对它置高,且原来是低电平,则MOS管导通,读入的数据是

不正确的。

本实验需要用到CPU模块(F3区)和八位逻辑电平输出模块(E4区)和八位逻辑电平显示模

块(B5区),八位逻辑电平输出电路原理图参见图1-1。八位逻辑电平显示电路原理图参见图1-2。

五、实验预习要求

学习教材的相关内容,根据实验要求画出程序流程图,写出实验程序。

六、实验步骤

1)系统各跳线器处在初始设置状态。

用导线连接八位逻辑电平输出模块的K0 到CPU 模块的RXD(P3.0 口);

用8 位数据线连接八位逻辑电平显示模块的JD4B 到CPU 模块的JD8(P1 口)。

2)启动PC 机,打开THGMW-51 软件,输入源程序,并编译源程序。编译无误后,下载程序

运行。

3)观察发光二极管显示跑马灯效果,拨动K0 可改变跑马灯的方向。

七、实验程序

本实验程序

;//******************************************************************

;文件名: Port for MCU51

;功能: I/O口输入、输出实验

;接线: 用导线连接八位逻辑电平输出模块的K0到CPU模块的RXD(P3.0口);

;      用8位数据线连接八位逻辑电平显示模块的JD2B到CPU模块的JD8(P1口)。

;//******************************************************************

实验程序一:

DIR    BIT   P3.1

       ORG   0000H

       LJMP  START

       ORG   0200H

START:    

Output1:   

       mov   A, #0fEH     ;把11111110二进制赋给A变量

       mov   R5, #8       ;把8送到R5寄存器中

loop1:

       CLR   C             ;把标志位清零

       mov   C,DIR         ;读入开关K0的值

       JC    Output2       ;K0的状态为1则跳转到Output2

       mov   P1, A         ;从P1口输出A的值并显示在二极管上,该位为0则相应的二极管点亮

       rl    A               ;把A进行循环左移,相当于把0进行左移,由此二极管从右到左依次点亮向左的跑马灯

       AcAll  Delay         ;调用延时子程序

       djnz  R5, loop1      ;判断R5中的值是否为0,来判断是否重新置数,为0就跳到Output1,否则继续loop1

       Sjmp  Output1

      

Output2:   

       mov   A, #07fH      ;把01111111二进制赋给A变量

       mov   R5, #8         ;把8送到R5寄存器中

loop2:

       CLR   C              ;把标志位清零

       mov   C,DIR           ;读入开关K0的值

       JNC   Output1              ;K0的状态为0则跳转到Output1

       mov   P1, A          ;从P1口输出A的值并显示在二极管上,该位为0则相应的二极管点亮

       rr    A                  ;把A进行循环右移,相当于把0进行左移,由此二极管从左到右依次点亮向右的跑马灯

       AcAll Delay            ;调用延时子程序

       djnz  R5,loop2       ;判断R5中的值是否为0,来判断是否重新置数,为0就跳到Output2,否则继续loop2

       Sjmp  Output2

Delay:                         ;0减1后为-1其补码为11111111

       mov   R6,#0             ;该延时为双重循环,总延时约为(1+1+(1+1+2)*257+2+(1+(1+1+2)*257)*256)us= 0.264456s这个值与实验现象很匹配    

DelayLoop1:

       mov   R7,#0

DelayLoop2:

       NOP                     ;空指令

       NOP           

       djnz  R7,DelayLoop2     ;R7中值为0则跳转

       djnz  R6,DelayLoop1      ;R6中值为0则跳转

       ret

       end

实验程序二:

DIR    BIT   P3.1

       ORG   0000H

       LJMP  START

       ORG   0200H

START:    

Output1:   

       mov   A, #0fEH     ;把11111110二进制赋给A变量

loop1:

       CLR   C             ;把标志位清零

       mov   C,DIR         ;读入开关K0的值

       JC    loop2      ;K0的状态为1则跳转到loop2

       mov   P1, A         ;从P1口输出A的值并显示在二极管上,该位为0则相应的二极管点亮

       rl    A               ;把A进行循环左移,相当于把0进行左移,由此二极管从右到左依次点亮向左的跑马灯

       AcAll  Delay         ;调用延时子程序

       Sjmp  loop1

 loop2:

       CLR   C              ;把标志位清零

       mov   C,DIR           ;读入开关K0的值

       JNC  loop1            ;K0的状态为0则跳转到loop1

       mov   P1, A          ;从P1口输出A的值并显示在二极管上,该位为0则相应的二极管点亮

       rr    A                  ;把A进行循环右移,相当于把0进行左移,由此二极管从左到右依次点亮向右的跑马灯

       AcAll Delay            ;调用延时子程序

      Sjmp  loop2

Delay:                         ;0减1后为-1其补码为11111111

       mov   R6,#0             ;该延时为双重循环,总延时约为(1+1+(1+1+2)*257+2+(1+(1+1+2)*257)*256)us= 0.264456s这个值与实验现象很匹配    

DelayLoop1:

       mov   R7,#0

DelayLoop2:

       NOP                     ;空指令

       NOP           

       djnz  R7,DelayLoop2     ;R7中值为0则跳转

       djnz  R6,DelayLoop1      ;R6中值为0则跳转

       ret

       end

八、结果分析:

运行程序1后,拨动开关K0,可以实现两种流水灯方式的选择,即可以实现左移和右移,这主要是由语句JC    Output2   和JNC   Output1      语句实现的,当K0拨到下面时,其状态为0跳转到Output1所以跑马灯为从右向左一次点亮,间隔大约为(1+1+(1+1+2)*257+2+(1+(1+1+2)*257)*256)us= 0.264456s,当K0拨到上面时,其状态为1,跳转到Output2,所以跑马灯为从左向右一次点亮,间隔大约为(1+1+(1+1+2)*257+2+(1+(1+1+2)*257)*256)us= 0.264456s。

综合分析,本实验主要有3个模块:左移模块,右移模块和延时模块构成。

运行程序2后,拨动开关K0,可以实现两种流水灯方式的选择,即可以实现左移和右移,这主要是由语句JC    loop1   和JNC   loop2      语句实现的,和实验程序1的主要差别就是当拨动开关后,直接进行方向的改变,而不是像程序1那样返回到始端在进行方向的反转。

九、实验心得 

从这个实验中我们了解到如何用P1口输出来点亮二极管,也学会了如何根据具体的单片机的原理图进行编写程序,及线路的连接。 通过这次实验我了解了单片机芯片的结构及编程方法。巩固了汇编语言编程的能力。进一步加深了对汇编语言的认识。对延时程序进一步的应用,对编程的能力有了提高通过实验还学会了流水灯的实现方法和实现延时的程序编写方法,这为下面的实验做好了充分的准备。

  南昌大学实验报告

学生姓名:   刘路平          号: 5502211040   专业班级:    电力系统111      

实验类型:□ 验证 □ 综合 □ 设计创新 实验日期:         实验成绩:          

                        实验二 外部中断实验

一、实验目的

学习外部中断技术的基本使用方法。

二、实验内容

INT0 端接单次脉冲发生器。按一次脉冲产生一次中断,CPU 使P1.0 状态发生一次反转,P1.0接LED 灯,以查看信号反转。

三、实验要求

根据实验内容编写一个程序,并在实验仪上调试和验证。

四、实验说明和电路原理图

1) 外部中断的初始化设置共有三项内容:中断总允许即EA=1,外部中断允许即EXi=1(i=0或1),中断方式设置。中断方式设置一般有两种方式:电平方式和脉冲方式,本实验选用后者,其前一次为高电平后一次为低电平时为有效中断请求。因此高电平状态和低电平状态至少维持一个周期,中断请求信号由引脚INT0(P3.2)和INT1(P3.3)引入。

2)中断服务的关键:

a、保护进入中断时的状态。

堆栈有保护断点和保护现场的功能使用PUSH 指令,在转中断服务程序之前把单片机中有关寄存单元的内容保护起来。

b、必须在中断服务程序中设定是否允许中断重入,即设置EX0 位。

c、用POP 指令恢复中断时的现场。

3)中断控制原理:中断控制是提供给用户使用的中断控制手段。实际上就是控制一些寄存器,51 系列用于此目的的控制寄存器有四个:TCON 、IE 、SCON 及IP。

4)中断响应的过程:首先中断采样然后中断查询最后中断响应。采样是中断处理的第一步,对于本实验的脉冲方式的中断请求,若在两个相邻周期采样先高电平后低电平则中断请求有效,IE0 或IE1 置“1”;否则继续为“0”。所谓查询就是由CPU 测试TCON 和SCON 中各标志位的状态以确定有没有中断请求发生以及是那一个中断请求。中断响应就是对中断请求的接受,是在中断查询之后进行的,当查询到有效的中断请求后就响应一次中断。

本实验需要用到CPU 模块(F3 区)和八位逻辑电平显示模块(B5 区)、单次脉冲模块(E3

区)。

五、实验预习要求

学习教材的相关内容,根据实验要求画出程序流程图,写出实验程序。

六、实验步骤

1)系统各跳线器处在初始设置状态,用导线连接单次脉冲模块的输出端到CPU 模块的P32;CPU 模块的P10 接八位逻辑电平显示模块的灯。

2)启动PC 机,打开THGMW-51 软件,输入源程序,并编译源程序。编译无误后,下载程序运行。

3)连续按动单次脉冲产生电路的按键,发光二极管L0 每按一次状态取反,即隔一次点亮。

七、实验程序

本实验程序

;//*************************************************

;文件名: EXint for MCU51

;功能: 外部中断实验

;接线: 导线连接单次脉冲模块的输出端到CPU模块的P32,   

;      CPU模块的P10接八位逻辑电平显示模块的L0灯。

;//*************************************************

       LED    BIT   P1.0

       LEDBuf BIT   20H

       org     0

       ljmp    Start

       org     3

Interrupt0:

       push    PSW         ; 保护现场

       cpl     LEDBuf      ; 取反LED

       mov     c, LEDBuf

       mov     LED, c

       pop     PSW         ; 恢复现场

       reti               ; 返回主程序

Start:

       clr     LEDBuf     ;20H清0

       clr     LED          ; P1.0清0

       mov     TCON, #01h  ; 外部中断0下降沿触发

       mov     IE, #81h    ; 打开外部中断允许位(EX0)及总中断允许位(EA)

OK:    ljmp    OK

       end

                                                                  

八、结果分析:

运行程序后,连续按动单次脉冲产生电路的按键,发光二极管L0 每按一次状态取反,即隔一次点亮,综合分析,本实验主要有2个模块:中断模块和主程序模块,主程序主要是用来初始化中断的,包括中断模式的选择,中断开关的打开,当脉冲变化时触发中断,硬件自动产生ACALL指令,跳转到中端口执行程序。

九、实验心得 

从这个实验中我们了解到单次脉冲产生电路,也学会了如何通过外部的控制,达到对中断的处理,对于中断处理,主要有一下几个过程:在主程序中主要是中断的控制寄存器的设置,中断开关的设置,以及对中断程序的编写经过试验的调试,我知道了整个程序的运行方式。 通过这次实验我了解了单片机芯片的结构及编程方法。巩固了汇编语言编程的能力。进一步加深了对汇编语言的认识,以及软件,硬件的结合有了深入的理解。

  南昌大学实验报告

学生姓名:   刘路平          号: 5502211040   专业班级:    电力系统111      

实验类型:□ 验证 □ 综合 □ 设计创新 实验日期:         实验成绩:          

                        实验三 定时/计数器实验

一、实验目的

学习MCS-51 内部计数器的使用和编程方法。

二、实验内容

使用MCS-51 内部定时/计数器,定时一秒钟,CPU 运用定时中断方式,实现每一秒钟输出状态发生一次反转,即发光管每隔一秒钟亮一次。

三、实验要求

根据实验内容编写一个程序,并在实验仪上调试和验证。

四、实验说明

关于内部计数器的编程主要是定时常数的设置和有关控制寄存器的设置。内部计数器在单片机中主要有定时器和计数器两个功能。本实验使用的是定时器,定时为一秒钟。

定时器有关的寄存器有工作方式寄存器TMOD 和控制寄存器TCON。TMOD 用于设置定时器/

计数器的工作方式0-3,并确定用于定时还是用于计数。TCON 主要功能是为定时器在溢出时设定标志位,并控制定时器的运行或停止等。

内部计数器用作定时器时,是对机器周期计数。每个机器周期的长度是12 个振荡器周期。假设实验系统的晶振是12MHZ,程序工作于方式2,即8 位自动重装方式定时器, 定时器100uS中断一次, 所以定时常数的设置可按以下方法计算:

机器周期=12÷12MHz=1uS

(256-定时常数)×1uS=100uS

定时常数=156。然后对100uS 中断次数计数10000 次,就是1 秒钟。

在本实验的中断处理程序中,因为中断定时常数的设置对中断程序的运行起到关键作用,所以在置数前要先关对应的中断,置数完之后再打开相应的中断。

本实验需要用到CPU 模块(F3 区)和八位逻辑电平显示模块(B5 区)。

五、实验预习要求

学习教材的相关内容,根据实验要求画出程序流程图,写出实验程序。

六、实验步骤

1)系统各跳线器处在初始设置状态,用导线连接CPU 模块P10 到八位逻辑电平显示模块的L0。

2)启动PC 机,打开THGMW-51 软件,输入源程序,并编译源程序。编译无误后,下载程序运行。

3)运行程序观察发光二极管隔一秒点亮一次,点亮时间为一秒。

七、实验程序

本实验程序

;//*************************************************

;文件名: Timer for MCU51

;功能: 定时/计数器实验

;接线: 导线连接CPU模块P10到八位逻辑电平显示模块的L0.

;//*************************************************

       Tick    equ  10000    ; 10000 x 100us = 1s

       T100us  equ  156      ; 100us时间常数(6M)

       C100us  equ  30h      ; 100us记数单元                      

       LEDBuf  bit  20h

       org     0

       ljmp    Start         ;跳转到Start

       org     000bh         ; 伪代码表明以下地址为000bh

T0Int:

       push    PSW               ; 保存数据,送入堆栈

       mov     a, C100us+1        ; 将计数单元送入a

       jnz     Goon              ; 如果a非0则跳转

       dec     C100us            ; 记数单元减一

Goon:

       dec     C100us+1           ;

       mov     a, C100us

       orl     a, C100us+1       ;只有当计数单元的高位和低位都位0才使得a为0,也就是说只有计满10000次才能跳转

       jnz     Exit            ; 100us 记数器不为0, 返回

       mov     C100us, #27H    ; #high(Tick)

       mov     C100us+1, #10H  ; #low(Tick)

       cpl     LEDBuf          ; 100us 记数器为0, 重置记数器

                               ; 取反LED

Exit:

       pop     PSW

       reti

Start:

       mov     TMOD, #02h         ; 方式2, 定时器

       mov     TH0, #t100us

       mov     TL0, #t100us

       mov     IE, #10000010b     ; EA=1, IT0 = 1

       setb    TR0                ; 开始定时

       clr     LEDBuf

       clr     P1.0

       mov     C100us, #27H       ;#high(Tick)

       mov     C100us+1, #10H     ;#low(Tick)

Loop:

       mov     c, LEDBuf

       mov     P1.0, c

       ljmp    Loop

       end

八、结果分析:

运行程序后,发光二极管L0 每隔一秒点亮一次,实验主要有2个模块:定时初始化模块和中断模块,主程序主要是用来初始化定时的,包括定时模式的选择,为方式2模式,该模式精度高能够准确定时,还包括定时器的初值设定,设定为100us,当定时标志位高电位时自动跳转到中断程序中,如果未满10000次就还得继续返回主程序无法实现CPL    LEDBuf  指令。而要实现本功能,最重要的是  orl     a, C100us+1     这条语句,只有当计数单元的高位和低位都位0才使得a为0,也就是说只有计满10000次才能跳转。否则跳转到exit。

九、实验心得 

通过本次实验,我对单片机的定时/计数功能有了一定的了解,熟悉了定时/计数器的设置,总的来说,单片机的定时器的设置主要是以下几个方面:一是定时器的模式设置,二是定时器的初值设置。本实验也用到了中断,利用中断的方法,实现了LED的反转,相比于查询的方法,提高了单片机的工作效率。另外我也掌握了它的控制和最基本的应用,初步获悉了定时/计数器的内部结构,再结合上一次实验对中断的了解,二者配合,巩固对中断和定时/计数的知识,为下一步的学习打下坚实的基础。 

  南昌大学实验报告

学生姓名:   刘路平          号: 5502211040   专业班级:    电力系统111      

实验类型:□ 验证 □ 综合 □ 设计创新 实验日期:         实验成绩:          

                        实验四 交通灯控制实验

一、实验目的

掌握十字路口交通灯控制方法。

二、实验内容

利用系统提供的双色LED 显示电路,和四位静态数码管显示电路模拟十字路口交通信号灯。4 位LED 数码管显示时间,LED 显示红绿灯状态。

三、实验要求

根据实验内容编写一个程序,并在实验仪上调试和验证。

四、实验说明和电路原理图

交通信号灯控制逻辑如下:假设一个十字路口为东西南北走向。开始为四个路口的红灯全部亮之后,东西路口的绿灯亮,南北路口的红灯亮,东西路口方向通车,延时一段时间后(20 秒),东西路口的绿灯,闪烁若干次后(3 秒),东西路口的绿灯熄灭,同时东西路口的黄灯亮,延时一段时间后(2 秒),东西路口的红灯亮,南北路口的绿灯亮,南北路口方向通车,延时一段时间后(20 秒),南北路口的绿灯闪烁若干次后(3 秒),南北路口的绿灯熄灭,同时南北路口的黄灯亮,延时一段时间后(2 秒),再切换到东西路口的绿灯亮,南北路口的红灯亮,之后重复以上过程。

双色LED 是由一个红色LED 管芯和一个绿色LED 管芯封装在一起,共用负极,当红色正端加高电平,绿色正端加低电平时,红灯亮;红色正端加低电平,绿色正端加高电平时,绿灯亮;两端都加高电平时,黄灯亮。

五、实验程序框图

图4-2 程序流程图

六、实验预习要求

学习教材的相关内容,根据实验要求画出程序流程图,写出实验程序。

七、实验步骤

1)系统各跳线器处在初始设置状态。

P10 同时接G1、G3;P11 同时接R1、R3;P1.2 同时接G2、G4;P1.3 同时接R2、R4;

P1.6、P1.7 分别接静态数码显示的DIN、CLK。

2)启动PC 机,打开THGMW-51 软件,输入源程序,并编译源程序。编译无误后,下载程序运行。

3)观察十字路口交通灯效果。

八、实验程序

本实验程序

;//*******************************************************************

;文件名:交通灯程序 FOR  MCU51

;功能:双色LED模拟交通灯信号,并通过调用静态数码显示状态时间。

;接线:P1.0同时接G1、G3,P1.1接R1、R3,P1.2接G2、G4,P1.3同时接R2、R4,

;      P1.6、P1.7接静态数码显示的DIN、CLK。

;//*******************************************************************   

       SECOND1   EQU   30H     ;东西秒寄存器

       SECOND2   EQU   31H     ;南北秒寄存器

       DBUF      EQU   40H     ;显示缓冲1

       TEMP      EQU   44H     ;显示缓冲2

      

       LED_G1    BIT   P1.0    ;东西绿灯

       LED_R1    BIT   P1.1    ;东西红灯

      

       LED_G2    BIT   P1.2    ;南北绿灯

       LED_R2    BIT   P1.3    ;南北红灯

       Din       BIT   P1.6    ;串行显示数据

       CLK       BIT   P1.7    ;串行显示时钟

       ORG    0000H

       LJMP   START

       ORG    0100H

START:

       LCALL  STATE0       ;调用状态0

       LCALL  DELAY        ;调用延时  

       

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

       MOV    TH0, #3CH    ;置T0定时初值50mS

       MOV    TL0, #0B0H

       SETB   TR0          ;启动T0                                                                                   CLR    EA

LOOP:  MOV    R2,#20       ;置1S计数初值   50mS*20=1S

       MOV    R3,#20       ;红灯20S

       MOV    SECOND1,#25  ;东西秒显示初值25S

       MOV    SECOND2,#25  ;南北秒显示初值25S

       LCALL  DISPLAY

     

       LCALL  STATE1       ;调用状态1

WAIT1: JNB    TF0,WAIT1    ;查询50mS到否

       CLR    TF0

       MOV    TH0, #3CH    ;恢复T0定时初值50mS

       MOV    TL0, #0B0H

       SETB   TR0          ;启动T0

       DJNZ   R2,WAIT1     ;判1S到否?未到继续状态1

       MOV    R2,#20       ;置50mS计数初值                           

       DEC    SECOND1      ;东西秒显示减一

       DEC    SECOND2      ;南北秒显示减一

       LCALL  DISPLAY

       DJNZ   R3,WAIT1     ;状态1维持20S

;***************************************************

       MOV    R2,#5        ;置50mS计数初值  5*4=20

       MOV    R3,#3        ;绿灯闪3S

       MOV    R4,#4        ;闪烁间隔200mS

       MOV    SECOND1,#5   ;东西秒显示初值5S

       MOV    SECOND2,#5   ;南北秒显示初值5S

       LCALL  DISPLAY

WAIT2: LCALL  STATE2       ;调用状态2

       JNB    TF0,WAIT2    ;查询50mS到否

       CLR    TF0

       MOV    TH0, #3CH    ;恢复T0定时初值50mS

       MOV    TL0, #0B0H

       DJNZ   R4,WAIT2     ;判200mS到否?未到继续状态2

       CPL    LED_G1       ;东西绿灯闪

       MOV    R4,#4        ;闪烁间隔200mS

       DJNZ   R2,WAIT2     ;判1S到否?未到继续状态2

       MOV    R2,#5        ;置50mS计数初值

       DEC    SECOND1      ;东西秒显示减一

       DEC    SECOND2      ;南北秒显示减一

       LCALL  DISPLAY

       DJNZ   R3,WAIT2     ;状态2维持3S

;***************************************************

       MOV    R2,#20       ;置50mS计数初值

       MOV    R3,#2        ;黄灯2S

       MOV    SECOND1,#2   ;东西秒显示初值2S

       MOV    SECOND2,#2   ;南北秒显示初值2S

       LCALL  DISPLAY

WAIT3: LCALL  STATE3       ;调用状态3

       JNB    TF0,WAIT3    ;查询30mS到否

       CLR    TF0

       MOV    TH0, #3CH    ;恢复T0定时初值50mS

       MOV    TL0, #0B0H

       DJNZ   R2,WAIT3     ;判1S到否?未到继续状态3

       MOV    R2,#20       ;置50mS计数初值                             

       DEC    SECOND1      ;东西秒显示减一

       DEC    SECOND2      ;南北秒显示减一

       LCALL  DISPLAY

       DJNZ   R3,WAIT3     ;状态3维持2S

;***************************************************

       MOV    R2,#20       ;置50mS计数初值

       MOV    R3,#20       ;红灯20S

       MOV    SECOND1,#25  ;东西秒显示初值25S

       MOV    SECOND2,#25  ;南北秒显示初值25S

       LCALL  DISPLAY

WAIT4: LCALL  STATE4       ;调用状态4

       JNB    TF0,WAIT4    ;查询50mS到否

       CLR    TF0

       MOV    TH0, #3CH    ;恢复T0定时初值50mS

       MOV    TL0, #0B0H

       DJNZ   R2,WAIT4     ;判1S到否?未到继续状态4

       MOV    R2,#20       ;置50mS计数初值

       DEC    SECOND1      ;东西秒显示减一

       DEC    SECOND2      ;南北秒显示减一

       LCALL  DISPLAY

       DJNZ   R3,WAIT4     ;状态4维持20S

;***************************************************

       MOV    R2,#5        ;置50mS计数初值    5*4=20

       MOV    R4,#4        ;闪烁间隔200mS

       MOV    R3,#3        ;绿灯闪3S

       MOV    SECOND1,#5   ;东西秒显示初值5S

       MOV    SECOND2,#5   ;南北秒显示初值5S

       LCALL  DISPLAY

WAIT5: LCALL  STATE5       ;调用状态5

       JNB    TF0,WAIT5    ;查询50mS到否

       CLR    TF0

       MOV    TH0, #3CH    ;恢复T0定时初值100mS

       MOV    TL0, #0B0H

       DJNZ   R4,WAIT5     ;判200mS到否?未到继续状态5

       CPL    LED_G2       ;南北绿灯闪

       MOV    R4,#4        ;闪烁200mS

       DJNZ   R2,WAIT5     ;判1S到否?未到继续状态5

       MOV    R2,#5       ;置100mS计数初值                               

       DEC    SECOND1      ;东西秒显示减一

       DEC    SECOND2      ;南北秒显示减一

       LCALL  DISPLAY

       DJNZ   R3,WAIT5     ;状态5维持3S

;***************************************************

       MOV    R2,#20       ;置50mS计数初值

       MOV    R3,#2        ;黄灯2S

       MOV    SECOND1,#2   ;东西秒显示初值2S

       MOV    SECOND2,#2   ;南北秒显示初值2S

       LCALL  DISPLAY

WAIT6: LCALL  STATE6       ;调用状态6

       JNB    TF0,WAIT6    ;查询100mS到否

       CLR    TF0

       MOV    TH0, #3CH    ;恢复T0定时初值100mS

       MOV    TL0, #0B0H

       DJNZ   R2,WAIT6     ;判1S到否?未到继续状态6

       MOV    R2,#20       ;置100mS计数初值

       DEC    SECOND1      ;东西秒显示减一

       DEC    SECOND2      ;南北秒显示减一

       LCALL  DISPLAY

       DJNZ   R3,WAIT6     ;状态6维持2S

       LJMP   LOOP         ;大循环

STATE0:                    ;状态0

       MOV    P1,#0

       CLR    LED_G1

       SETB   LED_R1       ;东西红灯亮

       CLR    LED_G2

       SETB   LED_R2       ;南北红灯亮

       RET

STATE1:                    ;状态1

       SETB   LED_G1       ;东西绿灯亮

       CLR    LED_R1

       CLR    LED_G2

       SETB   LED_R2       ;南北红灯亮

       RET

STATE2:                    ;状态2

       CLR    LED_R1

       CLR    LED_G2                                                   

       SETB   LED_R2       ;南北红灯亮

       RET

STATE3:                    ;状态3

       SETB    LED_G1

       SETB    LED_R1      ;东西黄灯亮

       CLR     LED_G2

       SETB   LED_R2       ;南北红灯亮

       RET

STATE4:                    ;状态4

       CLR    LED_G1

       SETB   LED_R1       ;东西红灯亮

       SETB   LED_G2       ;南北绿灯亮

       CLR     LED_R2

       RET

STATE5:                    ;状态5

       CLR    LED_G1

       SETB   LED_R1       ;东西红灯亮

       CLR    LED_R2

       RET

STATE6:                    ;状态6

       CLR    LED_G1

       SETB   LED_R1       ;东西红灯亮

       SETB   LED_G2

       SETB   LED_R2       ;南北黄灯亮

       RET

DISPLAY:                   ;数码显示

        MOV   A, SECOND1   ;东西秒寄存器

        MOV   B, #10       ;16进制数拆成两个10进制数

        DIV   AB

        MOV   DBUF+1,A

        MOV   A,B

        MOV   DBUF, A

        MOV   A, SECOND2   ;南北秒寄存器

        MOV   B, #10       ;16进制数拆成两个10进制数

        DIV   AB

        MOV   DBUF+3, A

        MOV   A,B

        MOV   DBUF+2, A                                               

        MOV   R0,#DBUF

        MOV   R1,#TEMP

        MOV   R7,#4

DP10:   MOV   DPTR,#LEDMAP

        MOV   A,@R0

        MOVC  A,@A+DPTR

        MOV   @R1,A

        INC   R0

        INC   R1

        DJNZ  R7,DP10

        MOV   R0,#TEMP

        MOV   R1,#4

DP12:   MOV   R7,#8

        MOV   A,@R0

DP13:   RLC   A

        MOV   DIN,C

        CLR   CLK

        SETB  CLK

        DJNZ  R7,DP13

        INC   R0

        DJNZ  R1,DP12

        RET

LEDMAP: DB  3FH,6,5BH,4FH,66H,6DH ;0,1,2,3,4,5

        DB  7DH,7,7FH,6FH,77H,7CH ;6,7,8,9,A,B

        DB  58H,5EH,7BH,71H,0,40H ;C,D,E,F, , -

Delay: mov   r5, #5

DLoop0:mov   r6, #0

DLoop1:mov   r7, #0

DLoop2:

       NOP

       NOP

       djnz  r7, DLoop2

       djnz  r6, DLoop1

       djnz  r5, DLoop0      

       ret

       END

九、结果分析:

实验现象:运行程序后,开始为四个路口的红灯全部亮之后,东西路口的绿灯亮,南北路口的红灯亮,东西路口方向通车,延时一段时间后(20 秒),东西路口的绿灯,闪烁若干次后(3 秒),东西路口的绿灯熄灭,同时东西路口的黄灯亮,延时一段时间后(2 秒),东西路口的红灯亮,南北路口的绿灯亮,南北路口方向通车,延时一段时间后(20 秒),南北路口的绿灯闪烁若干次后(3 秒),南北路口的绿灯熄灭,同时南北路口的黄灯亮,延时一段时间后(2 秒),再切换到东西路口的绿灯亮,南北路口的红灯亮,之后重复以上过程。

要实现以上功能还必须知道双色LED是由一个红色LED管芯和一个绿色LED管芯封装在一起,公用负端。当红色正端加高电平,绿色正端加低电平时,红灯亮;红色正端加低电平,绿色正端加高电平时,绿灯亮;两端都加高电平时,黄灯亮。也正是源于此,才能够产生黄色信号

    分析:本实验共分为5个模块,交通灯初始模块,6种交通状态的调用模块,6种交通状态和1个初始状态模块,显示模块,以及延时模块,每一个状态的原理如下:首先调用交通状态模块中的各状态,以此达到各I/O端口的设置,然后进行延时,设置定时器的工作方式,初值,接着采用中断查询的方式来判断状态是否结束,最后调用显示模块,当然,在每隔状态也是需要进行循环设置和显示的。另外在说显示模块,采用动态显示的方式,利用数据线和控制线串行显示数码管,节约了导线成本,只有2个输入端。

十 、实验心得 

通过本次实验,我对交通灯有了更进一步的了解,交通灯是有6中状态的。本实验由于功能强大,所以我也学会和巩固了很多以前的知识,比如定时器的设置,查询中断,查表的方法,以及本实验大量使用的调用和循环语句,另外我对数码管的显示原理也有了进一步的理解,总之,收获很大。

  南昌大学实验报告

学生姓名:   刘路平          号: 5502211040   专业班级:    电力系统111      

实验类型:□ 验证 □ 综合 □ 设计创新 实验日期:         实验成绩:            

实验五 串转并与并转串实验

一、实验目的

1.掌握使用74LS164 扩展输出的方法。

2.掌握使用74LS165 扩展输入的方法。

二、实验内容

使用74LS165 扩展输入数据,使用74LS164 扩展输出数据。74LS165 的并行口接八位逻辑电平输出(开关),CPU 使用P1.0、P1.1 和P1.2 串行读入开关状态;74LS164 的并行口接一只数码管,CPU 使用P1.3 和P1.4 串行输出刚读入的开关状态,使之在数码管上显示出来。

三、实验要求

根据实验内容编写一个程序,并在实验仪上调试和验证。

四、实验说明和电路原理图

1)74LS165 为8 位移位寄存器,其引脚功能如下:

S/L:移位/置数端,低电平有效。

P0~P7:并行数据输入端。

QH、QH:串行数据输出端。

CLK、CKLINH:时钟信号输入端。

2)74LS164 为串行输入并行输出移位寄存器,其引脚功能如下:

A、B:串行输入端;

Q0~Q7:并行输出端;

MR:清零端,低电平有效;

CLK:时钟脉冲输入端,上升沿有效。

3)用P1 端口输出数据时,要编程位移数据,每操作一个数据位,对应一个移位脉冲。

4)本实验需要用到CPU 模块(F3 区)、八位逻辑电平输出模块(E4 区)和静态数码管显示模块(B4 区)。74LS165 电路原理图参见图5-1,74LS164 电路原理图参见图8-2。

注:74LS164 集成电路芯片在主板反面。

五、实验预习要求

学习教材的相关内容,根据实验要求画出程序流程图,写出实验程序。

六、实验步骤

1)系统各跳线器处在初始设置状态。

用导线对应连接八位逻辑电平输出模块的QH165、CLK165、SH/LD 到CPU 模块的P10、

P11、P12。用导线对应连接静态数码管显示模块的DIN、CLK 到CPU 模块的P13、P14。

2)启动PC 机,打开THGMW-51 软件,输入源程序,并编译源程序。编译无误后,下载程序运行。

3)观察数码(八段码)管的亮灭与拨动开关的状态是否一致。拨动开关拨下输出为低电平,段码点亮。

七、实验程序

本实验程序“8_164165”位于THGMW软件文件夹下THGMW\Exp\51文件夹。

;//****************************************************************

;//*文件名:164165 串转并,并转串实验程序

;功能:把开关量通过74**165串行输入到内存,并通过74**164串行输出到数

;      码管上显示。

;接线:P1.0接QH165,P1.1接CLK165,P1.2接SH_LD,

;      P1.3、P1.4接静态数码显示的DIN、CLK。

;//****************************************************************

       QH165     BIT   P1.0

       CLK165    BIT   P1.1

       SH_LD     BIT   P1.2

       DAT164    BIT   P1.3                                          17

       CLK164    BIT   P1.4

       MEMORY    EQU   30H

      

       ORG   0000H

       AJMP  START      

       ORG   00B0H

      

START: setb  CLK165

       clr   SH_LD

       setb  SH_LD

       mov   r7, #8

Input: rr    a

       mov   c, QH165

       mov   ACC.7, c

       clr   CLK165

       nop

       setb  CLK165 

       djnz  r7, Input

       mov   MEMORY,A    

       mov   A,MEMORY     

       mov   r6,#8

Output:

       rrc   A

       mov   DAT164,C

       clr   CLK164

       setb  CLK164

       djnz  r6, Output

       acall DELAY

       sjmp  START

DELAY:

       mov   R0,#5

DD2:   mov   R1,#0FFH

       djnz  R1,$

       djnz  R0,DD2

       RET

       END

九、结果分析:

运行程序后,拨动开关对应的发光二极管发光,且拨动开关拨下的时候输出为低电平。实验中起作用的主要是74LS165和74LS164这2块芯片的使用,CPU 使用P1.0、P1.1 和P1.2 串行读入开关状态;74LS164 的并行口接一只数码管,CPU 使用P1.3 和P1.4 串行输出刚读入的开关状态,使之在数码管上显示出来。

实验流程主要是先将并行口的开关通过74ls165进行转换成串行输出,然后经过单片机的控制,再在74ls164的作用下将串行数据转换成并行数据,从而使得对应的静态数码管点亮。

十、实验心得 

通过本次实验,我对串转并和并转串的原理和结构有了进一步的了解,原理主要有2大模块,输入模块,输出模块和延时模块,通过单片机的控制可以使得74ls165和164进行完美的结合,而结构主要是各芯片的连接,比如数据的输入,输出,以及时钟信号的输入。在实验当中我们体会到了科学的魅力与神奇,激励着我要勇往直前,不断学习才能达到一个新的高度。

  南昌大学实验报告

学生姓名:   刘路平          号: 5502211040   专业班级:    电力系统111      

实验类型:□ 验证 □ 综合 □ 设计创新 实验日期:         实验成绩:                                                                                   

实验六 8255 控制键盘与显示实验

一、实验目的

1.掌握8255 输入、输出编程方法。

2.掌握阵列键盘和数码管动态扫描显示的控制方法。

二、实验内容

用8255 可编程并行口做一个键盘、显示扫描实验,把按键输入的键值,显示在8255 控制的七段数码管上。8255 PB 口做键盘输入线,PC 口做显示扫描线,PA 口做显示数据线。

三、实验要求

根据实验内容编写一个程序,并在实验仪上调试和验证。

四、实验说明和电路原理图

本实验需要用到 CPU 模块(F3 区)、8255 模块(C6 区)、8279 键盘与显示模块(E7 区)。8255 键盘与显示电路原理图参见图7-1A、图7-1B,及前一实验的图6-1。

CS_8255 接8000H,则8255 状态/命令口地址为8003H,PA 口地址为8000H,PB 口地址为

8001H、PC 口地址为8002H。

五、实验预习要求

学习教材的相关内容,根据实验要求画出程序流程图,写出实验程序。

六、实验步骤

1)系统各跳线器处在初始设置状态,S11E 和S12E 红开关全部打到下方(OFF)。

2)用8 位数据线对应连接8255 模块的JD3C(PA 口)、JD4C(PB 口)、JD5C(PC 口)到8279

模块的JD3E、JD2E、JD4E;用导线连接8255 模块的CS_8255 到地。

3)启动PC 机,打开THGMW-51 软件,输入源程序,并编译源程序。编译无误后,下载程序运行。

4)在键盘上按任一单键,观察数码管的显示,数码管低位显示按键值。

七、实验程序

本实验程序

;//*********************************************************

;文件名: 8255KD for MCU51

;功能: 8255控制键盘显示实验

;接线: 连接8279键盘显示模块的JD3E到8255模块的JD3C(PA口);

;                            JD2E到8255模块的JD4C(PB口);

;                            JD4E到8255模块的JD5C(PC口);

;      用导线连接8255模块的CS_8255到地。

;//*********************************************************

                                                                  

;---------------------------------------------------------

D8255A   EQU     8000H  ;8255 PA 口地址

D8255B   EQU     8001H  ;8255 PB 口地址

D8255C   EQU     8002H  ;8255 PC 口地址

D8255    EQU     8003H  ;8255 状态/命令口地址

LEDBUF   EQU     50H    ;显示缓存

KEYVAL   EQU     60H    ;读到的键码

;---------------------------------------------------------

        ORG     0000H

        LJMP    START

        ORG     0100H

       

START:  MOV     SP,#80H

        MOV     DPTR,#D8255       

        MOV     A,#90H          ;方式0,PB,PC口输出,PA口输入

        MOVX    @DPTR,A

       

        MOV     LEDBUF,#10H

        MOV     LEDBUF+1,#11H

        MOV     LEDBUF+2,#11H

        MOV     LEDBUF+3,#11H

        MOV     LEDBUF+4,#5

        MOV     LEDBUF+5,#5

        MOV     LEDBUF+6,#2

        MOV     LEDBUF+7,#8 

       

KB_DIS:       

Mov     R6,#20                                  %消除抖动使用的寄存器计数用的

        LCALL   RD_KB            ;读键盘

        MOV     A,#0FFH

CJNE    A,KEYVAL,REALLY ;判读到键                       %消除抖动程序的控制

        CJNE    A,KEYVAL,TOSHOW  ;判读到键

        SJMP    SHOW             ;没有则继续读键

TOSHOW:     

        MOV     LEDBUF,KEYVAL

 SHOW:  LCALL   DISPLAY

        SJMP    KB_DIS       

 REALLY:ACALL Delay                                    %%%%%%%%%%% %消除抖动程序

DJNZ R6,REALLY      

       

RD_KB:                          ;键盘扫描

        MOV     A,#02H          ;扫描第一行

        MOV     DPTR,#D8255C

        MOVX    @DPTR,A

        MOV     DPTR,#D8255A                                       

        MOVX    A,@DPTR

        MOV     R1,#00H

        CJNE    A,#0FFH,KEYCAL  ;判键是否按下

        MOV     A,#01H          ;扫描第二行

        MOV     DPTR,#D8255C

        MOVX    @DPTR,A

        MOV     DPTR,#D8255A

        MOVX    A,@DPTR

        MOV     R1,#08H

        CJNE    A,#0FFH,KEYCAL

        SJMP    NOKEY           ;无键按下

KEYCAL: MOV     R0,#08H         ;计算键码       

SHIFT:  RRC     A

        JNC     TORET

        INC     R1

        DJNZ    R0,SHIFT

        SJMP    NOKEY           ;无键按下

TORET:  MOV     KEYVAL,R1

        RET

            

NOKEY:  MOV     KEYVAL,#0FFH    ;返回无键标志

        RET   

       

Display:

        MOV     R7,#8            ;8个数码管

        MOV     R5,#0

        MOV     R0,#LEDBUF

 DLOOP:

        MOV     A,R5

        RL      A

        RL      A

        RL      A

        ANL     A,#11111011B

        INC     R5

        MOV     DPTR,#D8255C

        MOVX    @DPTR,A         ;点亮对应的LED       

        MOV     A,@R0

        MOV     DPTR,#LEDSEG

        MOVC    A,@A+DPTR

        INC     R0

        MOV     DPTR,#D8255B

        MOVX    @DPTR,A         ;显示数据

        LCALL   Delay                                                

        DJNZ    R7,DLOOP

        RET

Delay:  PUSH    R7

        MOV     R7,#200

DelayLoop: 

        NOP           

        DJNZ    R7,DelayLoop

        POP     R7

        RET

 ;由显示数字对应数码管的字段所形成的表:

LEDSEG: DB      3FH,06H,5BH,4FH,66H,6DH;0,1,2,3,4,5       

        DB      7DH,07H,7FH,6FH,77H,7CH;6,7,8,9,A,B

        DB      39H,5EH,79H,71H,00H,40H;C,D,E,F, ,-

        

        END

八、结果分析

实验现象:运行程序后,本次实验共有2排键盘,各个键盘上面都有数字,在键盘上按任意键,可以看到数码管上显示了按键的数字。程序通过对输入量的识别,跳转到不同的程序段执行来实现不同按键输出。并且通过查表发来实现不同字符的显示。实验通过8255芯片来对键盘的输入和显示,并采用行扫描法对键盘输入进行识别,并采用动态显示结果。通过程序的编写和电路的连接基本上实现的实验的要求。  

     

九、实验心得

通过实验基本上掌握了键盘输入和显示的方法,键盘的出入也在原来程序的基础上加上了抖动消除程序,抖动的消除主要是利用了延时的原理,经过延时,来继续判定键盘的真实状态,本实验的延时20*0.6=12ms来去除抖动,但这并没有和原来的程序有任何差异的现象,键盘显示可以用8255来实现,也可以用专门的键盘输入显示芯片来实现。实验中采用8255的方法来实现,通过实验掌握了8255的使用方法,并且掌握了键盘按键识别的方法,在实验中采用行扫描法,我们还可以采用反转法实现。实验还掌握了数码管的动态显示方法,和他的编程过程。实验的中掌握了键盘输入和显示的方法,这为以后的电路设计提供了方法,我们可以在以后的电路设计中应用这个方法来实现输入输出。

                                                           

相关推荐