您好,欢迎来到爱够旅游网。
搜索
您的当前位置:首页单片机设计数字电压表

单片机设计数字电压表

来源:爱够旅游网


2012-2013-1《单片机接口与技术》课程设计

学院: 专业: 班级: 姓名: 学号:

数字电表

一.前言

传统的指针式电压表功能单一、精度低,不能满足数字化时代的需求,采用单片机的数字电压表,由精度高、抗干扰能力强,可扩展性强、集成方便。目前,由各种单片A/D 转换器构成的数字电压表,已被广泛用于电子及电工测量、工业自动化仪表、自动测试系统等智能化测量领域,示出强大的生命力。与此同时,由DVM扩展而成的各种通用及专用数字仪器仪表,也把电量及非电量测量技术提高到崭新水平。

二.题目分析

数字电压表,它是采用数字化测量技术,把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。利用单片机ATS51与ADC0809设计一个数字电压表,能够测量0-5V之间的直流电压值,四位数码显示,但要求使用的元器件数目最少。

三.硬件设计

1.流程图

2.总体电路图

此电路的工作原理是:+5V模拟电压信号通过变阻器VR1分压后由ADC08009的IN0通道进入(由于使用的IN0通道,所以ADDA,ADDB,ADDC均接低电平),经过模/数转换后,产生相应的数字量经过其输出通道D0-D7传送给ATC51芯片的P1口,ATC51负责把接收到的数字量经过数据处理,产生正确的7段数码管的显示段码传送给四位LED,同时它还通过其四位I/O口P2.0、P2.1、P2.2、P2.3产生位选信号控制数码管的亮灭。此外,ATC51还控制ADC0809的工作。其中,单片机ATC51通过定时器中断从P2.4输出方波,接到ADC0809的CLOCK,P2.6发正脉冲启动A/D转换,P2.5检测A/D转换是否完成,转换完成后,P2.7置高从P1口读取转换结果送给LED显示出来[3]。

四.软件流程设计

1. 程序设计总方案

根据模块的划分原则,将该程序划分初始化模块,A/D转换子程序和显示子程序,这三个程序模块构成了整个系统软件的主程序,如图

开始 初始化 调用A/D转换子程序 调用显示子程序 结束

2. 系统子程序设计 (1) 初始化程序

所谓初始化,是对将要用到的MCS_51系列单片机内部部件或扩展芯片进行初始工作状态设定,初始化子程序的主要工作是设置定时器的工作模式,初值预置,开中断和打开定[9]。

(2)A/D转换子程序

A/D转换子程序用来控制对输入的模块电压信号的采集测量,并将对应的数值存入相应的内存单元,其转换流程图如图

开始 启动转换 A/D转换结束? 输出转换结果 数值转换 显示 结束

(3)显示子程序

显示子程序采用动态扫描实现四位数码管的数值显示,在采用动态扫描显示方式时,要使得LED显示的比较均匀,又有足够的亮度,需要设置适当的扫描频率,当扫描频率在70HZ左右时,能够产生比较好的显示效果,一般可以采用间隔10ms对LED进行动态扫描一次,每一位LED的显示时间为1ms[10]。

在本设计中,为了简化硬件设计,主要采用软件定时的方式,即用定时器0溢出中断功能实现11μs定时,通过软件延时程序来实现5ms的延时。

3.主程序

A_DPORT EQU 8000H ;0809通道0地址

Z8279 EQU 08701H ;8279 状态/命令口地址 D8279 EQU 08700H ;8279 数据口地址 LEDMOD EQU 00H ;左边输入 八位字符显示 ;外部译码键扫描方式,双键互锁 LEDFEQ EQU 2FH ;扫描速率

LEDCLS EQU 0C1H ;清除显示 RAM

LEDWR0 EQU 80H ;设定的将要写入的显示RAM地址 READKB EQU 40H ;读 FIFO RAM 地址 0 的命令字

S1 EQU 78H S2 EQU 79H S3 EQU 7AH S4 EQU 7BH TD EQU 7CH FLAG EQU 7DH ORG 0000H LJMP MAIN ORG 0003H LJMP INT_0 ORG 0013H LJMP INT_1 ORG 0040H

