单片机实验报告

成 都 理 工 大 学

实验报告

实验1置数、拆字及拼字

实验人员:  08级机械二班   指导老师:   刘易      

实验地点:  6C701        实验时间: 20##年3月29日

一、   实验要求

置数

1、掌握汇编语设计和调试方法,熟悉键盘操作

2、熟悉使用keil软件

3、分别将70H~8FH、2000H~20FFH置数

拆字程序

1、掌握汇编语言设计和调试方法

2、学会运用交换指令SWAP和逻辑运算指令ANL等指令

3、把2000H的内容拆开,高位送2001H低四位,低四位送2002H低四位,2001H、2002H高四位清零

4、熟悉使用keil软件

拼字

1、熟悉指令的运用

2、把2000H、2001H的低四位分别送入2002H高四位和低四位

二、实验原理

置数

 

N

菱形: R1=0?
R1=R1-1

 


Y

 

拆字

 

拼字

 

三、程序设计

置数:

ORG 00H

       AJMP MAIN

ORG 30H

MAIN:

MOV R0,#70H

MOV R1,#00H

LOOP:

MOV  @R0,#0FFH

       INC  R0

       INC  R1

       CJNE R1,#20H,LOOP

       END

拆字:

MOV  DPTR,#2000H

 MOV  A,#12H

 MOVX @DPTR,A

 SWAP A

 ANL  A,#0FH

 MOV  DPTR,#2001H

 MOVX @DPTR,A

 MOV  DPTR,#2000H

 MOVX A,@DPTR

 ANL  A,#0FH

 MOV  DPTR,#2002H

 MOVX @DPTR,A

 END

拼字:

ORG 00H

AJMP MAIN

ORG  30H

MAIN:

MOV DPTR,#2000H

MOV A,#12H

MOVX @DPTR,A

INCDPTR

MOV A,#34H

MOVX @DPTR,A

LOOP:

MOV  DPTR,#2000H

MOVX A,@DPTR

ANL A,#0FH

SWAP A

MOVB,A

INCDPTR

MOVX A,@DPTR

ANL A,#0FH

ORLA,B

INCDPTR

MOVX @DPTR,A

END

四、现象及结果

置数:

(1)

在地址框内输入"d:0x0070",按回车,显示16个“FF”。

在地址框内输入"x:0x2000",按回车,显示16个“FF”。

121

拆字:

在地址框内输入"x:0x2000",按回车,显示68  06  08。

chaizi拼字:

在地址框内输入"x:0x2000",按回车,显示12  34  24。

实验2: 数据传送、数据排序、查找相同数个数

实验人员:  08级机械二班    指导老师:     刘易      

实验地点:  6C701        实验时间: 20##年4月6日 

一、   实验要求

掌握RAM中的数据操作,熟悉8032指令系统,掌握程序设计方法,掌握汇编语言编程。

数据传送

1、把R2、R3源RAM区首地址内的R6、R7字节数据传送到R4、R5目的RAM去。

2、空间0000-1FFF放要传送的数,送数到3000-4FFFH

3、掌握RAM中的数据操作

数据排序

1、编写并调试一个排序子程序,其功能是用冒泡法将内容RAM中几个单字节无符号的正整数,按从小到大排序

2、把8032中RAM50H-5AH中放入不等的数据,运行本程序后检查50H-5AH中内容是否按从小到大排列

3、熟悉8032指令系统,掌握程序设计方法

查找相同数

查找20##-200fh中为零的数的个数

二、   实验原理

数据传送:

数据排序:

QQ截图未命名

查找相同数:

 


Y

 

N

 

N

 


Y

 


三、程序设计

数据传送:

ORG 0000H

AJMP MAIN

ORG 0050H

MAIN:

MOV DPTR,#0000H

MOV A,#0FFH

MOV R2,#20H

LOOP2:MOV R3,#00H

LOOP1:MOVX @DPTR,A

      INC  DPTR

        DJNZ R3,LOOP1

        DJNZ R2,LOOP2

   MOV R2,#00H

   MOV R3,#00H

   MOV R4,#30H

   MOV R5,#00H

   MOV R6,#20H

   MOV R7,#00H

