单片机实验报告4

更新时间:2024-04-09 20:02:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

大连理工大学实验报告

实验时间: 2013 年 7 月 5 星期 五 时间 : 13 : 00 ~ 16 : 30 实验室(房间号): 综 421

实验台号码: 班级: 电医 1001 姓名: 梅世宇 成绩:

实验四 ZLG7290B实验:键盘扫描实验 ZLG7290B实验:AD转换的十进制显示实验 一、 实验仪器

计算机系统、DP-51PROC单片机综合仿真实验台、TKSMonitor 51仿真器、软件KeilC51

二、 实验目的和要求

1.ZLG7290B实验:键盘扫描实验

利用中断的方式获取按键操作的信息,并在中断服务程序中完成键值的读取、显示操作。数码管初始显示为:“data= “,当有按键操作时,将所读取的键值显示在最右的两位数码管上(如:当按下S1键时,显示”data=-01 “). 2.ZLG7290B实验:AD转换的十进制显示实验

使用AD转换芯片TLC549CP对模拟电压进行数字转换,将转换的结果处理位3位的十进制数(000-255)并通过ZLG7290B进行显示。

三、 实验算法

1. ZLG7290B实验:键盘扫描实验

DATA_1(30H-37H):变量缓冲区。 DISDA(20H-27H): 显示缓冲区。

28H-2BH:装在从ZLG7290B00H单元开始读出的连续4个字节数据,其中29H就是键值。

当有按键操作时,利用ZLG7290B00H的/INT信号引发单片机的一个中断,利用中断服务程序从ZLG7290B00H中连续读取4个字节的数据,其中第二个字节(ZLG7290B00H的01H寄存器)就是键值。将此值拆分、查表后送显示缓冲区的20H、21H单元。

2.ZLG7290B实验:AD转换的十进制显示实验

20H开始的单元:存放N个TLC549采集的数据; 40H-47H显示缓冲区;

四、实验电路图

1. ZLG7290B实验:键盘扫描实验

AT89C51 P1.0 P1.1 P1.7 P3.2/INT0 I2C总线 ZLG7290B SDA SCL /RST /INT0-KEY

图 8.16实验电路的连接 2.ZLG7290B实验:AD转换的十进制显示实验

- 1 -

五.实验流程图

1. ZLG7290B实验:键盘扫描实验

图8.17主程序框图 图8.18子程序流程图

2.ZLG7290B实验:AD转换的十进制显示实验

图8.20主程序框图 图8.21主函数流程图

- 2 -

六、程序清单

1. MCS-51与TLC的接口实验

sda bit p1.0 scl bit p1.1 wsla equ 70h rsla

equ 71h

disda equ 20h;源数据块首地址 discon equ 08h;写入数据个数 data_1 equ 30h;变量区首地址

org 8000h ljmp

8100h

org 8003h ljmp

int_7290

org 8100h start: mov sp,#60h clr p1.7;7290复位 lcall delay setb p1.7

setb ea;开INT0中断 setb ex0

setb it0;触发极性位下降沿

mov data_1,#13h;变量缓冲区 mov data_1+1,#13h;注意

mov data_1+2,#13h;变量取值范围0-F mov data_1+3,#12h

mov data_1+4,#10h

mov data_1+5,#11h mov data_1+6,#10h mov data_1+7,#0dh

mov dptr,#ledseg;开始对变量查表 mov r7,#discon;写入数据个数 mov r0,disda;源数据块首地址

mov r1,#data_1 loop1: mov a,@r1 movc a,@a+dptr;查表得对应的字形码

mov @r0,a;送显示缓冲区 inc r1 inc r0 djnz

r7,loop1

loop: mov r7,#discon mov r2,#10h mov r3,#wsla mov r0,#disda

lcall wrnbyt;调显示子程序 lcall delay;使显示稳定 sjmp

loop

ledseg: db

0fch,60h,0dah,0f2h,66h,0b6h,0beh,0e4h;0-7的字形码

