课程设计数字电压表.docx
《课程设计数字电压表.docx》由会员分享,可在线阅读,更多相关《课程设计数字电压表.docx(20页珍藏版)》请在冰豆网上搜索。
![课程设计数字电压表.docx](https://file1.bdocx.com/fileroot1/2022-11/23/fcedbf6a-6cb8-49d8-ab02-fc0076effc3f/fcedbf6a-6cb8-49d8-ab02-fc0076effc3f1.gif)
课程设计数字电压表
题目数字电压表
任务与要求
利用单片机知识以及89s52为主控器,设计并调试一个数字电压表。
通过网上或图书馆的资料掌握相关知识。
课程设计要求是该设计能正常显示并精确到到百分位,通过本课程设计,学习研究开发软件的能力,并提交课程设计报告和实验成品
开始日期2011年4月20日完成日期2011年5月25日
目录
1设计方案1
2设计总体框图1
2.1硬件部分1
2.2软件部分2
2.2.1主程序设计2
2.2.2A/D转换子程序3
2.2.3数据处理子程序4
3设计单元电路5
3.1模数转换单元5
3.1.1ADC0808引脚说明5
3.1.2ADC0808通道选择6
3.1.3ADC0808的工作原理:
6
3.2数据处理及控制单元7
3.34位一体七段数码管8
4电路原理说明9
4.1模数转换9
4.2数据处理及控制10
5参考文献11
6结论及心得11
7附录12
7.1调试报告12
7.2元器件清单16
简易直流电压表的设计
1设计方案
本设计主要采用AT89C51芯片和ADC0808芯片来完成一个简易的数字电压表,能够对输入的0~5V的模拟直流电压进行测量,并通过一个4位一体的7段LED数码管进行显示,测量误差约为0.02V。
该电压表的测量电路主要由三个模块组成:
A/D转换模块、数据处理模块及显示控制模块。
A/D转换主要由芯片ADC0808来完成,它负责把采集到的模拟量转换为相应的数字量再传送到数据处理模块。
数据处理则由芯片AT89C51来完成,其负责把ADC0808传送来的数字量经一定的数据处理,产生相应的显示码送到显示模块进行显示;另外它还控制着ADC0808芯片的工作。
显示模块主要由7段数码管组成,显示测量到的电压值。
2设计总体框图
2.1硬件部分
本实验采用AT89C51单片机芯片配合ADC0808模/数转换芯片构成一个简易的数字电压表,原理电路如图1所示。
该电路通过ADC0808芯片采样输入口IN7输入的0~5V的模拟量电压,经过模/数转换后,产生相应的数字量经过其输出通道D0~D7传送给AT89C51芯片的P0口。
AT89C51负责把接收到的数字量经过数据处理,产生正确的7段数码管的显示段码,并通过其P1口传送给数码管。
同时它还通过其三位I/O口P3.0、P3.1、P3.2产生位选信号,控制数码管的亮灭。
另外,AT89C51还控制着ADC0808的工作。
其ALE管脚为ADC0808提供了1MHz工作的时钟脉冲;P2.3控制ADC0808的地址锁存端(ALE);P2.4控制ADC0808的启动端(START);P2.5控制ADC0808的输出允许端(OE);P3.7控制ADC0808的转换结束信号(EOC)。
系统框图如图2所示。
图1电路图原理
图2系统框图
2.2软件部分
2.2.1主程序设计
本设计采用C语言编程。
首先是初始化,主要是针对定时器T0,设置其工作方式,装入计数初值,允许中断等。
准备工作做好后便启动ADC0808对IN7脚输入进的0~5V电压模拟信号进行数据采集并转换成相对应的0~255十进制数字量。
在数据处理子程序中,运用标度变换知识,编写算法将0~255十进制数字量转换成0.00~5.00V的数据,输出到显示子程序进行显示。
整个主程序就是在A/D转换,数据处理及显示程序循环执行。
整个程序流程框图如图3所示。
图3主程序流程图
2.2.2A/D转换子程序
启动ADC0808对模拟量输入信号进行转换,通过判断EOC(P1.6引脚)来确定转换是否完成,若EOC为0,则继续等待;若EOC为1,则把OE置位,将转换完成的数据存储到AT89C51中。
程序流程图如图4所示。
图4数据处理子程序流程图
2.2.3数据处理子程序
数据处理子程序主要根据标度变换公式1-1,把0~255十进制数转换为0.00~5.00V。
,
:
模拟测量值;
:
模拟输入最小值;
:
模拟输入最大值;
:
模数转换后的值;
:
模数转换后的最小值;
:
模数转换后的最大值。
在本设计中,根据要求知,
,
,
,
,则上式可以简化为
。
3设计单元电路
3.1模数转换单元
此处采用ADC0808模块实现,它是典型的8位8通道逐次逼近式A/D转换器,主要由8路模拟开关、地址所存译码电路、逐次逼近寄存器SAR、树状模拟开关、256R电阻分压器、电压比较器及三态输出锁存器等组成。
3.1.1ADC0808引脚说明
ADC0808芯片为28引脚双列直插式封装,其引脚如图5所示,
图5ADC0808的引脚图
(1)IN0~IN7:
8路模拟量输入通道。
(2)A、B、C:
模拟通道地址线。
这3根地址线用于对8路模拟通道的选择,其译码关系如表1-1所示。
其中,A为低地址,C为高地址,引脚图中为ADDA,ADDB和ADDC。
(3)ALE:
地址锁存允许信号。
对应ALE上跳沿,A、B、C地址状态送入地址锁存器中。
(4)START:
转换启动信号。
START上升沿时,复位ADC0808;START下降沿时启动芯片,开始进行A/D转换;在A/D转换期间,START应保持低电平。
本信号有时简写为ST。
(5)D7~D0:
数据输出线。
为三态缓冲输出形式,可以和单片机的数据线直接相连。
D0为最低位,D7为最高。
(6)OE:
输出允许信号。
用于控制三态输出锁存器向单片机输出转换得到的数据。
OE=0,输出数据线呈高阻;OE=1,输出转换得到的数据。
(7)CLK:
时钟信号。
ADC0808的内部没有时钟电路,所需时钟信号由外界提供,因此有时钟信号引脚。
通常使用频率为500KHz的时钟信号。
(8)EOC:
转换结束信号。
EOC=0,正在进行转换;EOC=1,转换结束。
使用中该状态信号即可作为查询的状态标志,又可作为中断请求信号使用。
(9)Vcc:
+5V电源,GND:
地。
(10)Vref:
参考电压。
参考电压用来与输入的模拟信号进行比较,作为逐次逼近的基准。
其典型值为+5V(Vref(+)=+5V,Vref(-)=0V)。
3.1.2ADC0808通道选择
表1ADC0808通道选择表
C(ADDC)
C(ADDB)
C(ADDC)
选择的通道
0
0
0
IN0
0
0
1
IN1
0
1
0
IN2
0
1
1
IN3
1
0
0
IN4
1
0
1
IN5
1
1
0
IN6
1
1
1
IN7
多路模拟开关可选通8路模拟通道,允许8路模拟量分时输入,并共用一个A/D转换器进行转换。
地址锁存与译码电路完成对A、B、C三个地址位进行锁存与译码,如表1所示。
3.1.3ADC0808的工作原理:
首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。
此地址经译码选通8路模拟输入之一到比较器。
START上升沿将逐次逼近寄存器复位。
下降沿启动A/D转换,之后EOC输出信号变低,指示转换正在进行。
直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。
当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。
图6ADC0808信号的时序配合
3.2数据处理及控制单元
此处采用AT89C51,它所需要实现的功能,一是将模数转换后的数据经过处理并显示于4位一体的LED上,二是提供LED的位控信号,选择所应显示数据的一位8段数码管,三是提供高电平将ADC0808的锁存器打开,使得数字信号能够输出给单片机。
图7AT89C51的引脚
AT89C51的引脚说明如下:
(1)VCC:
电源电压;
(2)GND:
接地;
(3)P0口:
P0口是一组8位漏极开路双向I/O口,每位引脚可驱动8个TTL逻辑门路口
管脚写“1”时,被定义为高阻抗输入。
在访问外部数据存储器或程序存储器时,它可以被定
义为数据总线和地址总线的低八位。
在FLASH编程时,P0口作为原码输入口;当FLASH
进行校验时,P0输出原码,此时P0外部必须接上拉电阻。
(4)RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
(5)/PSEN:
外部程序存储器的选通信号
(6)XTAL1:
片内高增益反向放大器的输入及内部时钟工作电路的输入。
(7)XTAL2:
片内高增益反向放大器的输出端。
3.34位一体七段数码管
本实验的显示模块主要由一个4位一体的7段LED数码管构成,用于显示测量到的电压值。
它是一个共阴极的数码管,每一位数码管的原理图如图所示。
每一位数码管的a,b,c,d,e,f,g和dp端都各自连接在一起,用于接收AT89C51的P0口产生的显示段码。
1,2,3,4引脚端为其位选端,用于接收AT89C51的P1口产生的位选码。
图8为一位数码管的原理图。
图8一位数码管的原理图。
4电路原理说明
4.1模数转换
如图1电路原理图所示,三个地址位ADDA,ADDB,ADDC均接高电平+5V电压,因而所需测量的外部电压可由ADC0808的IN7端口输入。
由于ADC0808在进行A/D转换时需要有CLK信,本设计中利用AT89C51的定时中断产生一个100KHZ的脉冲,由P1.4口送给ADC0808的时钟端,通过软件给其输入一个正脉冲,可立即启动A/D转换。
在软件设计中,由于我们对单片机知识还没能很熟练的掌握,用中断方式较复杂,且这个程序CPU工作量不大,查询方式对速度不会产生影响,所以我们采用查询方式,确保仿真的进度和准确度。
在A/D转换开始之前,逐次逼近寄存器的SAR的内容为0,在A/D转换过程中,SAR存放“试探”数字量,在转换完毕后,它的内容即为A/D转换的结果数字量。
逻辑控制与定时电路在START正脉冲启动后工作,没来一个CLK脉冲,该电路就可能告知向SAR中传送一次试探值,对应输出U0与U1比较,确定一次逼近值,经过8次逼近,即可获得最后转换的结果数字量。
此处,EOC端口的信号显示ADC0808的状态,开始A/D转换时,EOC为低电平,转换结束后,输出高电平。
4.2数据处理及控制
A/D转换完毕后,单片机的P1.6口接收到一高电平,立马通过P1将OE置1,ADC0808的三态输出锁存器被打开,转换完的数字信号经过与D0~D7相连的P0口进入AT89C51。
AT89C51根据公式1-1将数字信号转换为模拟量,然后利用程序获取模拟量的每一位,分别通过P0口输出到LED上。
与此同时,AT89C51会通过P1.0~P1.3口选择用哪一段LED显示所传出的数据。
例如,当P1.0~P1.3=1110,则LED接收到的数据会在第四段LED上显示。
另外,AT89C51一旦获得了数据后便会将ST置0,即模数转换器停止转换,知道LED获得新的数据并显示出来,ST才会重新置1.由于AT89C51转换速率很快(微妙量级),所
以不会影响其接收新的数据。
最终显示如下图所示。
图9运行中的电路图
5参考文献
[1]胡乾坤,李广斌,李玲,喻红.单片微型计算机原理与应用.华中科技大学出版社,2005
[2]朱清慧,张凤瑞,翟天嵩,王志奎.Proteus教程.清华大学出版社,2008
[3]李广弟.单片机基础.北京航空航天大学出版社,1994
[4]谭运光.单片机开发手册.华龄出版社,1994
6结论及心得
我选择的是简易直流电压表,这个所用到的芯片都是我们比较熟悉的,89c52和0808模/数转换器。
总的来说,这次课设完成得还算顺利,因为老师给的题目都很经典,加之所要实现的功能也很简单,因而我们能够获得的资源就比较丰富。
在网上看了许多相关的电路和程序,也试过直接复制,但是由于程序不全而泡汤,于是决定自己设计电路和编写汇编程序。
在编写汇编程序时,循环显示部分是用以往课程设计时编写的程序的,直接复制到这个设计中来时,忘记了删除一个命令,导致最后一位在仿真的时候总是显示有问题,甚至显示不了。
后来经过仔细检查,终于发现了问题的所在并及时进行了修正。
在编写程序过程中还出现了一个比较有趣的问题,这也算是汇编程序的一个弊端,就是做乘除的时候,结果很容易超出八位,如果不加以处理的话,很容易导致显示不正常。
下面是一段用于中断处理显示数据的程序。
由于模数转换之后得到的是0~255的八位二进制数,所以要通过中断程序将之化为0~5.00的十进制小数。
从前面分析我们知道,只要将得到的二进制数除以51,便可以直接得到个位。
由于汇编不能处理小数,所以只能将所得的余数乘以10,再除以51,得到十分位,以此类推,可以继续得到百分位。
但是问题就出现在这里,以十分位的计算为例。
得到个位后,当余数超过25,比如是26时,乘以10的话得到260,就会溢出,而很难进行除法操作得到正确的十分位结果。
所以一开始我们就把乘数减小,变为5,这样的话即使余数是50(除数为51,50是最大的余数,余数保存在B),乘以5,得到的是250,也不会溢出,然后再除以51,这样可以得到十分位的一半,最后把结果乘以2,就能得到正确的十分位了。
于是我们就这样进行编程进行仿真,结果当测量电压十分位为偶数时,可以部分正常显示,当测量电压十分位为奇数时,则依然显示的是偶数。
这是显而易见的,因为最后我们是用商乘以2得到的结果,还是由于汇编只能进行整数除法的问题,导致结果只能是偶数。
最后通过思考,想出了几个方案,一是利用溢出标志位来决定结果是否进行加1操作,二就是下面程序所示的方法,对余数进行判断,当余数超过51的一半26时,则对余数进行减26操作,并对十分位进行加1操作。
这两种方法实际效果是一样的,不过下面这种方法可以得到更精确的百分位的结果。
INSER:
PUSHPSW;
PUSHACC;现场保护
PUSHDPH;
PUSHDPL;
SETBP3.1
CLREA
MOVA,P2;
MOVB,#33H;给B及时数55
DIVAB;
MOVR0,A;以上可得到个位
;;;;;;;;
MOVA,B
MOVB,#5;给B及时数5,与A相乘,避免得数超过八位
MULAB;
MOVB,#33H;
DIVAB;
MOVR4,B;
MOVB,#2H;再乘以2,以达到目的
MULAB;
MOVR1,A;
MOVA,R4;
CLRCY;
CJNEA,#26,LOOP1;判断余数,以确定A是否少加了1
SUBBA,#26;超过51的一半则减去26或者25,并使上一位加1
INCR1;
LOOP1:
JCLOOP2;
SUBBA,#25;等于26也进行加1操作
INCR1;
LOOP2:
MOVB,#2;余数乘以2,以达到实际的余数
MULAB;以上可得到十分位
;;;;;;;;
MOVB,#5H给B及时数5,与A相乘,避免得数超过八位
MULAB;
MOVB,#33H;给B及时数51
DIVAB;
MOVR4,B;
MOVB,#2;再乘以2,以达到目的
MULAB;
MOVR2,A;
MOVA,R4;
CLRCY;
CJNEA,#26,LOOP3;同上面的操作,以得到百分位
INCR2;
LOOP3:
JCLOOP4;
INCR2;以上得到百分位
LOOP4:
;;;;;;;;
POPDPL;恢复现场
POPDPH;
POPACC;
POPPSW;
RETI
7附录
7.1调试报告
由于此次设计的程序较简单,因而其在keil里运行的时候很顺利。
但是当将程序加入连接好的电路中并开始仿真时,就遇到了上述的问题。
通过思考解决了这些问题之后,仿真就完全没问题了。
在焊实际元件的过程中,第一次把电路焊好了,但是完全没有显示。
第二次重新焊了电路,终于实现了功能。
电压的调节是通过电位器来实现的,如果要测量其他电压,只需要把电位器的两端拆下来即可。
不过在过程中还是遇到了单片机的输出电流不足以驱动数码管的为题,导致显示的时候亮度不够,于是利用反相器来放大电流,就可以在白天也有比较好的亮度用于观察了。
实际电路图及工作状态图如下:
源程序如下:
ORG0000H
LJMPCLOCK
ORG0003H
LJMPINSER;跳转到外部中断0
ORG000BH
LJMPINSER1;
ORG0030H
CLOCK:
MOVDPTR,#TAB;把tab的首地址给dptr
MOVR0,#00H;赋初值
MOVR1,#00H;
MOVR2,#00H;
MOVTL0,#0FEH;
SETBET0;
MOVTH0,#0FFH
MOVTL0,#0E0H
SETBIT0
SETBTR0
SETBPX0
SETBEX0;打开中断0
SETBEA;打开中断开关
CONNECT:
MOVR7,#10
SETBP3.0
CLRP3.0
setbea
DISPLAY:
;循环显示程序段
CLRP1.1
MOVA,#0FH;给A赋值,用来和时进行逻辑运算,以达到分别显示时的十位和个位
ANLA,R0;逻辑与,把R0的值给A
MOVCA,@A+DPTR;查表得到电压个位的位选码
MOVP0,A;送出显示
CLRP0.7
LCALLDELAY
SETBP1.1
;;;;;;
CLRP1.2
MOVA,#0FH;
ANLA,R1;逻辑与,把R1的低四位给A
MOVCA,@A+DPTR;查表得到十分位的位选码
MOVP0,A;送出显示
LCALLDELAY
SETBP1.2
;;;;;;
CLRP1.3
MOVA,#0FH;
ANLA,R2;把R2低四位给A
MOVCA,@A+DPTR;查表得百分位的位选码
MOVP0,A;送出显示
SETBP0.7
LCALLDELAY
SETBP1.3
;;;;;;
DJNZR7,L3
CLRP3.1
SETBP3.0
LJMPCONNECT;
L3:
LJMPDISPLAY;
INSER:
PUSHPSW;
PUSHACC;现场保护
PUSHDPH;
PUSHDPL;
SETBP3.1
CLREA
MOVA,P2;
MOVB,#33H;
DIVAB;
MOVR0,A;
;;;;;;;;
MOVA,B
MOVB,#5;
MULAB;
MOVB,#33H;
DIVAB;
MOVR4,B;
MOVB,#2H;
MULAB;
MOVR1,A;
MOVA,R4;
CLRCY;
CJNEA,#26,LOOP1;
SUBBA,#26;
INCR1;
LOOP1:
JCLOOP2;
SUBBA,#25;
INCR1;
LOOP2:
MOVB,#2;
MULAB;
;;;;;;;;
MOVB,#5H
MULAB;
MOVB,#33H;
DIVAB;
MOVR4,B;
MOVB,#2;
MULAB;
MOVR2,A;
MOVA,R4;
CLRCY;
CJNEA,#26,LOOP3
INCR2;
LOOP3:
JCLOOP4;
INCR2;
LOOP4:
;;;;;;;;
POPDPL;恢复现场
POPDPH;
POPACC;
POPPSW;
RETI
DELAY:
MOVR5,#01H;延时500us子程序
L1:
MOVR6,#0FFH;
L2:
DJNZR6,L2;
DJNZR5,L1;
RET
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H
DB92H,82H,0F8H,80H,90H
INSER1:
CLREX0;
CPLP3.3;
MOVTH0,#0FFH;
MOVTL0,#0E0H;
SETBEX0;
RETI
END
7.2元器件清单
1.AT89C51芯片1块
2.ADC0808芯片1块
3.4位一体数码1个
4.6MHz晶振1个
5.33pF电容2个
6.10uF电解电容2个
7.10KΩ电位器1个
8.510Ω电阻8个
9.导线若干