LOOP3:

LOOP4:

  MOV DPH,R2

  MOV DPL,R3

  MOVX A,@DPTR

  MOV DPH,R4

  MOV DPL,R5

  MOVX @DPTR,A

INC R3

INC R5

DJNZ R7,LOOP3

INC R2

INC R4

DJNZ R6,LOOP4

END

数据排序:

org   00h

ajmp  main

org   30h

main:

mov   r0   , #11

mov   r1   , #50h

mov   r7   , #00h

loop1:

mov   a    , r7

movdptr , #0ffh

inc   a

mov   r7   , a

movc  a    , @a+dptr  

mov   @r1  , a

inc   r1

djnz  r0   , loop1

clr   a

mov   r1   , #10

loop2:

mov   r0   , #50h

mov   a    , r1

mov   r2   , a

loop3:

clr   a

mov   a    , @r0

inc   r0

mov   b    , @r0

mov   r7   , a

subb  a    , b

jnb   cy   , next

ajmp  next1

next:

mov   a    , r7

mov   @r0  , a

dec   r0

mov   @r0  , b

inc   r0

next1:

clr   c

djnz  r2   , loop3

djnz  r1   , loop2

org 100h

tab:

    db 12h,34h,24h,11h,56h,23h,0bh,2fh,0a2h,25h,45h

end    

查找相同数:

org   00h

ajmp  main

org   30h

main:

mov   r0  , #16

mov   r6  , #00h

mov   r7  , #00h        

loop1:

mov   a   , r7

movdptr, #0ffh

inc   a

mov   r7  , a

movc  a   , @a+dptr

movdph , #20h

movdpl , r6

movx  @dptr,a

inc   r6

djnz  r0  , loop1   

mov   r1  , #16

mov   r2  , #00h

movdptr, #2000h

loop2:

movx  a   , @dptr

incdptr

cjne  a   , #00h  , next

inc   r2

next: 

djnz  r1 , loop2

mov   a  , r2

mov   dptr,#2100h

movx @dptr,a

org   100h

tab:

    db    12h,34h,24h,00h,00h,11h,00h,56h

    db    23h,0bh,2fh,00h,0a2h,00h,25h,45h

end

四、现象及结果分析:

数据传送

在地址框内输入"x:0x2000",按回车,显示

01, 02 03 04……十六进制数

chuansong1

chuansong3

chuansong4

数据排序

在地址框内输入"d:0x100",按回车,显示12,34,24,11,56,23,0b,2f,a2,25,45

在地址框内输入"d:0x50",按回车,显示0b 11 12 23 24 25 2f 34 45 56 a2


查找相同数

在地址框内输入"x:0x2000",按回车,显示

34,65,00,00,77,00,56

99,0d,2g,00,a2,00,25,89

在地址框内输入"x:0x2100",按回车,显示

05   代表有五个相同数。


实验3:I/O控制

实验人员:   08级机械二班        指导老师:   刘易    

实验地点:   6C701          实验时间:20##年04月11日

一、   实验目的:

利用单片机的p1口做i/o口,学会用p1口作为输入和输出口。

二、   实验内容及要求:

按一次键只亮一个灯,不能同时亮两个或者多个。学会用Timer定时器延时,用来防抖。

三、程序设计:

org   00h

ajmp  main

org   0003h

ajmpint

main:

setbea

setb  ex0

setb  px0

setb  it0

mov   a   ,  #0ffh

mov   r0  ,  #8

mov   r7  ,  #20

ajmp  $

int:

cjne   r0  , #0  ,loop

setb   c

rrc    a

acalldealy

mov    p1  ,  a

reti

loop:

clr    c

rlc    a

acalldealy

mov    p1  ,  a

dec    r0

reti

dealy:

movtmod  ,#01h

mov  th0   ,#3ch

mov  tl0   ,#0b0h

setb tr0

wait:

jnb  tf0   ,$

clr  tf1

mov  th0   ,#3ch

mov  tl0   ,#0b0h