;*************************************************************************************** MAIN:

MOV SP,#60H MOV R0,#70H CLR TD CLR FLAG SETB IT1 SETB EX1 SETB EA LP0:

MOV DPTR,#A_DPORT LCALL INIT8279 LCALL TEST

LCALL DISPLAY LJMP LP0 NOP NOP NOP

LJMP MAIN

;**************************************************************************************** INT_1:

CLR EA CLR EX1 PUSH ACC MOV A,FLAG CPL A

MOV FLAG,A SETB EA SETB EX1

POP ACC RETI

;***********************数据采集***********要求R0=#70H****MOV A,R1********CPL A********* TEST:

PUSH 3 MOV R3,#8

MOV R7,#0FFH ;初始化 SETB IT0 SETB EA

SETB EX0 ;INT0 允许 MOV DPTR,#A_DPORT A_D:

MOVX @DPTR,A ;启动 A_D NOP NOP

CJNE R7,#00H,$ ;等待 A_D 转换结束 MOV @R0,A ;数据输出 INC R0

MOV R7,#0FFH ;清读数标志 DJNZ R3,A_D MOV R0,#70H POP 3 RET

;****************************************************** INT_0:

CLR EA CLR EX0

MOVX A,@DPTR ;读 A_D 数据 NOP NOP

MOV R7,#00H ;置读数标志 INC DPTR SETB EA SETB EX0 RETI

;************************************************************************ INIT8279: ;8279初始化子程序 PUSH DPH ;保存现场 PUSH DPL PUSH ACC

LCALL DELAY ;延时 MOV DPTR ,#Z8279

MOV A,#LEDMOD ;置8279工作方式

MOVX @DPTR,A

MOV A,#LEDFEQ ;置键盘扫描速率 MOVX @DPTR,A

MOV A,#LEDCLS ;清除 LED 显示 MOVX @DPTR,A

POP ACC ;恢复现场 POP DPL POP DPH RET

DELAY: ;延时子程序 PUSH 0 ;保存现场 PUSH 1 MOV 0,#0H DELAY1:

MOV 1,#0H DJNZ 1,$

DJNZ 0,DELAY1

POP 1 ;恢复现场 POP 0 RET

;******************************************************* ;显示字符子程序 ;输入: R4,位置 R5,值 DISLED:

PUSH DPH ;保存现场 PUSH DPL PUSH ACC

MOV A,#LEDWR0 ;置显示起始地址 ADD A,R4 ;加位置偏移量 MOV DPTR,#Z8279

MOVX @DPTR,A ;设定显示位置

MOV DPTR,#LEDSEG ;置显示常数表起始位置 MOV A,R5

MOVC A,@A+DPTR ;查表 MOV DPTR,#D8279

MOVX @DPTR,A ;显示数据 POP ACC ;恢复现场 POP DPL POP DPH RET

;******************************************************************** DISPLAY:

MOV A,FLAG

CJNE A,#0FFH,DISP1

DISP2:

MOV R0,#70H CLR TD PUSH 3 MOV R3,#8 LP2:

MOV A,R0 ADD A,TD MOV R0,A LCALL ZCBCD MOV A,S1 ADD A,#16 MOV R5,A MOV R4,#07

LCALL DISLED MOV R5,S2 MOV R4,#06

LCALL DISLED MOV R5,S3 MOV R4,#5

LCALL DISLED MOV R5,S4 MOV R4,#4 LCALL DISLED MOV R5,TD MOV R4,#1 LCALL DISLED MOV A,TD INC A ANL A,#07 MOV TD,A LCALL DELAY11 DJNZ R3,LP2 CLR TD POP 3

MOV R0,#70H RET DELAY11:

PUSH 5 PUSH 6 PUSH 7

MOV R5,#200 B2:

MOV R6,#20

B3:

MOV R7,#248 DJNZ R7,$ DJNZ R6,B3 DJNZ R5,B2 POP 7 POP 6 POP 5 RET