db

- 3 -

0feh,0f6h,0eeh,3eh,9ch,7ah,9eh,8eh;8-F的字形码 cf: push

02h;将A中的数据拆分为两个思

db 0fah,1eh,12h,00h;a,t,=和熄灭码

push psw

mov r0,#28h;状态数据区首地址 mov r7,#01h;取状态数据个数 mov r2,#01h ;内部数据首地址 mov r3,#wsla;取器件地址(写) 维16进制数并查表 push dph push

dpl

mov dptr,#ledseg mov r2,a anl a,#0fh movc

a,@a+dptr

mov r3,a mov a,r2 swap

a

anl a,#0fh movc

a,@a+dptr

mov r4,a pop dpl pop dph pop 02 ret

int_7290: push 00h push 02h push 03h push 04h push 07h

push

acc

mov r4,#rsla;取器件地址(读)

lcall rdadd;读出7290的00H-03H数据

存于28H-2BH nop;设定一个断点,以观察独处的4个数

据 mov a,28h;取键值 lcall cf;拆分、查表

mov 20h,r3;送显示缓冲区(最低两位数码管) mov 21h,r4 pop psw pop acc pop 07h pop 04h pop 03h pop 02h pop 00h reti

delay: push 00h

push

01h

mov r0,#00h

delay1: mov r1,#00h djnz r1,$

djnz

r0,delay1

- 1 -

pop 01h LCALL STOP pop 00h POP ACC ret POP PSW

RET

WRNBYT: PUSH PSW

PUSH

ACC

WRADD: MOV A,R3

;取外围器件地

地址(包含r/w=0) RDADD: PUSH PSW LCALL STA

;发送起始信号S

02H单元读入7个参数 LCALL WRBYT ;发送外围地址

PUSH

ACC

LCALL CACK

;检测外围器件

20H-26H单元 的应答信号 RDADD1: LCALL STA

JB F0,WRADD ;如果应

MOV A,R3 MOV

A,R2

(写)

LCALL WRBYT

;发送内部寄存 LCALL WRBYT 器首地址

LCALL CACK

LCALL CACK

;检测外围器件

的应答信号 的应答信号

JB

F0,RDADD1

JB

F0,WRADD

;如果应答不正

确返回重来 确返回重来

MOV

A,R2

WRDA: MOV A,@R0

LCALL WRBYT LCALL WRBYT ;发送外围地址

LCALL CACK

LCALL CACK

;检测外围器件

的应答信号 的应答信号

JB

F0,RDADD1

JB

F0,WRADD

;如果应答不正

确返回重来 确返回重来

LCALL STA INC R0

MOV

A,R4

DJNZ R7,WRDA

(读)

- 2 -

从PCF8563的

取器件地址

发送外围地址 检测外围器件

如果应答不正

取内部地址 发送外围地址 检测外围器件

如果应答不正

取器件地址

;;

;;;;;;;;;

LCALL WRBYT LCALL CACK

;发送外围地址 ;检测外围器件

NOP NOP NOP NOP ;产生4.7US延时

的应答信号

JB

F0,RDADD1 ;如果应答不正

确返回重来 RDN: LCALL MOV DJNZ

LCALL LCALL POP POP

RET

ACK: LCALL INC

SJMP

STA: SETB SETB NOP NOP NOP NOP NOP

CLR

RDBYT @R0,A R7,ACK

MNACK STOP

ACC PSW

MACK R0 RDN SDA ;启动信号S SCL

;产生4.7US延时SDA

STOP:

MACK:

MNACK: - 3 -

NOP CLR SCL

RET

CLR SDA ;停止信号P

SETB SCL NOP

;产生4.7US延时

NOP NOP NOP NOP SETB SDA

RET

CLR SDA ;发送应答信号ACK SETB SCL NOP

;产生4.7US延时

NOP NOP NOP NOP CLR SCL SETB SDA