djnz r7    ,wait

reti

end

四、现象及结果分析:

1.按一次键只亮一个灯,总共八次。

2.按一下,第一个亮,再按一下,第二个亮,再按一下,第三个亮……依次循环,直到全亮,再按一下,反过来依次灭,直到全灭

实验4:I/O控制(2)

实验人员:  08级机械二班         指导老师:   刘易     

实验地点:  6C701          实验时间:20##年4月18日  

一:实验要求:

1.外部中断的使用

通过按键控制灯得亮和灭

 2.Timer定时器的使用

程序运行时(等在亮和灭的过程中),由于程序运行比较快,我们按键时,键不平稳,一直在抖动,故可能导致每按一次键,有多个灯亮或者灭。同时,如果灯亮的时间过短,我们人眼感觉不到,故程序中必须调用延时程序,即采用Timer定时器

二、实验原理

MCS-51单片机有五个中断源,分别是INT0(入口地址0003H)、INT1(入口地址0013H)、TF0(入口地址000BH)、TF1(入口地址001BH)、串口中断(入口地址0023H),这5个中断源由TCON和SCON两个特殊功能寄存器进行控制

IE0和IE1:外部中断的中断请求标志

IT0和IT1:外部中断触发方式控制,为1时属边沿触发,为0时属电平触发

TI:串行口的发送中断标志

RI:串行口接受中断标志

MCS-51单片机对中断的开放和屏蔽是由IE控制实现的

EA:中断总控制位,=1,CPU开放中断;=0,CPU禁止所有

中断

ES:串行口中断控制位,=1:允许串行口中断,=0:屏蔽串行

口中断

ET0和ET1:定时器中断控制位,=1:允许T0、T1中断,=0:禁止T0、T1中断

EX0和EX1:外部中断控制位,=1:允许外部中断,=0:不允许外部中断

所有灯逐一全亮,然后全灭全亮三次,反方向逐一全亮,再全灭全亮三次;如此重复。

三:程序设计:

ORG 0000H

   JMP MAIN

   ORG 0003H

AJMPINT

MAIN:

SETBEA

SETB  EX0

SETB  PX0

SETB  IT0

AJMP  $

INT:

   MOV R1,#200

   MOV R2,#200    

   MOV R3,#200

   MOV R5,#4        ;记录闪的次数

   MOV R7,#8        ;控制顺着依次亮8盏灯

   MOV A,#0FFH

LOOP1:   

   CLR C

   RLC A

   MOV P1,A

   ACALL DELAY

   DJNZ R7,LOOP1

   MOV R7,#8

   AJMP SH

LOOP2:

   CLR C

   RRC A

   MOV P1,A

   ACALL DELAY

DJNZ  R7,LOOP2

   MOV R7,#8

   AJMP SH1

SH:

   ACALL DELAY    

   MOV A,#0

   MOV P1,A

   ACALL DELAY

   MOV A,#0FFH

   MOV P1,A

   DJNZ R5,SH

   MOV R5,#4

   AJMP LOOP2

SH1:

   ACALL DELAY

   MOV A,#0

   MOV P1,A

   ACALL DELAY

   MOV A,#0FFH

   MOV P1,A

   DJNZ R5,SH1

   MOV R5,#4

   AJMP LOOP1

DELAY:               ;循环延时

   DL1:DJNZ R1,DL1

       MOV R1,#200

   DL2:DJNZ R2,DL1

       MOV R2,#200

   DL3:DJNZ R3,DL1

       MOV R1,#200

       MOV R2,#200

       MOV R3,#200

       RET

END

四:实验现象

八盏灯先从左往右依次全亮,然后全灭全亮三次,从右向左逐一全亮,再全灭全亮三次;如此重复:

32

实验5:串口通讯

实验人员:  08级机械二班        指导老师:   刘易      

实验地点:    6C701             实验时间:20##年04月25日 

一、  实验目的:

利用单片机的TXD RXD口,学会单片机串行口的使用。

二、  实验内容:

编写一段程序,利用单片机串行口向PC机发送输入的字符,并接收。

三、   要求

