基于单片机数字电压表设计
专业:电气自动化 班级:092
成员:苏振涛 林茂静
学号:0901020201 0901020243
基于单片机数字电压表设计
1 方证
1.1 系统的设计任务
设计单片机主电路、数据采集接口电路、LED显示电路、拨码控制电路,能
够实现对8路电压值进行测量,能够显示当前测量通道号及电压值,电压精度小数点后1位,可以通过键盘选择循环显示8路的检测电压值和指定通道的检测电压值。
1.2 设计方案
将数据采集接口电路输入电压传入ADC0809数模转换元件,经转换后通过
D0至D7与单片机P0口连接,把转换完的模拟信号以数字信号的信号的形式传给单片机,信号经过单片机处理从LED数码显示管显示。拨码开关连P3口,实现通道选择。P2口接数码管位选,P1接数码管,实现数据的动态显示,如下图所示。
c51 P0 数码管 P1 P2 ALE P3 ADC0809 D0~D7 IN0 : IN7 CLOCK VREF+ VREF-
位选 拨码开关 图1.1系统总体方案结构图
2
基于单片机数字电压表设计
1.3 软硬件开发环境
硬件选择:选择c51作为单片机芯片,选用8段共阴极LED数码管实现电压显示,选用式按键作为程序的跳转与选择,利用ADC0809作为数模转换芯片,利用P0至P4的各个串口来进行不同设备间的连接,计算机进行汇编,H51/L仿真器,单片机多功能实验箱。
软件开发环境: 用Protel99SE软件画电路图 、WAVE软件进行程序编写。
2 数字电压表硬件设计
2.1 单片机主电路设计
在本次课题设计中我们选择了51芯片,其具有功能强、体积小、成本低、功耗小等特点,它可单独地完成现代工业控制所要求的智能化控制功能,能在软件的控制下准确、迅速、高效地完成程序设计者事先规定的任务。 2.1.1 复位电路
复位电路如图2.1所示,单片机系统常常有上电复位和操作复位两种。上电复位是指单片机上点瞬间,要在RST引脚上出现宽度大于10ms的正脉冲,才能使单片机进入复位状态。操作复位是指用户按下“复位”按钮使单片机进入复位状态。
图2.1 复位电路
3
基于单片机数字电压表设计
2.1.2 晶振电路
晶振电路用于产生单片机工作所需的时钟信号,使用晶体震荡器时,c2,c3取值20~40PF,使用陶瓷震荡器时c2,c3取值30~50PF。在设计电路板时,晶振和电容应尽量靠近芯片,以减小分布电容,保证震荡器的稳定性。18引脚接XTAL1,19引脚接XTAL2,20引脚接地。
图2.2 晶振电路
2.2 测量、转换电路设计
使用ADC0809作为数模转换元件,其引脚图如2.3所示
图2.3 ADC0809引脚图
4
基于单片机数字电压表设计
ADC0809是带有8:1多路模拟开关的8位A/D转换芯片,所以它可有8个模拟量的输入端,由芯片的A,B,C三个引脚来选择模拟通道中的一个。A,B,C三端分别与C51的P0.0~P0.2相接。地址锁存信号(ALE)和启动转换信号(START),由P2.6和/WR或非得到。输出允许,由P2.6和/RD或非得到。时钟信号,可有C51的ALE输出得到,不过当采用12M晶振时,应该先进行二分频,以满足ADC0809的时钟信号必须小于0K的要求。与单片机的连接如图2.4所示
图2.4数据转换系统电路图
2.3 按键电路设计
按键选择上有两种方法可供选择,式按键与矩阵式按键,再此使用了式按键。按键模块如图2.5所示,其与P3口连接,实现通道选择。
对按键的工作过程可分为两步:第一步是CPU首先检测键盘上是否有键按下;第二步是在识别是哪一个键按下。检测键盘上有无键按下可采取查询各自方式、定时扫描构造方式和中断耕作方式。在此选择了查询工作方式。
按键模块如图2.5所示,其与P3口连接,实现通道选择。
5
基于单片机数字电压表设计
图2.5按键模块
2.4 显示电路设计
2.4.1 LED数码管构成
LED数码管显示器是由发光二极管显示字段的显示器件,也称为数码管。其外形结构如图所示。它由8个发光二极管构成,通过不同的组合可用来显示0-9、A-F及小数点“.”等字符。
数码管有共阴极和共阳极两种结构规格,如图2.5所示。图中电阻为外接。共阴极数码管的发光二极管阴极共地,当某发光二极管的阳极为高电平时,二极管点亮;共阳极数码管的发光二极管是阳极,并接高电平,对于需点亮的发光二极管将其阴极接低电平即可。
对照图2.5中的字段:7段发光二极管,在加上1个小数点位,共计8段,因此提供给LED显示器的字形码正好一字节。
6
基于单片机数字电压表设计
图2.6(a) 共阴极 图2.6(b) 共阳极
图2.6(C)字段显示
2.4.2 显示方式 (1) 静态显示方式
直接利用并行口输出。LED显示工作于静态显示方式时,各位的共阴极连接在一起接地;每位的段选线分别于一个8位的锁存输出相连。一般称之为静态显示,是由于显示器中的各位相互。而且各位的显示字符一经确定,相应锁存器的输出将维持不变,直到显示另一个字符为止。
利用通信号串行输出。在实际应用中,多位LED显示时,为了简化电路,在系统不需要通信功能时,经常采用串行通信口工作方式0,外接移位寄存器
7
基于单片机数字电压表设计
74LS1、CD4094来实现静态显示。 (2) 动态显示方式
对多位LED显示器的动态显示,通常都时采用动态扫描的方法进行显示,即逐个循环点亮各位显示器。这样虽然在任一时刻只有一位显示器被点亮,但是由于间隔时间较短,且人眼具有视觉残留效应,看起来与全部显示器持续点亮一样。
为了实现LED显示器的动态扫描,除了要给显示器提供的输入之外,还要对显示器加位选择控制,这就是通常所说的段控和位控。因此多位LED显示器接口电路需要有两个输出口,其中一个用于输出8位控信号;另一个用于输出段控信号,其连接图如下。
2.7 LED显示电路
8
基于单片机数字电压表设计
表2.1七段LED段选码表
显示字符
0 1 2 3 4 5 6 7 8 9 A B
共阴极段 3FH 06H 5BH 4FH 66H 6DH 7DH 07H 7FH 6FH 77H 7CH 显示字符
C D E F P U Γ y 8. “灭” / / 共阴极段 39H 5EH 79H 71H 73H 3EH 31H 6EH FFH 00H / /
3 软件设计
3.1 主程序设计
3.1.1 工作流程
首先拨动拨码开关k1,如果是低电平,程序转向选择通道程序,拨动k2的次数即是选择的通道号,拨动k3表示确认。转向数据读取程序,再到显示程序,显示出通道号和电压值。如果k1是高电平,则转向循环显示程序,即先显示第0路最后显示第7路电压值和相应通道号。工作流程图如下:
9
开始 基于单片机数字电压表设计
K1高电平? N Y
结束 数据处理显示 启动A/D转换 选择第0路 记录k2拨动次数 选择通道号
图3.1主程序流程
3.1.2 存储空间定义安排
60H用于存放A/D转换结果,30H、31H、32H分别存储显示用的三位数据
如下表:
表3.1存储空间定义表
60H 30H 31H 32H 34H
10
用于存放A/D转换结果
电压值整数部分 电压值小数部分 循环显示的通道号 选择的通道号
基于单片机数字电压表设计
3.2 模块程序设计
3.2.1 A/D转换测量程序
A/D转换的常用方法有:①计数式A/D转换,②逐次逼近型A/D转换,③双积分式A/D转换,④ V/F变换型A/D转换。在这些转换方式中,记数式A/D转换线路比较简单,但转换速度较慢,所以现在很少应用。双积分式A/D转换精度高,多用于数据采集及精度要求比较高的场合,如5G14433(31/2位),AD7555(41/2位或51/2位)等,但速度更慢。逐次逼近型A/D转换既照顾了转换速度,有具有一定的精度,这里选用的是逐次逼近型的A/D转换芯片ADC0809。采用中断控制的方式实现,不浪费时间,效率较高。其流程图如下:
11
基于单片机数字电压表设计
开始 启动转换 中断请求 中断服务 Y 读取数据 0809地址加1 小于FFFF? N 结束
图3.2 A/D转换测量程序
3.2.2 显示程序
对多位LED显示器的动态显示,通常都是采用动态扫描的方法进行显示,即逐个循环点亮各位显示器。这样虽然在任一时刻只有一位显示器被点亮,但是由于间隔时间较短,且人眼具有视觉残留效应,看起来与全部显示器持续点亮一样。
为了实现LED显示器的动态扫描,除了要给显示器提供的输入之外,还要对显示器加位选择控制,这就是通常所说的段控和位控。因此多位LED显示器接口
12
基于单片机数字电压表设计
电路需要有两个输出口,其中一个用于输出8位为控信号;另一个用于输出段控信号。
开始程序 读取判断单元 32H 30H 31H 显示通道号 显示电压整数部分 显示电压小数部分 返回
图3.3显示子程序
4 系统调试与分析
4.1 调试内容及问题解决
程序可分为数据采集系统、数据转换系统、显示系统和按键控制系统,这四部分先测试,然后整体调试。
显示系统的调试:要显示的数据存放在30H、31H、32H单元中,先在30H、31H、32H分单元中存放0~10的数,运行显示程序,察看显示的结果是否与存放值一样。在测试的过程中发现小数点没有显示,通过指令ORL 30H,#80H,把小
13
基于单片机数字电压表设计
数点显示出来。
按键控制系统调试:拨动k2在34H单元内容看是否和拨动次数相同。 整体测试:把个部分用线连接,P3接拨码开关,P2接数码管,P3接位选。仿真器、仿真头连好,进入WAVE软件,设置仿真器。编译程序,看是否存在错误。
4.2 系统进一步改进方案
进一步提高测量精度,把精确到小数点后一位改为精确到小数点后两位。具体程序如下:
MOVX A,@DPTR ;读取转换后的数据. MOV B,#51 ;255÷51=5.00V运算 DIV AB
MOV 33H,A ; ;个位数放入33H
MOV A,B ; ;余数大于19H,F0为1,乘法溢出,结果加5 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 34H,A ; ;小数后第一位放入34H MOV A,B CLR F0 SUBB A,#1AH MOV F0,C MOV A,#10 MUL AB MOV B,#51 DIV AB
14
基于单片机数字电压表设计
JB F0,LOOP3 ADD A,#5H
LOOP3: MOV 35H,A ; ;小数后第二位放入35H
附录1:硬件原理图
附录2:程序清单
ORG OOOOH
LJMP MAIN ORG 0013H LJMP OVER
MAIN:JNB P3.0 XZ ;高电循环显示,低电平选择通道
MOV RO,#60H
MOV R1,#08H ;8个通道 CLR 34H
15
基于单片机数字电压表设计
XZ1 : MOV R2,#34H ;选择通道IN0
SETB EA SETB IT1 SETB EX1
MOV DPTR,@#08FFFH ;第0路地址 MOV A,R2
MOVX @DPTR,A ;启动A/D转换 SJMP $
XZ: JB P3.4,XZ
W1 : JNB P3.4 W1 ;拨码开关一个来回计数一次
CLR A INC A JNB P3.5
MOV 34H,A ;计数次数存入34H LJMP XZ1 ;跳到通道选择程序
OVER: CLR EX1
MOV DPTR,#08FFFH SUB DPTR,34H MOVX A,@DPTR MOV @R0,A INC R2
MOV 33H,#100 ;延时两秒 LJMP XIANSHI
JX: MOV A, R2
DJNZ R1 ,WAIT
WAIT: SETB EX1
MOVX @DPTR,A ED: RETI
;;;;;;;;把00000000到11111111的数转换成十进制数;;;;;; XIANSHI:MOV 33H,#0
MOV A,6OH
16
基于单片机数字电压表设计
MOV B,#51 DIV AB
MOV 30H,A ;把整数放入30H MOV A,B MOV B,#51 MUL A,#10
MOV B,#51 DIV AB
MOV 31H,A ;把小数放入31H MOV R6,#30H
;;;;;;;;;;;;动态显示程序;;;;;;;;; MOV DPTR #TAB MOV R7,#01H CLR A MOV P3,A L:MOV A,@R6 ANL A,#0FH MOVC A,@A+DPTR MOV P1,A MOV A,R7 MOV P3,A LCALL D20MS INC R6
CJNE R6,#32H,L0 MOV R6,#30H L0:RL A
MOV R7,A ;两秒后进行下一路 SJMP L DEC 33H JNB 33H,JX
TAB: DB 3FH,06H,5BH,4FH,66H ;0,1,2,3,4
17
基于单片机数字电压表设计
DB 6DH,7DH,07H,7FH,6FH ;5,6,7,8,9
D20MS:MOV R4,#100 ;20毫秒延时程序
L1:MOV R5,#10 L2:DJNZ R5,L2 DJNZ R4,L1 RET
18