您的当前位置:首页正文

单片机 数字电压表制作 课程设计3

2022-06-30 来源:步旅网
河北工业大学计算机硬件技术基础 (MCS-51单片机原理及应用)课程设计报告

学院:土木工程学院 班级:交通021 设计人:闫影 021175

1.题目:制作数字电压表 2.总体设计

1) 所实现的功能描述:利用单片机8051与ADC0809设计一个数字电压表, 能够测量0-5V之间的直流电压值,三位数码管显示,显示的是十进制数值。 由于有八个二进制位,最大能显示到255。

2) 设计方案的描述:直流电压值由实验系统上的电位器提供,通过ADC0809 转换器,将模拟量转换成数字量,然后再将其数字量转换为十进制数值;8位 二进制位可以转换为3位十进制数,因此由三位数码管显示其值。程序运行, 数码管显示000X.XX,X.XX显示的是电压表当前所测电压的值,调节电位器,X.XX显示的数字将变化。 3.硬件系统设计

1) 实验设备:1.IBM PC机(PC/XT.AT.286.386.486)。 2.BH-86通用微机实验培训装置。

2) 接线方式:断开电源,把0809的零通道IN0用插针接至ANI1孔,CS4引脚接8000H孔。8位数据输出引脚直接与总线相连。 3)

试验电路图: ADC0809 W1 AIN1 INT0 IN-0 msb2-1 D7 INT1 IN-1 2-2 D6 0-5V INT2 IN-2 2-3 D5 (接地) INT3 IN-3 2-4 D4 INT4 IN-4 2-5 D3 U35 INT5 IN-5 2-6 D2 74LS90 INT6 IN-6 2-7 D1 MS1 INT7 IN-7 lsb2-8 D0 MS2 EOC EOC ADD-A MS3 Q0 CLOCK ADD-B (接地) MS4 Q1 >=1 N3 ALE ADD-C VCC ALE CLK0 Q2 REF(+) CLK1 Q3 /WR >=1 N1 START REF(-) CS4 (接地) 74LS138 >=1 N2 OE 8000 /RD 1

4) 资源分配:

8155 工作寄存器: 8000H 命令/状态口 R0 显示指针

8001H A口 R1 存储数据 8002H B口 R5,R7 8003H C口

数据缓冲区:79H,7AH,7BH, 7CH,7DH,7EH, 显示数据。 累加器A,数据指针DPTR,内部存储器30H.31H.21H。 段码表首地址DDFF。 4. 软件系统设计:

1)

划分功能模块:1.A/D转换模块,实现模拟量的采集和模拟量与数字量的转 换。

2.LED显示模块,实现数字量的显示。

3.二进制与十进制转换模块,实现二进制转成十进制。 4.延时程序模块。

2)

开始 程序初始化,给 缓冲区赋初始值

方式控制字送命令口

调用显示子程序

将通道地址给A,数据指 针放在8155命令口 跳 转 启动A/D转换器 延时

读数,并将缓冲 区地址送入R0

调入二-十进制转换子程序 显示数据

2

程序流程图:

3)主要技术问题的描述:

确定通道地址,CBA接地址线A2A1A0--DPTR中的地址低三位, CBA接数据线

D2D1D0--A中的数据低三位

启动A/D转换,MOVX @DPTR,A; A中数任意

软件延时,8031时钟频率6MHz,ALE为1MHz,ADC0809 对时钟频率的要求为

10Hz~1280kHz

转换时间为100μs ,8031机器周期为2μs 。 MOV R6,#50 DJNZ R6,$

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

5.程序清单及注释:

ORG 0000H ;给程序设首地址

SE11:MOV SP,#53H ;将堆栈指针设在53H单元 MOV 7EH,#00H ; MOV 7DH,#00H ; MOV 7CH,#00H ;

MOV 7BH,#10H ; 给缓冲区地址赋初始值 MOV 7AH,#10H ; MOV 79H,#10H ;

MOV DPTR,#0FF20H ;指针指向命令口

MOV A,#3 ;对8155初始化,A和B口输出,C口输入 MOVX @DPTR, ;将方式控制字送命令口 LO18:LCALL SSEE ;长调用显示子程序 MOV A,#00H ;将通道地址00给A

MOV DPTR,#8000H ;数据指针指向A/D选通口 MOVX @DPTR,A ;启动A/D

MOV R7,#0FFH ;给R7赋值,实现延时

LO17:DJNZ R7,LO17 ;循环转移指令,实现延时 MOVX A,@DPTR ;读数

MOV R0,#79H ;给显示缓冲区指针设初始值 CALL PTDS ;调用二-十进制转换子程序 SJMP LO18 ;跳转到LO18首地址 PTDS:MOV R1,A ;将A的内容给R1 ACALL PTDS1 ;