深刻理解芯片作用,学会使用单片机的串行口,了解单片机之间的串行通讯。

四、  程序设计:

ORG   0000H

AJMP  MAIN

ORG   0023H   

AJMP  INT

ORG   0030H

MAIN:

MOV TMOD,#20H

MOV TH1,#0F4H

MOV TL1,#0F4H

SETB TR1

MOV SCON,#50H

SETB EA

SETB ES

AJMP $

INT:CLR RI

MOV  A,SBUF

MOV  SBUF,A

JNB  TI,$

CLR  TI

RETI

END

五:实验现象与结果分析:

在串行口窗口里输入一串字符,按回车,此串字符被原样发送到显示串口里。将程序通过monitor传输到DPFLASH中,打开DPFLASH串口调试器,把波特率改为2400bps,在处理字符串对话框中输入“asdb”,点击发送,则在接受窗口中出现所发送的字符串,如图:

chuankou

总结:

经过课堂上的学习,我们对单片机有了初步的了解,但感觉还不够深刻、具体。在实验课上,通过老师的指导,我们完成了实验任务,也跟进一步的了解了单片机的使用和编程,虽然还停留在比较初级的阶段,但已经感受到了单片机的魅力和无所不在,希望在以后的学习和工作中能更进一步的学习单片机。

 

第二篇:单片机实验报告

单片机实验报告

报告人:xx

学  号:xxx

班  号:xxx

指导老师:xxx

20##-10-28

实验一  拆字程序

一、 实验目的:

掌握汇编语言设计方法;熟悉超想-3000TB综合实验仪及HK51TB仿真板的应用。

二、实验内容:

把1000H地址上的内容拆开,高位送1001H地址的低位,低位送18002H地址的低位,1001H、1002H地址的高位清零。

三、实验器材:

(1) 超想-3000TB综合实验仪1台   (2) HK51TB仿真板1块

四、程序框图:

五、实验步骤:

(1)按流程图编写程序

(2)把超想-3000TB综合实验仪与HK51TB仿真适配板连接好。

(3)设置工作模式

(4)单步调试

(5)断点调试

(6)特殊功能寄存器查看


附:实验程序

ORG 0000H

MOV DPTR,#1000H  ;指定的字节

MOVX A,@DPTR

MOV B,A          ;暂存

SWAP A           ;交换

ANL A,#0FH       ;屏敝高位

INC DPTR

   

MOVX @DPTR,A

INC DPTR

MOV A,B

ANL A,#0FH       ;指定字节的内容屏敝高位

MOVX @DPTR,A

LOOP:SJMP LOOP

实验二  拼字程序

1.实验目的:

(1)进一步掌握汇编语言设计;           

(2)学习键盘方式下的各种调试方法;

2.实验内容:

把8000H、8001H两个字节的低位分别送入8002H的高位和低位。本程序一般用于把显示缓冲区数据取出拼装成一个字节。

3.实验器材:

(1) 超想-3000TB综合实验仪1台  (2) HK51TB仿真适配板 1块

4.实验流程:

5.实验步骤:

(1)编写程序并编译成机器代码,通过键盘把机器代码输入到实验仪中。

(2)设定仿真器的仿真模式为程序和数据存储器均使用仿真器的。

(3)用断点或单步方式运行程序,检查8000H-8002H,A,B中內容变化情况。

附:实验程序

    ORG  0000h

    MOV DPTR,#8000H

    MOVX A,@DPTR

    ANL A,#0FH      ;屏敝高位

    SWAP A

    MOV B,A             ;保存

    INC DPTR

    MOVX A,@DPTR

    ANL A,#0FH

    ORL A,B             ;合拼

    INC DPTR

    MOVX @DPTR,A        ;送8002H存放

LOOP:   SJMP LOOP

    END

实验三  清零程序

1.实验目的:

学习DOS软件模拟的调试方法

2.实验内容:

把外部RAM(XDATA)的20##-20FFH RAM空间置零

3.实验器材:

计算机   1   台

4.准备工作:   

