单片机实验报告4.docx
《单片机实验报告4.docx》由会员分享,可在线阅读,更多相关《单片机实验报告4.docx(24页珍藏版)》请在冰点文库上搜索。
单片机实验报告4
大连理工大学实验报告
实验时间:
2013年7月5星期五时间:
13:
00~16:
30
实验室(房间号):
综421实验台号码:
班级:
电医1001姓名:
梅世宇成绩:
实验四ZLG7290B实验:
键盘扫描实验
ZLG7290B实验:
AD转换的十进制显示实验
一、实验仪器
计算机系统、DP-51PROC单片机综合仿真实验台、TKSMonitor51仿真器、软件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显示缓冲区;
4、实验电路图
1.ZLG7290B实验:
键盘扫描实验
图8.16实验电路的连接
2.ZLG7290B实验:
AD转换的十进制显示实验
五.实验流程图
1.ZLG7290B实验:
键盘扫描实验
图8.17主程序框图图8.18子程序流程图
2.ZLG7290B实验:
AD转换的十进制显示实验
图8.20主程序框图图8.21主函数流程图
6、程序清单
1.MCS-51与TLC的接口实验
sdabitp1.0
sclbitp1.1
wslaequ70h
rslaequ71h
disdaequ20h;源数据块首地址
disconequ08h;写入数据个数
data_1equ30h;变量区首地址
org8000h
ljmp8100h
org8003h
ljmpint_7290
org8100h
start:
movsp,#60h
clrp1.7;7290复位
lcalldelay
setbp1.7
setbea;开INT0中断
setbex0
setbit0;触发极性位下降沿
movdata_1,#13h;变量缓冲区
movdata_1+1,#13h;注意
movdata_1+2,#13h;变量取值范围0-F
movdata_1+3,#12h
movdata_1+4,#10h
movdata_1+5,#11h
movdata_1+6,#10h
movdata_1+7,#0dh
movdptr,#ledseg;开始对变量查表
movr7,#discon;写入数据个数
movr0,disda;源数据块首地址
movr1,#data_1
loop1:
mova,@r1
movca,@a+dptr;查表得对应的字形码
mov@r0,a;送显示缓冲区
incr1
incr0
djnzr7,loop1
loop:
movr7,#discon
movr2,#10h
movr3,#wsla
movr0,#disda
lcallwrnbyt;调显示子程序
lcalldelay;使显示稳定
sjmploop
ledseg:
db0fch,60h,0dah,0f2h,66h,0b6h,0beh,0e4h;0-7的字形码
db0feh,0f6h,0eeh,3eh,9ch,7ah,9eh,8eh;8-F的字形码
db0fah,1eh,12h,00h;a,t,=和熄灭码
cf:
push02h;将A中的数据拆分为两个思维16进制数并查表
pushdph
pushdpl
movdptr,#ledseg
movr2,a
anla,#0fh
movca,@a+dptr
movr3,a
mova,r2
swapa
anla,#0fh
movca,@a+dptr
movr4,a
popdpl
popdph
pop02
ret
int_7290:
push00h
push02h
push03h
push04h
push07h
pushacc
pushpsw
movr0,#28h;状态数据区首地址
movr7,#01h;取状态数据个数
movr2,#01h;内部数据首地址
movr3,#wsla;取器件地址(写)
movr4,#rsla;取器件地址(读)
lcallrdadd;读出7290的00H-03H数据存于28H-2BH
nop;设定一个断点,以观察独处的4个数据
mova,28h;取键值
lcallcf;拆分、查表
mov20h,r3;送显示缓冲区(最低两位数码管)
mov21h,r4
poppsw
popacc
pop07h
pop04h
pop03h
pop02h
pop00h
reti
delay:
push00h
push01h
movr0,#00h
delay1:
movr1,#00h
djnzr1,$
djnzr0,delay1
pop01h
pop00h
ret
WRNBYT:
PUSHPSW
PUSHACC
WRADD:
MOVA,R3;取外围器件地地址(包含r/w=0)
LCALLSTA;发送起始信号S
LCALLWRBYT;发送外围地址
LCALLCACK;检测外围器件的应答信号
JBF0,WRADD;如果应
MOVA,R2
LCALLWRBYT;发送内部寄存器首地址
LCALLCACK;检测外围器件的应答信号
JBF0,WRADD;如果应答不正确返回重来
WRDA:
MOVA,@R0
LCALLWRBYT;发送外围地址
LCALLCACK;检测外围器件的应答信号
JBF0,WRADD;如果应答不正确返回重来
INCR0
DJNZR7,WRDA
LCALLSTOP
POPACC
POPPSW
RET
RDADD:
PUSHPSW;从PCF8563的02H单元读入7个参数
PUSHACC;存放于20H-26H单元
RDADD1:
LCALLSTA
MOVA,R3;取器件地址(写)
LCALLWRBYT;发送外围地址
LCALLCACK;检测外围器件的应答信号
JBF0,RDADD1;如果应答不正确返回重来
MOVA,R2;取内部地址
LCALLWRBYT;发送外围地址
LCALLCACK;检测外围器件的应答信号
JBF0,RDADD1;如果应答不正确返回重来
LCALLSTA
MOVA,R4;取器件地址(读)
LCALLWRBYT;发送外围地址
LCALLCACK;检测外围器件的应答信号
JBF0,RDADD1;如果应答不正确返回重来
RDN:
LCALLRDBYT
MOV@R0,A
DJNZR7,ACK
LCALLMNACK
LCALLSTOP
POPACC
POPPSW
RET
ACK:
LCALLMACK
INCR0
SJMPRDN
STA:
SETBSDA;启动信号S
SETBSCL
NOP;产生4.7US延时
NOP
NOP
NOP
NOP
CLRSDA
NOP;产生4.7US延时
NOP
NOP
NOP
NOP
CLRSCL
RET
STOP:
CLRSDA;停止信号P
SETBSCL
NOP;产生4.7US延时
NOP
NOP
NOP
NOP
SETBSDA
RET
MACK:
CLRSDA;发送应答信号ACK
SETBSCL
NOP;产生4.7US延时
NOP
NOP
NOP
NOP
CLRSCL
SETBSDA
RET
MNACK:
SETBSDA;发送非应答信号NACK
SETBSCL
NOP;产生4.7US延时
NOP
NOP
NOP
NOP
CLRSCL
CLRSDA
RET
CACK:
SETBSDA;应答位检测子程序
SETBSCL
CLRF0
MOVC,SDA;采样SDA
JNCCEND;应答正确时转CEND
SETBF0;应答错误时F0置一
CEND:
CLRSCL
RET
WRBYT:
PUSH06H
MOVR6,#08H;发送一个字节子程序
WLP:
RLCA;(入口参数A)
MOVSDA,C
SETBSCL
NOP;产生4.7US延时
NOP
NOP
NOP
NOP
CLRSCL
DJNZR6,WLP
POP06H
RET
RDBYT:
PUSH06H
MOVR6,#08H;接收一个字节子程序
RLP:
SETBSDA
SETBSCL
NOP;产生大于15微秒的延时
NOP;注意这是专门为ZLG7290
NOP;添加的20微秒延时部分
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOVC,SDA
MOVA,R2
RLCA
MOVR2,A
CLRSCL
DJNZR6,RLP;(出口参数R2)
POP06H
RET
end
2.ZLG7290B实验:
数码显示实验
SDABITP1.0;7290B的引脚定义
SCLBITP1.1
WSLAEQU070H
RSLAEQU071H
DATBITP1.0;TLC549PC引脚定义
CLKBITP1.1
CSBITP1.4
CUNTEQU20H;每次ADC采集数据个数
SHIFTEQU05H;除数(与采集数据个数有关)
ADDREQU20H;数据缓冲区首地址
DISDAEQU40H;显示缓冲区
DISCUNTEQU08H;显示缓冲区长度
ORG8000H
LJMP8100H
ORG8100H
START:
MOVSP,#60H
CLRP1.7;7290复位
LCALLDELAY
SETBP1.7
MOVDISDA+7,#0EEH;a字形
MOVDISDA+6,#7AH;d字形
MOVDISDA+5,#1AH;c字形
MOVDISDA+4,#00H;熄灭
MOVDISDA+3,#12H;“=”
LOOP:
LCALLTLC549;采集N个ADC数据(20H单元)
LCALLADJUST;数据滤波(屏蔽以观察滤波效果)
LCALLBCD_CONT;转换为十进制数
MOVR7,#DISCUNT
MOVR0,#DISDA
MOVR2,#10H
MOVR3,#WSLA
LCALLWRNBYT;7290数字显示
LCALLDELAY
SJMPLOOP
TLC549:
PUSH00H;连续采集16次数据
PUSH07H;存放于20H-2FH中
MOVR7,#CUNT
MOVR0,#ADDR
LOOP2:
LCALLTLC549_ADC
MOV@R0,A
INCR0
DJNZR7,LOOP2
POP07H
POP00H
RET
ADJUST:
PUSH00H;将20H开始的CUNT个数据
PUSH02H;求平均值
PUSH03H;结果于A中
PUSH07H
MOVR7,#CUNT
MOVR0,#ADDR
CLRA
MOVR2,A
LOOP3:
CLRC;累加
ADDCA,@R0
JNCLOOP4
INCR2
LOOP4:
INCR0
DJNZR7,LOOP3
MOVR3,A
MOVA,R2;除以数据个数CUNT
MOVR7,#SHIFT
LOOP5:
CLRC
MOVA,R2
RRCA
MOVR2,A
MOVA,R3
RRCA
MOVR3,A
DJNZR7,LOOP5
POP07H
POP03H
POP02H
POP00H
RET
TLC549_ADC:
PUSH07H
CLRA
CLRCLK
MOVR7,#08H
CLRCS
LOOP1:
SETBCLK
NOP
NOP
NOP
NOP
MOVC,DAT
RLCA
CLRCLK
NOP
NOP
DJNZR7,LOOP1
SETBCS
SETBCLK
POP07H
RET
BCD_CONT:
PUSH07H
PUSH06H
PUSH05H
PUSH02H
MOVB,#64H
DIVAB
MOVR7,A;R7中得百位数
MOVR2,B;R2中得余数
MOVA,R2
MOVB,#0AH
DIVAB
MOVR6,A;R6中得十位数
MOVR5,B;R5中得个位数
MOVA,R7
LCALLCF;调拆分子程序(入口A出口R4,R3-字形码)
MOVDISDA+2,R3;高位R4无用
MOVA,R6
LCALLCF;调拆分子程序(入口A出口R4,R3-字形码)
MOVDISDA+1,R3
MOVA,R5
LCALLCF;调拆分子程序(入口A出口R4,R3-字形码)
MOVDISDA+0,R3
POP02H
POP05H
POP06H
POP07H
RET
CF:
PUSH02H;将A中的数据拆分为两个独立的BCD码并查表
PUSHDPH
PUSHDPL
MOVDPTR,#LEDSEG
MOVR2,A
ANLA,#0FH
MOVCA,@A+DPTR
MOVR3,A
MOVA,R2
SWAPA
ANLA,#0FH
MOVCA,@A+DPTR
MOVR4,A
POPDPL
POPDPH
POP02H
RET
WRNBYT:
PUSHPSW
PUSHACC
WRADD:
MOVA,R3
LCALLSTA
LCALLWRBYT
LCALLCACK
JBF0,WRADD
MOVA,R2
LCALLWRBYT
LCALLCACK
JBF0,WRADD
WRDA:
MOVA,@R0
LCALLWRBYT
LCALLCACK
JBF0,WRADD
INCR0
DJNZR7,WRDA
LCALLSTOP
POPACC
POPPSW
RET
CACK:
SETBSDA
SETBSCL
CLRF0
MOVC,SDA
JNCCEND
SETBF0
CEND:
CLRSCL
RET
WRBYT:
MOVR6,#08H
WLP:
RLCA
MOVSDA,C
SETBSCL
NOP
NOP
NOP
NOP
CLRSCL
DJNZR6,WLP
RET
STA:
SETBSDA
SETBSCL
NOP
NOP
NOP
NOP
CLRSDA
NOP
NOP
NOP
NOP
CLRSCL
RET
STOP:
CLRSDA
SETBSCL
NOP
NOP
NOP
NOP
SETBSDA
NOP
NOP
NOP
NOP
RET
DELAY:
PUSH00H
PUSH01H
MOVR0,#00H
DELAY1:
MOVR1,#00H
DJNZR1,$
DJNZR0,DELAY1
POP01H
POP00H
RET
LEDSEG:
DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E4H
DB0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EH
END