;******************************* DISP1:

PUSH 3

MOV R3,#10 MOV R0,#70H LP1:

LCALL GETKEY

CJNE A,#0FFH,CONT MOV A,B

CJNE A,#30H,CONT LCALL CLEAR_T CONT:

MOV A,R0 ADD A,TD MOV R0,A LCALL ZCBCD MOV A,S1 ADD A,#16 MOV R5,A MOV R4,#07

LCALL DISLED MOV R5,S2 MOV R4,#06

LCALL DISLED MOV R5,S3 MOV R4,#5

LCALL DISLED MOV R5,S4 MOV R4,#4 LCALL DISLED MOV R5,TD MOV R4,#1 LCALL DISLED LCALL DELAY10 DJNZ R3,LP1

POP 3

MOV R0,#70H RET DELAY10:

PUSH 5 PUSH 6 PUSH 7

MOV R5,#5 D2:

MOV R6,#20 D3:

MOV R7,#248 DJNZ R7,$ DJNZ R6,D3 DJNZ R5,D2 POP 7 POP 6 POP 5 RET

;************************************************************** CLEAR_T:

PUSH ACC MOV A,TD INC A

ANL A,#07 MOV TD,A MOV R3,#10 POP ACC RET

;************************************************************ ZCBCD:

MOV A,@R0 MOV B,#51 DIV AB MOV S1,A MOV A,B CLR F0 SUBB A,#1AH MOV F0,C MOV A,#10 MUL AB MOV B,#51 DIV AB

JB F0,LOOP2

ADD A,#5 LOOP2:

MOV S2,A MOV A,B CLR F0 SUBB A,#1AH MOV F0,C MOV A,#10 MUL AB MOV B,#51 DIV AB

JB F0,LOOP3 ADD A,#5 LOOP3:

MOV S3,A MOV A,B CLR F0 SUBB A,#1AH MOV F0,C MOV A,#10 MUL AB MOV B,#51 DIV AB

JB F0,LOOP4 ADD A,#5 LOOP4:

MOV S4,A RET

;********************************************************* ;读取键盘子程序

;输入: 无 ; 输出: B: 读到的键码 A: 按键的标志 GETKEY:

PUSH DPH ;保存现场 PUSH DPL PUSH PSW

MOV DPTR,#Z8279

MOVX A,@DPTR ;读8279状态 ANL A,#07H ;屏蔽D7-D3

JNZ GETVAL ;判断是否有键输入 MOV A,#0H ;置标志(无键输入) SJMP NKBHIT GETVAL:

MOV A,#READKB ;读 FIFO RAM 命令 MOVX @DPTR,A

MOV DPTR,#D8279

MOVX A,@DPTR ;读键

ANL A,#3FH ;屏蔽 SHIFT 和 CTRL 键 MOV DPTR,#KEYCODE ;键码表起始地址 MOVC A,@A+DPTR ;查表

MOV B,A ;置返回键值

MOV A,#0FFH ;置标志(有键输入) NKBHIT:

POP PSW ;恢复现场 POP DPL POP DPH RET

;********************************************************* ;LED显示常数表 LEDSEG:

DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ; 0,1,2,3,4,5,6,7' DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ; 8,9,A,B,C,D,E,F' DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH ;0,1,2,3,4,5, ;键盘键码表 KEYCODE:

DB 30H,31H,32H,33H,34H,35H,36H,37H ; 0,1,2,3,4,5,6,7' DB 38H,39H,3AH,3BH,3CH,3DH,3EH,3FH ; 8,9,A,B,C,D,E,F' END

总结

1. 当IN0口输入电压值为0V时,显示结果如图,测量误差为0V。

2.当IN0输入电压值为1.50V时,显示结果如图。测量误差为0.01V。

3. 当IN0口输入电压值为3.50V时,显示结果。测量误差为0.01V。

因为该电压表设计时直接用5V的供电电源作为电压,所以电压可能有偏差。 可以通过校正ADC0808的基准电压来解决。

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

Copyright © 2019- igbc.cn 版权所有 湘ICP备2023023988号-5

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务