楠单片机课程设计数字电压表Word格式.docx
《楠单片机课程设计数字电压表Word格式.docx》由会员分享,可在线阅读,更多相关《楠单片机课程设计数字电压表Word格式.docx(12页珍藏版)》请在冰豆网上搜索。
(2)共阴极LED数码管或LM1602液晶显示。
(3)用定时器中断方式定时刷新或按键控制读取方式显示,使用按键控制时要求使用外部中断方式。
(4)绘制实现本设计内容的硬件电路(原理图),系统的组成框图。
(5)给出ADC0808或ADC0809的功能说明与使用方法;
(6)编写本课程设计内容的软件设计(包含程序流程图和对程序注释)。
三、硬件设计原理
模数转换原理:
试验中,我们选用ADC0809作为模数转换的芯片,其为逐次逼近式AD转换式芯片,其工作时需要一个稳定的时钟输入,根据查找资料,得到ADC0809的时钟频率在10khz~1200khz,我们选择典型值640khz。
课题要求测量电压范围是0到5V,又ADC0809的要求:
Vref+<
=Vcc,Vref->
=GND,故我们取Vref+=+5V,Vref-=0V。
由于ADC0809有8个输入通道可供选择,我们选择IN6通道,直接使ADC0809的A接地,B、C接高电平可以了,在当ADC0809启动时ALE引脚电平正跳变时变可以锁存A、B、C上的地址信息。
ADC0809可以将从IN6得到的模拟数据转换为相应的二进制数,由于ADC0809输出为8位的二进制数,转换时将0到5V分为255等分,所以我们可以得到转换公式为x/255*5化简为:
x/51,x为得到的模拟数据量,也就是直接得到的电压量。
在AD转换完成后,ADC0809将在EOC引脚上产生一个8倍于自身时钟周期的正脉冲,以此来作为转换结束的标志。
然后当OE引脚上产生高电平时,ADC0809将允许转换完的二进制数据输出。
数据处理原理:
由ADC0809的转换原理可以知道我们从其得到数据还只是二进制数据,我们还需要进一步处理来的到x的十进制数,并且对其进行精度处理,也就是课题要求的的精确到小数点后两位,在这里我们用51单片机对数据进行处理。
我们处理数据的思路是:
首先将得到的二进制数直接除以十进制数51,然后取整为x的整数部分,然后就是将得到的余数乘以10,然后再除以51,再取整为x的十分位,最后将得到的余数除以5得到x的百分位。
硬件原理图:
系统框图:
四、主要器件介绍
1、AT89C51
AT89C51芯片模型
AT89C51芯片的各引脚功能为:
P0口:
8位,漏极开路的双向I/O口。
这组引脚共有8条,P0.0为最低位。
这8个引脚有两种不同的功能,分别适用于不同的情况。
P1口:
8位,准双向I/O口,具有内部上拉电阻。
这8个引脚和P0口的8个引脚类似,P1.7为最高位,P1.0为最低位,当P1口作为通用I/O口使用时,P1.0-P1.7的功能和P0口的第一功能相同,也用于传送用户的输入和输出数据。
P2口:
这组引脚的第一功能与上述两组引脚的第一功能相同即它可以作为通用I/O口使用,它的第一功能和P0口引脚的第二功能相配合,用于输出片外存储器的高8位地址,共同选中片外存储器单元,但并不是像P0口那样传送存储器的读/写数据。
P3口:
这组引脚的第一功能和其余三个端口的第一功能相同,第二功能为控制功能,每个引脚并不完全相同,如下表2所示:
ALE/PROG:
地址锁存允许信号,输出。
配合P0口的第二功能使用,在访问外部存储器时,89C51的CPU在P0.0-P0.7引脚线去传送随后而来的片外存储器读/写数据。
在不访问片外存储器时,89C51自动在ALE线上输出频率为1/6震荡器频率的脉冲序列。
该脉冲序列可以作为外部时钟源或定时脉冲使用。
/EA:
片外存储器访问允许信号,低电平有效。
可以控制89C51使用片内ROM或使用片外ROM,若/EA=1,则允许使用片内ROM,若/EA=0,则只使用片外ROM。
/PSEN:
片外ROM的选通信号低电平有效。
在访问片外ROM时,89C51自动在/PSEN线上产生一个负脉冲,作为片外ROM芯片的读选通信号。
RST:
复位线,可以使89C51处于复位(即初始化)工作状态。
通常89C51复位有自动上电复位和人工按键复位两种。
XTAL1和XTAL2:
片内震荡电路输入线,这两个端子用来外接石英晶体和微调电容,即用来连接89C51片内OSC(震荡器)的定时反馈回路。
2、ADC0808的功能说明与使用方法
ADC0808是一种典型的A/D转换器。
它是由8位A/D转换器,一个8路模拟量开关;
8位模拟量地址锁存译码器和一个三态数据输出锁存器组成;
+5V单电源供电,转化时间在100us左右;
内部没有时钟电路,故需外部提供时钟信号。
芯片模型如下图所示:
ADC0808芯片模型
功能说明:
(1)IN0~IN7:
8路模拟量输入端。
(2)D0~D7:
8位数字量输出端口。
(3)START:
A/D转换启动信号输入端。
(4)ALE:
地址锁存允许信号,高电平有效。
(5)EOC:
输出允许控制信号,高电平有效。
(6)OE:
输出允许控制信号,高电平有效。
(7)CLK:
时钟信号输入端。
(8)ADDA、ADDB、ADDC:
转换通道地址,控制8路模拟通道的切换。
ADDA、ADDB、ADDC分别与地址线或数据线相连,三位编码对应8个通道地址端口,ADDA、ADDB、ADDC=000~111分别对应IN0~IN7通道的地址端口。
使用方法:
ADC0808采用逐次比较的方法完成A/D转换,由单一的+5V电源供电。
片内带有锁存功能的8路选1的模拟开关,由ADDA、ADDB、ADDC的编码来决定所选的通道。
ADC0808完成一次转换需100μs左右,它具有输出TTL三态锁存缓冲器,可直接连接到AT89C51的数据总线上。
通过适当的外接电路,ADC0808可对0~5V的模拟信号进行转换。
五、部分电路介绍
1、晶振电路
本设计系统采用内部时钟方式,利用单片机内部的高增益反相放大器,外部电路简,只需要一个晶振和2个电容即可,如下图所示。
晶振电路
电路中的器件选择可以通过计算和实验确定,也可以参考一些典型电路。
参数,电路中,电容器C1和C2对震荡频率有微调作用,通常的取值范围是30±
10pF,在这个系统中选择了33pF;
石英晶振选择范围最高可选24MHz,它决定了单片机电路产生的时钟信号震荡频率,在本系统中选择的是12MHz,因而时钟信号的震荡频率为12MHz。
2、复位电路
单片机在启动运行时都需要复位,使CPU和系统中的其他部件都处于一个确定的初始状态,并从这个状态开始工作。
MCS-51单片机有一个复位引脚RST,采用施密特触发输入。
当震荡器起振后,只要该引脚上出现2个机器周期以上的高电平即可确保时器件复位。
复位完成后,如果RST端继续保持高电平,MCS-51就一直处于复位状态,只要RST恢复低电平后,单片机才能进入其他工作状态。
复位电路
3、模拟输入电路
通过可变电阻一端接电源+5v,一端接地GND,通过改变电阻的阻值,从而改变所测电压值,实现电压的模拟信号输入。
模拟输入电路
六、软件设计
程序流程图:
主程序流程图
A/D转换流程图
源程序:
/*************************************
*程序功能:
实现数模转换,并将结果在*
*数码管上显示出来。
*/
#include<
reg51.h>
#include<
absacc.h>
#defineLED_DataP2
#defineA10
#defineU11
sbitLED1=P3^0;
sbitLED2=P3^1;
sbitLED3=P3^2;
sbitLED4=P3^3;
sbitdp=P3^5;
#defineLED_slectP3
#defineucharunsignedchar
#defineuintunsignedint
staticuchardispdata[4];
unsignedcharcodenum[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x3e
};
//数字编码
//AD0809
#defineXBYTE((unsignedcharvolatilexdata*)0)
#defineadinXBYTE[0x7ff9]//0809的外部地址
voiddelayus(uintus)
{
while(us--);
}
ucharad_action(ucharch)//0~255代表0~5V,所以V=out*5.0/255
ucharread_data;
adin=ch;
//ch:
通道号
delayus(6);
read_data=adin;
//?
?
returnread_data;
//0809的输出,数字量
/*
LCALLad_action(C:
0463)
MOVDPTR,#0x7FFF
MOVA,R7
MOVX@DPTR,A
MOVR7,#0x06
MOVR6,#0x00
LCALLdelayus(C:
02D3)
MOVXA,@DPTR
MOVR7,A
RET
*/
}
//数码管显示控制
voiddecodenum(floatadv,ucharch)//ch:
AD通道号
uinttemp;
temp=(uint)(adv*1000);
//若显示3位:
temp=(uint)(adv*100)
dispdata[0]=temp/1000;
dispdata[1]=temp/100%10;
dispdata[2]=temp/10%10;
dispdata[3]=temp%10;
dispdata[3]=ch;
//可在最后1位显示通道号
voidselect(ucharLED)
switch(LED)
{
case0:
LED1=0;
break;
case1:
LED2=0;
case2:
LED3=0;
case3:
LED4=0;
default:
LED_slect=0xff;
}
voiddispone(ucharLED,bitifpoint,ucharnumber)//,number0--9
{
select(LED);
if(ifpoint)
dp=1;
else
dp=0;
LED_Data=num[number]|0x80;
delayus(200);
voiddisp()
uchari;
bitpoint;
for(i=0;
i<
4;
i++)
if(i==0)
point=1;
point=0;
dispone(i,point,dispdata[i]);
#defineaddo(5.0/255.0)
#definezero0.005//用于校准AD的误差
voidmain()
uintcnt=0;
//ad_action(0);
while
(1)
switch(cnt++)
decodenum(ad_action(0)*addo+zero,0);
/*case0:
case70:
decodenum(ad_action
(1)*addo+zero,1);
case140:
decodenum(ad_action
(2)*addo+zero,2);
case210:
decodenum(ad_action(3)*addo+zero,3);
case280:
decodenum(ad_action(4)*addo+zero,4);
case350:
decodenum(ad_action(5)*addo+zero,5);
case420:
decodenum(ad_action(6)*addo+zero,6);
case490:
decodenum(ad_action(7)*addo+zero,7);
case560:
cnt=0;
disp();
七、总结与体会
经过一周的努力终于设计成功,LED的显示结果和直接用数字电压表测试模拟量输入所得结果几乎一致,误差完全在合理的范围之内。
由于仪器误差,LED显示最大值只能是5.005V,离标准最大值5.0V已经不远,达到预期目的,设计成功。
本设计参考了教材上第十一章89C51与ADC0809转换的接口连线,设计出电路图的连线,从并中理解了许多基本的知识和接线方法,在程序的设计与电压表调试的过程中中遇到了很多的问题,刚开始时四个数码管根本不显示,后来发现用的是共阳极的数码管,而设计是共阴极的,更换后数码管终于显示,但问题又出现了,单路显示和循环显示的开关不能控制电路的单路显示和循环显示,经过仔细地检查电路和修改程序,采用中断的方法,产生一次外部中断0,程序转移到单路显示,按一次单路显示开关,地址加一,转换的模拟通道相应的加一,如果按下循环按键就返回循环显示的程序,功夫不负有心人,最后终于调试成功。
在此再次向带领我们这次课程设计的老师说声:
谢谢!
八、参考文献
1.胡健.单片机原理及接口技术.北京:
机械工业出版社,2004年10月
2.魏立峰.单片机原理及应用技术.北京大学出版社,2005年
3.何立民.单片机中级教程-原理与应用.北京航空航天大学出版社
4.苗红霞.单片机实现数字电压表的软硬件设计[J].河海大学常州分校学报,2002,(03)
5.陈明荧.8051单片机课程设计实训教材[M].清华大学出版社
6.宋凤娟,孙军,李国忠.基于89C51单片机的数字电压表设计[J].工业控制计算机,2007,(04)