超想3000仿真机DOS平台都提供了强劲软件模拟功能。它可以模拟包括MCS51 5个中断源在内的所有CPU资源。以下例子以DOS版平台为调试环境。

5.实验流程:

6.实验步骤: 

(1) 在打开的[Open  file]窗口中的Name栏输入文件名,按〈Enter〉键,即进入编辑环境

(2) 按F2键,把程序存盘。

(3) 按F9键(MASK)进入编译状态

(4) 按F8键,可以看到R0、DPTR随着F8单步运行而变化,同时,光带亦在移动。

(5) 把光标移至XDATA窗口,使用“↑↓”键或Alt+G键,使得XDATA窗口从2000H开始显示。继续按F8键,观察变化。

(6) 把光标移至LOOP1语句上,F4键,再来观察XDATA窗口。可用F5放大显示。

附:试验程序

        ORG 000H

    MOV R0,#00H

    MOV DPTR,#2000H     ;空间首地址送DPTR

LOOP:   MOV a,#00h

    MOVX @DPTR,A    ;清零

    INC DPTR        ;DPTR加1

    INC R0      ;字节数加1

    CJNE R0,#00H,LOOP   ;连续清256个字节

LOOP1:SJMP LOOP1

    END

实验四   八段数码管显示

1.实验目的:

(1)了解数码管动态显示的原理。

(2)了解74LS164扩展端口的方法。

2.实验要求:

利用实验仪提供的显示电路,动态显示一行数据.

3.实验器材:

(1)超想-3000TB综合实验仪1台  (2)超想3000仿真器1台  (3)计算机1台                       

4.实验说明:

(1)本实验仪提供了8段码LED显示电路,学生只要按地址输出相应数据,就可以实现对显示器的控制。显示共有6位,用动态方式显示74LS164是串行输入并行输出转换电路,串行输入的数据位由8155的PB0控制,时钟位由8155的PB1控制输出。写程序时,只要向数据位地址输出数据,然后向时钟位地址输出一高一低两个电平就可以将数据位置到74LS164中,并且实现移位。向显示位选通地址输出高电平就可以点亮相应的显示位。

本实验仪中数据位输出地址为0e102H,时钟位输出地址为0e102H,位选通输出地址为 0e101H。

本实验涉及到了8155 I0/RAM扩展芯片的工作原理以及74LS164器件的工作原理。

5.实验流程:

5实验电路:

附:实验程序

OUTBIT   equ 0e101h  ; 位控制口

CLK164   equ 0e102h  ; 段控制口(接164时钟位)

DAT164   equ 0e102h  ; 段控制口(接164数据位)

IN       equ 0e103h  ; 键盘读入口

LEDBuf   equ   60h     ; 显示缓冲

Num      equ   70h     ; 显示的数据

DelayT   equ   75h     ;

        org   0000h

       ljmp  Start

LEDMAP:              ; 八段管显示码

       db    3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h

       db    7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h

Delay:               ; 延时子程序

       mov   r7, #0

DelayLoop:

      djnz  r7, DelayLoop

       djnz  r6, DelayLoop

       ret

DisplayLED:

       mov   r0, #LEDBuf

       mov   r1, #6          ; 共6个八段管

       mov   r2, #00100000b  ; 从左边开始显示

Loop:

       mov   dptr, #OUTBIT

       mov   a, #00h

       movx  @dptr, a        ; 关所有八段管

       mov   a, @r0

       mov   B, #8           ; 送164

DLP:

       rlc   a

       mov   r3, a

       mov   acc.0, c

       ANL   A, #0FDH

       mov   dptr, #DAT164

       movx  @dptr, a

       mov   dptr, #CLK164

       orl a,#02h

       movx  @dptr, a

       anl a,#0fDh

       movx  @dptr, a

       mov   a, r3

       djnz  B, DLP

       mov   dptr, #OUTBIT

       mov   a, r2

       movx  @dptr, a        ; 显示一位八段管

       mov   r6, #1

       call  Delay

       mov   a, r2           ; 显示下一位

       rr    a

       mov   r2, a

       inc   r0

       djnz  r1, Loop

       mov   dptr, #OUTBIT

       mov   a, #0

       movx  @dptr, a        ; 关所有八段管

       ret

