当前位置:文档之家› AD转换器LED显示和键盘实验

AD转换器LED显示和键盘实验

AD转换器LED显示和键盘实验
AD转换器LED显示和键盘实验

实验十三A/D转换器ADC0809实验

2、实验步骤

⑴运行编写好的软件程序,每次跑到断点就会停止,此时观察转换的结果和用数字万用表测量的结果相比较是否正确(所需观察的存储单元或者变量在程序中依照注释执行);

⑵改变10K电位器的旋钮位置,用数字万用表测量中间金属孔的电压,再次运行程序至断点处,观察转换的结果是否正确。

⑶扭动电位器,改变IN0模拟输入电压,再次运行程序到断点处,观察30H单元的数值是否随之改变,同时观察8个发光二极管显示的转换结果的二进制数(1亮,0灭),改变的是否正确?

⑷数据换算成实际电压值是否与万用表的测量结果相等?

3、实验参考程序清单

ORG 8000H

LJMP MAIN

ORG 8100H

MAIN: MOV SP,#70H

MAIN1: MOV R1,#30H ;置数据区首地址,用于存放A/D转换结果MOV DPTR,#7FF8H ;P2.0=0,且指向通道0

LOOP:

MOVX @DPTR,A;启动A/D转换

CALL DELAY

MOVX A,@DPTR ;读取转换结果

MOV @R1,A;转存

LCALL P1ZH

CPL A

MOV P1,A

LJMP MAIN1

P1ZH: MOV C,ACC.0

MOV 07H,C

MOV C,ACC.1

MOV 06H,C

MOV C,ACC.2

MOV 05H,C

MOV C,ACC.3

MOV 04H,C

MOV C,ACC.4

MOV 03H,C

MOV C,ACC.5

MOV 02H,C

MOV C,ACC.6

MOV 01H,C

MOV C,ACC.7

MOV 00H,C

MOV A,20H

RET

DELAY:

MOV R6,#0H ;软件延时,等待转换结束

DELAY1:

MOV R5,#0FFH

DJNZ R5,$

DJNZ R5,$

DJNZ R6,DELAY1

RET

END

调试程序的说明:

在标有 的指令处设置一个断点,采用连续运行程序,在断点处观察30H 单元的内容,30H单元的内容;继续执行程序,观察8个发光二极管显示的采集结果二进制数。

然后,扭动电位器的按钮改变电压,再次执行程序,再次到断点处,30H单元的内容随之改变,继续执行程序,观察8个发光二极管显示的采集结果二进制数也随之改变。

实验记录及结果分析:最大模拟电压为5V,8个发光二极管显示的采集结果正好与D:0X30单元里面的内容相对应(1亮,0灭),其对应顺序经过程序修正后与二进制数一一

对应。数字电压为:V=5×V in÷255

数据换算成实际电压值是否与万用表的测量结果相等?

答:数据换算成的实际电压值与万用表的测量结果有所出入,可能是由于万用表的测量误差、电位器的接触误差、测量条件改变等引起。

六、实验思考题

本实验采用了延时等待的方式等待ADC0809转换结束,采集到的数字量为00H-6FH为正常;70H-0C0H为预警;0C1H-0FFH要报警。

正常情况采用LED灯亮指示正常;

预警情况采用LED灯以1HZ闪亮指示预警信息;

报警情况采用LED灯以10HZ闪亮,同时蜂鸣器发声报警。

提示:可以使用导线将A2的P31与 B5 的BUZZ相连,编写一个延时160uS的程序, 使P31每隔160uS取反一次,控制蜂鸣器报警。

宋体字符为添加程序:

ORG 8000H

LJMP MAIN

ORG 8100H

MAIN: MOV SP,#70H

MAIN1: MOV R1,#30H ;置数据区首地址,用于存放A/D转换结果

MOV DPTR,#7FF8H ;P2.0=0,且指向通道0 LOOP:

MOVX @DPTR,A;启动A/D转换

CALL DELAY

MOVX A,@DPTR ;读取转换结果

MOV @R1,A;转存

MOV A,30H

CJNE A,#6FH,NEXT1

NEXT1:JC NEXT2