RET SETB SDA ;发送非应答信号

NACK

CACK: SETB

SETB CLR MOV JNC

SDA SCL F0

C,SDA ;采样SDA CEND

;应答正确时转;应答位检测子程序

SETB NOP NOP NOP NOP NOP CLR CLR RET

SCL SDA SCL

;产生4.7US延时

NOP NOP CLR DJNZ POP RET

06H

R6,#08H ;接收一个字节子程SCL R6,WLP 06H

RDBYT: PUSH 序 RLP:

NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP MOV MOV RLC

SETB SETB

MOV

SDA SCL

;产生大于15微秒的延时 ;注意这是专门为ZLG7290 ;添加的20微秒延时部分

CEND 一

CEND: CLR

WRBYT: PUSH MOV WLP:

SETB F0 ;应答错误时F0置

SCL

RET

06H

;发送一个字节子程序

;(入口参数A)

- 4 -

R6,#08H RLC A MOV SDA,C SETB NOP NOP NOP

SCL

;产生4.7US延时 C,SDA A,R2 A

MOV CLR DJNZ POP RET

R2,A SCL R6,RLP 06H

;(出口参数R2)

end

2. ZLG7290B实验:数码显示实验

SDA BIT P1.0;7290B的引脚定义 SCL BIT P1.1 WSLA EQU 070H RSLA EQU 071H

DAT BIT P1.0;TLC549PC引脚定义 CLK BIT P1.1 CS BIT P1.4

CUNT EQU 20H;每次ADC采集数据个数 SHIFT EQU 05H;除数(与采集数据个数有关) ADDR EQU 20H;数据缓冲区首地址 DISDA EQU 40H;显示缓冲区 DISCUNT EQU 08H;显示缓冲区长度 ORG 8000H LJMP 8100H ORG 8100H

START: MOV SP,#60H CLR P1.7;7290复位 LCALL DELAY SETB P1.7

MOV DISDA+7,#0EEH;a字形 MOV DISDA+6,#7AH;d字形 MOV DISDA+5,#1AH;c字形 MOV DISDA+4,#00H;熄灭 MOV DISDA+3,#12H;“=”

LOOP: LCALL TLC549;采集N个ADC数据(20H单元)

LCALL ADJUST;数据滤波(屏蔽以观察滤波效果)

LCALL BCD_CONT;转换为十进制数 MOV R7,#DISCUNT MOV R0,#DISDA MOV R2,#10H

- 5 -

MOV R3,#WSLA

LCALL WRNBYT;7290数字显示 LCALL DELAY SJMP LOOP

TLC549: PUSH 00H;连续采集16次数据 PUSH 07H;存放于20H-2FH中 MOV R7,#CUNT MOV R0,#ADDR

LOOP2: LCALL TLC549_ADC MOV @R0,A INC R0

DJNZ R7,LOOP2 POP 07H POP 00H RET

ADJUST: PUSH 00H;将20H开始的CUNT个数据

PUSH 02H;求平均值 PUSH 03H;结果于A中 PUSH 07H MOV R7,#CUNT MOV R0,#ADDR CLR A MOV R2,A

LOOP3: CLR C;累加 ADDC A,@R0 JNC LOOP4 INC R2

LOOP4: INC R0 DJNZ R7,LOOP3

MOV R3,A

MOV A,R2;除以数据个数CUNT MOV R7,#SHIFT LOOP5: CLR C MOV A,R2 RRC A MOV R2,A MOV A,R3 RRC A MOV R3,A

DJNZ R7,LOOP5 POP 07H POP 03H POP 02H POP 00H RET

TLC549_ADC: PUSH 07H CLR A CLR CLK MOV R7,#08H CLR CS

LOOP1: SETB CLK NOP NOP NOP NOP

MOV C,DAT RLC A CLR CLK NOP NOP

DJNZ R7,LOOP1 SETB CS SETB CLK POP 07H RET

BCD_CONT:

PUSH 07H PUSH 06H

PUSH 05H PUSH 02H MOV B,#64H DIV AB

MOV R7,A;R7中得百位数 MOV R2,B;R2中得余数 MOV A,R2 MOV B,#0AH DIV AB

MOV R6,A;R6中得十位数 MOV R5,B;R5中得个位数 MOV A,R7

LCALL CF;调拆分子程序(入口A出口R4,R3-字形码)

MOV DISDA+2,R3;高位R4无用 MOV A,R6

LCALL CF;调拆分子程序(入口A出口R4,R3-字形码) MOV DISDA+1,R3 MOV A,R5

LCALL CF;调拆分子程序(入口A出口R4,R3-字形码) MOV DISDA+0,R3 POP 02H POP 05H POP 06H POP 07H RET

CF: PUSH 02H;将A中的数据拆分为两个独立的BCD码并查表 PUSH DPH PUSH DPL

MOV DPTR,#LEDSEG MOV R2,A ANL A,#0FH

MOVC A,@A+DPTR MOV R3,A MOV A,R2 SWAP A ANL A,#0FH

MOVC A,@A+DPTR MOV R4,A

- 1 -

POP DPL POP DPH POP 02H RET

WRNBYT: PUSH PSW PUSH ACC WRADD: MOV A,R3 LCALL STA LCALL WRBYT LCALL CACK JB F0,WRADD MOV A,R2

LCALL WRBYT LCALL CACK JB F0,WRADD WRDA: MOV A,@R0 LCALL WRBYT LCALL CACK JB F0,WRADD INC R0

DJNZ R7,WRDA LCALL STOP POP ACC POP PSW RET

CACK: SETB SDA SETB SCL CLR F0 MOV C,SDA JNC CEND SETB F0 CEND: CLR SCL RET

WRBYT: MOV R6,#08H WLP: RLC A MOV SDA,C SETB SCL NOP NOP NOP NOP CLR SCL

DJNZ R6,WLP RET

STA: SETB SDA SETB SCL NOP NOP NOP NOP CLR SDA NOP NOP NOP NOP CLR SCL RET

STOP: CLR SDA SETB SCL NOP NOP NOP NOP

SETB SDA NOP NOP NOP NOP RET

DELAY: PUSH 00H PUSH 01H MOV R0,#00H DELAY1: MOV R1,#00H DJNZ R1,$

DJNZ R0,DELAY1 POP 01H POP 00H RET LEDSEG: DB

0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E4H DB

0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EH END

- 2 -

POP DPL POP DPH POP 02H RET

WRNBYT: PUSH PSW PUSH ACC WRADD: MOV A,R3 LCALL STA LCALL WRBYT LCALL CACK JB F0,WRADD MOV A,R2

LCALL WRBYT LCALL CACK JB F0,WRADD WRDA: MOV A,@R0 LCALL WRBYT LCALL CACK JB F0,WRADD INC R0

DJNZ R7,WRDA LCALL STOP POP ACC POP PSW RET

CACK: SETB SDA SETB SCL CLR F0 MOV C,SDA JNC CEND SETB F0 CEND: CLR SCL RET

WRBYT: MOV R6,#08H WLP: RLC A MOV SDA,C SETB SCL NOP NOP NOP NOP CLR SCL

DJNZ R6,WLP RET

STA: SETB SDA SETB SCL NOP NOP NOP NOP CLR SDA NOP NOP NOP NOP CLR SCL RET

STOP: CLR SDA SETB SCL NOP NOP NOP NOP

SETB SDA NOP NOP NOP NOP RET

DELAY: PUSH 00H PUSH 01H MOV R0,#00H DELAY1: MOV R1,#00H DJNZ R1,$

DJNZ R0,DELAY1 POP 01H POP 00H RET LEDSEG: DB

0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E4H DB

0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EH END

- 2 -

本文来源:https://www.bwwdw.com/article/wm6r.html

Top