Start: mov dptr,#0e100h

       mov a,#03h

       movx @dptr,a

       mov   sp, #40h

       mov   Num, #0

MLoop:

       inc   Num

       mov   a, Num

       mov   b, a

       mov   r0, #LEDBuf

FillBuf:

       mov   a, b

       anl   a, #0fh

       mov   dptr, #LEDMap

       movc  a, @a+dptr    ; 数字转换成显示码

       mov   @r0,a         ; 显示在码填入显示缓冲

       inc   r0

       inc   b

       cjne  r0, #LEDBuf+6, FillBuf

       mov   DelayT,#30

DispAgain:

       call  DisplayLED    ; 显示

       djnz  DelayT,DispAgain

       ljmp  MLoop

       END

实验五    电子琴

1.实验目的:

了解发出不同音调声音的编程方法。

2.实验内容:

利用实验仪上提供的键盘,使数字键1、2、3、4、5、6、7作为电子琴按键,按下即发出

相应的音调。用P3.0口发出音频脉冲,驱动喇叭.。

3.实验原理:

我们知道,声音是由振动产生的,每个音符都对应了一个频率如下表所示。利用定时/计数器T0工作在16位定时方式,通过改变TH0和TL0的值,就可以产生不同频率的脉冲,例如想产生523Hz(音符1的发音)的脉冲,其周期为1/523=1912μS,因此只要让T0定时956μS后,使P3.0取反,就可以在P3.0引脚上输出一个频率为523Hz的脉冲。

4.实验器材:

(1)超想-3000TB综合实验仪1台(2)超想3000仿真器1台(3)连线 :若干根(4)计算机1台

5.实验流程:

6.实验电路

7.实验步骤:

把P3.0用连线连至“音响与合成”框LM386的Vin1插孔上。

 

附:实验程序

OUTBIT   equ 0e101h

IN       equ 0e103h

Pulse    equ 0

PulseCNT equ 50h

ToneHigh equ 51h

ToneLow  equ 52h

Speaker  equ 0B0H

       ljmp  Start

       org   000bh

Timer0Int:

       push  PSW

       clr   TR0

       mov   TH0, ToneHigh

       mov   TL0, ToneLow

       setb  TR0

       mov   c, Pulse

       mov   Speaker, c

       cpl   Pulse

       dec   PulseCNT

       pop   PSW

       reti

ToneTable:

       dw      64578, 64686, 64778, 64821, 64898, 64968, 65029

TestKey:

       mov   dptr, #OUTBIT

       mov   a, #0

       movx  @dptr, a

       mov   dptr, #IN

       movx  a, @dptr

       cpl   a

       anl   a, #0fh

       ret

KeyTable:

       db    00h, 01h, 04h, 07h

       db    0fh, 02h, 05h, 08h

       db    0eh, 03h, 06h, 09h

       db    0dh, 0ch, 0bh, 0ah

       db    10H,10H,10H,10H,10

       db    10H,10H,10H,10H,10H

GetKey:

       mov   dptr, #OUTBIT

       mov   P2, dph

      ; mov   r0, #Low(IN)

        MOV   R0,#03H;

       mov   r1, #00100000b

       mov   r2, #6

KLoop:

       mov   a, r1

       cpl   a

       movx  @dptr, a

       cpl   a

       rr    a

       mov   r1, a

       movx  a, @r0

       cpl   a

       anl   a, #0fh

       jnz   Goon1

       djnz  r2, KLoop

       mov   r2, #0ffh

       sjmp  Exit

Goon1:

       mov   r1, a

       mov   a, r2

       dec   a

       rl    a

       rl    a

       mov   r2, a           ; r2 = (r2-1)*4

       mov   a, r1

       mov   r1, #4

LoopC:

       rrc   a

       jc    Exit

       inc   r2

       djnz  r1, LoopC

Exit:

       mov   dptr, #OUTBIT

       clr   a

       movx  @dptr, a

       mov   a, r2

       mov   dptr, #KeyTable

       movc  a, @a+dptr

       ret