CJNE A,#0C0H,NEXT3

NEXT3:JC NEXT4

LCALL P1ZH

CPL A

LOOP2:MOV P1,A

BUZ:CPL P3.1

LCALL WAIT2

MOV P1,#0FFH

CPL P3.1

LCALL WAIT2

SJMP LOOP2

NEXT4:LCALL P1ZH

CPL A

LOOP1:MOV P1,A

LCALL WAIT1

MOV P1,#0FFH

LCALL WAIT1

SJMP LOOP1

NEXT2:LCALL P1ZH

CPL A

MOV P1,A

LJMP MAIN1

P1ZH: MOV C,ACC.0

MOV 07H,C

MOV C,ACC.1

MOV 06H,C

MOV C,ACC.2

MOV 05H,C

MOV C,ACC.3

MOV 04H,C

MOV C,ACC.4

MOV 03H,C

MOV C,ACC.5

MOV 02H,C

MOV C,ACC.6

MOV 01H,C

MOV C,ACC.7

MOV 00H,C

MOV A,20H

RET

DELAY:

MOV R6,#0H ;软件延时,等待转换结束

DELAY1:

MOV R5,#0FFH

DJNZ R5,$

DJNZ R5,$

DJNZ R6,DELAY1

RET

WAIT1:MOV R5,#92

DELY:MOV R7,#35

DEL1:MOV R6,#120

DEL2:DJNZ R6,DEL2

DJNZ R7,DEL1

DJNZ R5,DELY

RET

WAIT2:MOV R5,#04H

LOOP3:MOV R6,#00H

DJNZ R6,$

DJNZ R6,$

DJNZ R6,$

DJNZ R5,LOOP3

RET

END

实验十五LED显示和键盘实验

五、实验步骤

①用导线连接D5区和A2区的P16→SCL,P17→SDA,P10→RST_L,INT_KEY→INT0,短接D5区的JP1跳线。

②模拟I2C软件包VI2C_ASM.INC文件,使用 $INCLUDE (VI2C_ASM.INC) 命令加入到你的汇编源文件中。在你的汇编源文件中定义SCL、SDA、ACK等信号。

③先编写显示的子程序(Display)和获取用户按键子程序(GetKey)。

④然后再进行整体编程。如果还有一难,可以先画流程一,再编写程序。

⑤显示结果为:上电运行时,8位数码管显示01234567,用户按键时,键值在最右侧LED数码管显示,原显示内容左移一位,例如:显示由“01234567”变为“1234567x”,(x:用户按键值,1~16,显示为1~F,g)。

一、实验参考程序

SDA BIT P3.0 ;I2C总线定义串行数据存取位SCL BIT P3.1 ;I2C总线定义串行时钟位

RST BIT P3.3 ;MCU复位输出信号,低电平复位

ZLG7290

INT_KEY BIT P3.2 ;MCU中断信号输入,有效的按键

动作使该引脚信号变为低电平MTD EQU 40H ;I2C总线发送数据缓冲区(8字节) MRD EQU 48H ;I2C总线接收数据缓冲区(8字节) DISBUF EQU 40H;显示缓冲区(8字节,可对应8位数

码管显示)

;定义ZLG7290器件地址及子地址

ZLG7290 EQU 70H ;ZLG7290的器件地址

ACK BIT 10H ;应答标志位

SLA DA TA50H ;器件的从地址

SUBA DA TA 51H ;器件的子地址

NUMBYTE DA TA 52H ;读/写的字节数变量

KEY DA TA 53H ;返回用户按键值

SYSTEMREG E QU 00H ;系统寄存器地址,保存ZLG7290

系统状态

KEYREG EQU 01H ;键值寄存器,表示被压按键的键值CMDBUF0 EQU 07H ;命令缓冲区0

CMDBUF1 EQU 08H ;命令缓冲区1

DPRAM EQU 10H ;显示缓存寄存器

ORG 8000H

LJMP MAIN

ORG 8100H

;-------主程序如下:

MAIN: MOV SP,#70H ;堆栈区从70H开始

CLR R ST ;复位ZLG7290

LCALL DELAY;等待复位完成,ZLG7290复位周期