ACALL PTDS1 ; 调用PTDS1子程序 ACALL PTDS1 ;

RET ;调用程序结束 PTDS1:MOV B,#10 ;给B赋值10 DIV AB ;A/B

MOV @R0,B ;将余数B存到显示缓冲区指针地址 INC R0 ;R0地址增1 RET ;调用程序结束

SSEE:SETB RS1 ;给RS1置1,确定工作寄存器组 MOV R5,#05H ;置字位码初值,(R5)=05H

3

SSE2:MOV 30H,#20H ;(30H)=20H, MOV 31H,#7EH ;(31H)=7EH MOV R7,#06H ;(R7)=06H

SSE1:MOV R1,#21H ;(R1)=21H,A口地址给R1

MOV A,30H ;(A)=(30H)=20H,A指向命令口 MOVX @R1,A ;存储数据,((R1))=(A)=21H

MOV R0,31H ;显示缓冲区指针初值,(R0)=(31H)=7EH

MOV A,@R0 ;(A)=((R0)),读数

MOV DPTR, #DDFF ;将数据指针指向字形码首地址 MOVC A,@A+DPTR ;查字形码表 MOV R1,#22H ;B口地址给R1

MOVX @R1,A ;存储数据,((R1))=(A)=22H ACALL DLY ;调用延时子程序

MOV A,30H ;(A)=(30H) RR A ;A右移

MOV 30H,A ;(30H)=(A) DEC 31H ;(31H)=(31H)-1 MOV A,#0FFH ;(A)=0FFH MOVX @R1,A ;存储数据

DJNZ R7,SSE1 ;(R7)-1<>0,则转移 DJNZ R5,SSE2 ;(R5)-1<>0,则转移 CLR RS1 ;(RS1)=0

RET ;调用子程序结束 DDFF:DB 0C0H,0F9H,0A4H,0B0H ; DB 99H,92H,82H,0F8H,80H,90H ;

DB 88H,83H,0C6H,0A1H ; 字形码表 DB 86H,8EH,0FFH,0CH,89H,0DEH ; DLY:MOV R6,#50 ;(R6)=50 ; DJNZ R6,$ ;(R6)-1<>0,转移 ;

RET ; 延时 END ;

6.调试程序的方法:

先根据原程序,对自己不懂的地方进行小改动,看结果有什末变化,进而可以知道该语句的功能,逐一将程序弄懂。

将硬件上的线插好,接通电源,检查数码管输出是否符合。若不对,断开电源,检查插线。

对于二进制-十进制的转换,因为作题的时候总是用乘以2的零次,一次等那样的方法,所以开始想的也是那样转换,可是太麻烦了,我编不出来。后来翻了翻书,还是书上的一个程序提醒了我,用除的方法转换。

分步调试,根据实验书上的程序,我自己先改了一个数码管的输出,将二进制改成十进制,然后插线调试,看数码管是否显示十进制,如果正确显示十进制,则说明二-十进制转换子程序正确。

检查显示程序,若字形码部分不改,也能显示十进制,则字形码不变。

4

7.指出所设计问题的不足和改进方法:

我所设计的是用A/D转换器实现一个用三个数码管显示十进制的简易数字电压表, 由于有八个二进制位,所以最大能显示到255,基本上符合要求。 8.收获体会:

通过这次硬件设计,使我在以前学习的基础上,对弹片机的应用和知识有了更进一步的掌握。以前在上课的时候总觉得学这个没有用,所以也没有认真学,也因此在设计开始连程序都看不懂,这要感谢我的同学是她让我一步一步的把指令弄懂,也要感谢给我讲解的老师们,我知道他们都在用心的给我讲,想让我明白,可我真是硬件学得太少了,一些专有名词都不知道什末意思。功夫不负有心人,最后在老师的指点下,我终于懂了。在程序调试出来的那一刻,我的心里很激动,真的,没想到我真的做出来了。

从没出来到出来其实是一个很短的过程,也就一个小时吧,我这个程序也是挺简单的。经老师那末一提示,思路立刻就清晰了,虽然以前也曾这样想过,但是没有动手去做,因为心里没底,没有老师的肯定,不知道对不对。所以以后我要努力改掉这个毛病,放手大胆的去做,程序本身就是一个调试的过程,谁也不敢保证一次就对了。

所以很感谢老师们给了我们这次机会,让我们锻炼的自己的理解能力和开拓能力。 在我们在机房的时候,老师们也很辛苦的陪在一边,以解答我们的疑问。

在这里,我还想提一点意见就是以后再有这样的实习,希望能多一点上机时间,能把这些班都分散开来。也希望能给更多的同学有答辩的机会,这样会督促我们更好的理解程序,我也是在知道自己要答辩的时候才开始研究那个程序的意思的。

5

因篇幅问题不能全部显示,请点此查看更多更全内容