Start:

       mov  sp, #70h

       mov  dptr,#0e100h

       mov  a,#03h

       movx @dptr,a

       mov  TMOD, #01  ;  Timer

       mov  IE, #82h   ;  EA=1, IT0 = 1

MLoop:

       call TestKey

       jz   MLoop

       call GetKey

       mov  b, a

       jz   MLoop      ; = 0, < 1

       ANL  a, #!7

       ANL  A,#0F8H

       jnz  MLoop      ; > 7

       dec  b

       mov  a, b

       rl   a          ; a = a*2

       mov  b, a

       mov  dptr, #ToneTable

       movc a, @a+dptr

       mov  ToneHigh, a

       mov  TH0, a

       mov  a, b

       inc  a

       movc a, @a+dptr

       mov  ToneLow, a

       mov  TL0, a

       setb TR0

       mov  PulseCNT, #100

Wait:

       mov  a,PulseCNT

       jnz  Wait

       clr  TR0

       ljmp MLoop

       end

实验六 键盘扫描显示实验

1.  实验目的:

(1)掌握键盘和显示器的接口方法和编程方法。

(2)掌握键盘扫描和LED八段码显示器的工作原理。

2.  实验原理:

 在上一个实验的基础上,利用实验仪提供的键盘扫描电路和显示电路,做一个扫描键盘和数码显示实验,把按键输入的键码在六位数码管上显示出来。

实验程序可分成个三模块。

①  键输入模块:扫描键盘、读取一次键盘并将键值存入键值缓冲单元。

②  显示模块:将显示单元的内容在显示器上动态显示。

③  主程序:调用键输入模块和显示模块。

3.  实验器材:

(1)   超想-3000TB综合实验仪 1 台 (2)超想3000仿真器 1 台 (3)计算机 1 台

4.  实验电路:

6.实验流程:

主程序框图

附:试验程序:

OUTBIT   equ 0e101h  ; 位控制口

CLK164   equ 0e102h  ; 段控制口(接164时钟位)

DAT164   equ 0e102h  ; 段控制口(接164数据位)

IN       equ 0e103h  ; 键盘读入口

ORG 0000H

LJMP  STAR

KEY1: MOV   13H,#06H

MOV   12H,#20H

KEY2: MOV   A,12H

CPL   A

MOV   R7,A

MOV   DPTR,#0E101H

MOV   A,R7

MOVX  @DPTR,A

MOV   A,12H

CLR   C

RRC   A

MOV   12H,A

MOV   DPTR,#0E103H

MOVX  A,@DPTR

MOV   R7,A

MOV   A,R7

CPL   A

MOV   R7,A

MOV   A,R7

ANL   A,#0FH

MOV   14H,A

DEC   13H

MOV   R7,13H

MOV   A,R7

JZ    KEYDIS

MOV   A,14H

JZ    KEY2

KEYDIS: MOV   A,14H

JZ    TESTKEY5

MOV   A,13H

ADD   A,ACC

ADD   A,ACC

MOV   13H,A

MOV   A,14H

JNB   ACC.1,TESTKEY

INC   13H

SJMP  TESTKEY2

;== 键盘扫描==

TESTKEY: MOV   A,14H

JNB   ACC.2,TESTKEY1

INC   13H

INC   13H

SJMP  TESTKEY2

TESTKEY1: MOV   A,14H

JNB   ACC.3,TESTKEY2

MOV   A,#03H

ADD   A,13H

MOV   13H,A

TESTKEY2: MOV   DPTR,#0E101H

CLR   A 

MOVX  @DPTR,A

TESTKEY3:MOV   R7,#0AH

LCALL MLOOP

LCALL MLOOP4

MOV   A,R7

JNZ   TESTKEY3

MOV   R7,13H

MOV   A,R7

MOV   DPTR,#0134H

MOVC  A,@A+DPTR

MOV   R7,A

RET 

TESTKEY4: DB  22H   ;"

TESTKEY5: MOV   R7,#0FFH

RET