比较长,必须等待

SETB RST ;结束复位

LCALL DELAY

LCALL CLSDISP ;清除显示

MAINLOOP: MOV DISBUF+0,#0 ;上电运行时,8位数码管显示

01234567

MOV DISBUF+1,#1 ;给显示缓冲区赋值,01234567

MOV DISBUF+2,#2

MOV DISBUF+3,#3

MOV DISBUF+4,#4

MOV DISBUF+5,#5

MOV DISBUF+6,#6

MOV DISBUF+7,#7

LCALL DISPLAY ;调用显示子程序,显示内容WAITKEY: JB INT_KEY,WAITKEY;查询按键

LCALL GETKEY ;获取键值

MOV A,KEY

JZ WAITKEY;KEY=0无键按下,继续查询

MOV DISBUF+7,DISBUF+6 ;显示内容左移

MOV DISBUF+6,DISBUF+5

MOV DISBUF+5,DISBUF+4

MOV DISBUF+4,DISBUF+3

MOV DISBUF+3,DISBUF+2

MOV DISBUF+2,DISBUF+1

MOV DISBUF+1,DISBUF+0

MOV DISBUF+0,KEY

LCALL DISPLAY

LJMP WAITKEY

;子程序名:CLSDISP

;功能:清除显示内容

;调用:VI2C_ASM.INC

;入口参数:无

;出口参数:无

;占用资源: R0,R1,R2,R3(工作寄存器组1),ACC,CY,R5(当前工作寄存器组)CLSDISP: MOV R5,#8 ;循环计数器初值,8位数码管MOV A,#01100000B ;按位下载数据且译码指令01100

A2A1A0

;A2~A0:对应显示位置1~8位数码管CLS1: MOV SLA,#ZLG7290 ;指定器件地址

MOV SUBA,#CMDBUF0 ;指定子地址

MOV MTD,A ; 命令送I2C总线发送数据缓冲区

MOV MTD+1,#1FH ;命令参数,1FH:无显示

MOV NUMBYTE,#02H ;待发送数据2字节

PUSH ACC ;保护ACC

PUSH PSW ;保护PSW

SETB RS0 ;切换工作寄存器,I2C通信软件使用工

作寄存器组1

CLR RS1

LCALL IWRNBYTE ;调用写2字节数据程序

(VI2C_ASM.INC,I2C模拟软件包)POP PSW ;恢复PSW

POP ACC ;恢复ACC

INC A ;按位下载数据且译码指令地址部分+

1

LCALL DELAY ;延时,等待ZLG7290执行上述命令

DJNZ R5,CLS1 ;没有达到8次,继续循环

RET ;子程序返回

;子程序名:DISPLAY

;功能:在8段LED数码管显示

;调用:VI2C_ASM.INC

;入口参数: DISBUF+0~ DISBUF+7,8字节显示缓冲区

;出口参数:无

;占用资源: R0,R1,R2,R3(工作寄存器组1),ACC,CY,R0,R5(当前工作寄存器组)DISPLAY: MOV R5,#8 ;循环计数器初值,8位数码管

MOV A,#01100000B ;按位下载数据且译码指令01100

A2A1A0

;A2~A0:对应显示位置1~8位数码管MOV R0,# DISBUF ;R0-> DISBUF

DISP1: MOV SLA,#ZLG7290 ;指定器件地址

MOV SUBA,#CMDBUF0 ;指定子地址

MOV MTD,A ;命令送I2C总线发送数据缓冲区

MOV MTD+1,@R0 ;命令参数,待显示数据送I2C总线发

送数据缓冲区

MOV NUMBYTE,#02H ;待发送数据2字节

PUSH ACC ;保护ACC

PUSH PSW ;保护PSW

SETB RS0 ;切换工作寄存器,I2C通信软件使用工

作寄存器组1

CLR RS1

LCALL IWRNBYTE ;调用写2字节数据程序

(VI2C_ASM.INC,I2C模拟软件包)POP PSW ;恢复PSW

POP ACC ;恢复ACC

INC A ;按位下载数据且译码指令地址部分+

1

INC R0 ;R0+1,指向下一个待显示数据