GETKEY: MOV   10H,#20H

MOV   0EH,#00H

GETKEY1: MOV   A,0EH

CLR   C

SUBB  A,#06H

JNC   GOON2

MOV   DPTR,#0E101H

CLR   A

MOVX  @DPTR,A

MOV   R7,0EH

MOV   A,#08H

ADD   A,R7

MOV   R0,A

MOV   A,@R0

MOV   R7,A

MOV   11H,R7

MOV   0FH,#00H

GETKEY2: MOV   A,0FH

CLR   C

SUBB  A,#08H

JNC   GOON1

MOV   A,11H

JNB   ACC.7,KLOOP

MOV   DPTR,#0E102H

MOV   A,#01H

MOVX  @DPTR,A

SJMP  KLOOP1 

KLOOP:MOV   DPTR,#0E102H

CLR   A

MOVX  @DPTR,A

KLOOP1: MOV   DPTR,#0E102H 

MOVX  A,@DPTR

MOV   R7,A

MOV   A,R7

ORL   A,#02H

MOV   R7,A

MOV   A,R7

MOVX  @DPTR,A

MOV   DPTR,#0E102H

MOVX  A,@DPTR   

MOV   R7,A    

MOV   A,R7   

ANL   A,#0FDH

MOV   R7,A 

MOV   A,R7

MOVX  @DPTR,A

MOV   A,11H    

ADD   A,ACC 

  MOV   11H,A 

INC   0FH    

SJMP  GETKEY2 

GOON1: MOV   DPTR,#0E101H

MOV   A,10H   

MOVX  @DPTR,A

MOV   R7,#01H

LCALL MLOOP 

MOV   A,10H 

CLR   C 

RRC   A    

MOV   10H,A  

INC   0EH  

SJMP  GETKEY1

GOON2:  RET

WAIT: MOV   DPTR,#0E100H

MOV   A,#03H

MOVX  @DPTR,A

MOV   08H,#0FFH

MOV   09H,#0FFH

MOV   0AH,#0FFH 

MOV   0BH,#0FFH

MOV   0CH,#00H

MOV   0DH,#00H 

WAIT1: LCALL GETKEY

LCALL MLOOP4

MOV   A,R7     

JZ    WAIT1    

LCALL KEY1 

MOV   R6,#00H

MOV   R6,#00H   

MOV   A,R7

ANL   A,#0FH 

MOV   R7,A 

MOV   A,#24H

ADD   A,R7  

MOV   DPL,A    

MOV   A,#01H

ADDC  A,R6   

MOV   DPH,A

CLR   A    

MOVC  A,@A+DPTR 

MOV   R7,A   

MOV   0DH,R7 

SJMP  WAIT1   

RET

TAB:

Q0124:      DB  3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H ;…………

Q012C:      DB  7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H ;…………

Q0134:      DB  00H, 01H, 04H, 07H, 0FH, 02H, 05H, 08H ;.........

Q013C:      DB  0EH, 03H, 06H, 09H, 0DH, 0CH, 0BH, 0AH ;........

Q0144:      DB  10H, 11H, 12H, 13H, 14H, 15H, 16H  ;.......

MLOOP: MOV   15H,R7

MLOOP1: MOV   R7,15H

DEC   15H 

MOV   A,R7 

JZ    MLOOP3 

MOV   16H,#64H

MLOOP2: MOV   A,16H   

JZ    MLOOP1

DEC   16H 

SJMP  MLOOP2

SJMP  MLOOP1 

MLOOP3:  RET 

MLOOP4:   MOV   DPTR,#0E101H 

CLR   A 

MOVX  @DPTR,A   

MOV   DPTR,#0E103H

MOVX  A,@DPTR

MOV   R7,A   

MOV   A,R7    

CPL   A   

MOV   R7,A   

MOV   A,R7 

ANL   A,#0FH

MOV   R7,A

RET

STAR: MOV   R0,#7FH

CLR   A   

STAR1: MOV   @R0,A  

DJNZ  R0,STAR1  

MOV   SP,#16H 

LJMP  WAIT    

END

相关推荐