LCALL DELAY ;延时,等待ZLG7290执行上述命令

DJNZ R5,DISP1 ;没有达到8次,继续循环

RET ;子程序返回

;子程序名:GETKEY

;功能:获取用户按键值(KEY)

;调用:VI2C_ASM.INC

;入口参数:无

;出口参数:KEY

;占用资源: R0,R1,R2,R3(工作寄存器组1),ACC,CY

GETKEY: MOV SLA,#ZLG7290 ;指定器件地址

MOV SUBA,#01H ;指定子地址

MOV NUMBYTE,#01H ;读1字节数据

PUSH ACC ;保护ACC

PUSH PSW ;保护PSW

SETB RS0 ;切换工作寄存器,I2C通信软件使用工

作寄存器组1

CLR RS1

LCALL IRDNBYTE ;调用读1字节数据程序

POP PSW ;恢复PSW

POP ACC ;恢复ACC

MOV KEY,MRD ;读取的数据送KEY

RET ;子程序返回

;子程序名: DELAY

;功能:延时约36.5 MS(11.0592MHZ时钟)

;调用:YS500US

;入口参数:无

;出口参数:无

;占用资源: R7,R6

DELAY: MOV R7,#80H

MIN: LCALL YS500US

DJNZ R7,MIN

RET

;子程序名: YS500US

;功能:延时约279US(11.0592MHZ时钟)

;调用:无

;入口参数:无

;出口参数:无

;占用资源: R6

YS500US:MOV R6,#80H

DJNZ R6,$ ;延时128×2T=256T (T=1/1159200)

RET

$INCLUDE(VI2C_ASM.INC) ;将VIIC软件包加入到本段代码后END

采用运行到断点的方式进行调试:查询D:0X53(即用户按键值)单元的内容依次为00H、01H、02H

进行第二次调试:

七、实验思考题

P1口连接不上,改用P3口连接,修改起始程序如下:

SDA BIT P3.0

SCL BIT P3.1

RST BIT P3.3

①编写LED数码管闪烁控制子程序,实现对指定位进行闪烁控制。

DP Flash 0 D4 D3 D2 D1 D0 十六进制数据显示字符

1 码闪

只需将相应的DISBUF+×的内容改为4×H,例如MOV DISBUF+4,#44H

或ANL DISBUF+4,#40H

②如果只允许S1~S10键有效,该如何编写子程序?

修改WAITKEY相应程序如下:

WAITKEY: JB INT_KEY,WAITKEY

LCALL GETKEY

MOV A,KEY

JZ WAITKEY

CJNE A,#0BH,W ;判断按键是否为S1~S10 W:JNC WAITKEY

MOV DISBUF+7,DISBUF+6

MOV DISBUF+6,DISBUF+5

MOV DISBUF+5,DISBUF+4

MOV DISBUF+4,DISBUF+3

MOV DISBUF+3,DISBUF+2

MOV DISBUF+2,DISBUF+1

MOV DISBUF+1,DISBUF+0

MOV DISBUF+0,KEY

LCALL DISPLAY

LJMP WAITKEY

③如果让对应S1~S10键,显示为1~9,0,该如何编写程序?

修改WAITKEY相应程序如下:

WAITKEY: JB INT_KEY,WAITKEY

LCALL GETKEY

MOV A,KEY

JZ WAITKEY

MOV DPTR,#TABLE

SUBB A,#01H

MOVC A,@A+DPTR

MOV KEY,A

MOV DISBUF+7,DISBUF+6

MOV DISBUF+6,DISBUF+5

MOV DISBUF+5,DISBUF+4

MOV DISBUF+4,DISBUF+3

MOV DISBUF+3,DISBUF+2

MOV DISBUF+2,DISBUF+1

MOV DISBUF+1,DISBUF+0

MOV DISBUF+0,KEY

LCALL DISPLAY

LJMP WAITKEY

ORG 9000H

TABLE:DB 01H,02H,03H,04H,05H,06H,07H,08H,09H,00H

八、说明

实验时,工程中要包含VI2C_ASM.INC文件,且不能打开(即没有打开窗口)。

相关主题
文本预览
相关文档 最新文档