单片机数字电压表
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字电压表
姓名潘刚
所在学院电子信息工程学院
专业班级通信1105班
学号 11214048 指导教师付文秀
日期2013 年 12月 15日
一、实验目的:
通过利用单片机设计简易数字电压表,使学生学会使用A/D转换器进行电压信号采集,了解A/D芯片TLC0832转换性能及基本原理,掌握A/D转换器与单片机的接口电路及编程技术。思考如何利用单片机和A/D实现多路电压监测系统,各路电压值通过数码管轮流显示问题
二、实验内容和要求:
利用实验平台上的串行模/数转换芯片及4位数码管,设计完成一个数字电压表。要求:数字电压表可测量0~5V输入电压,电压值通过数码管显示。
三、方案设计:
使用ADC0832模拟/数字转换器芯片设计数字电压表电路。该设计方案以单片机AT89S52为主控芯片,以ADC0832模拟/数字转换器芯片为核心转换模拟/数字量的芯片,组成数字电压表电路。该电路能准确地测出所被测有效电压值、附加四位显示功能,可精确到有效电压值为0.01V。
四、设计流程图
4.1总体设计流程图
4.2
AD转换关系设计流程图
五、软硬件设计
5.1 硬件电路设
该设计的硬件电路由主控部分(单片机AT89S51)、采集模拟量部分(A/D转换一路ADC0832)、显示部分(四位八段数码管)、电源部分由电脑USB(5V)供电4个部分组成。各部分之间相互协作,构成一个统一的有机整体,实现数字电压表的功能。各部分的硬件电路设计如下。设计总电路图见附录一。
5.2单片机AT89S52外围电路设计
5.2.1复位电路设计
MCS-51的复位输入引脚RST为MCS-51提供了初始化的手段,可以使程序从指定处开始执行,在MCS-51的时钟电路工作后,只要RST引脚上出现超过两个机器周期以上的高电平时,即可产生复位的操作,只要RST保持高电平,则MCS-51循环复位,只有单RET由高电平变成低电平以后,MCS-51才从0000H地址开始执行程序,本系统采用按键复位方式的复位电路。
5.2.2外部晶振时钟电路设计
MCS-51的时钟可以由两种方式产生,一种是内部方式,利用芯片内部的振荡电路;另外一种为外部方式,本论文根据实际需要和简便,采用内部振荡方式,MCS-51内部有一个用于构成振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是此放大器的输入端和输出端,这个放大器与作为反馈元件的片外晶体或陶瓷谐振器一起构成了一个自激振荡器。
MCS-51虽然有内部振荡电路,但要形成时钟,必须外接元件,所以实际构成的振荡时钟电路,外接晶振以及电容C1和C2构成了并联谐振电路接在放大器的反馈回路中,对接电容的值虽然没有严格的要求,但电容的大小会影响振荡频率的高低,振荡器的稳定性,起振的快速性和温度的稳定性。晶振的频率可在1.2MHZ~12MHZ之间任选,电容C1和C2的典型值在20pf~100pf之间选择,由于本系统用到定时器,为了方便计算,采用了12MHZ的晶振,采用电容选择30pf。
AT89S52具有在系统可编程功能,可以很方便的改写单片机存储器内的程序不需要
把芯片中从工作环境中剥离,把AT89S ISP下载口接入电路,可使电路实现该功能。AT89S52需要接入一个普通12MHz晶振,为其提供稳定的时钟脉冲。该设计中有4个八段数码显示管LED,所以,在单片机AT89S52外围需要接入4个三极管来驱动数码显示管。单片机外围电路的设计图如图:
5.3:ADC0832部分电路图
5. 4显示设计
八段数码显示管有两种,一种是共阳数码管,其内部是由八个阳极相连接的发光二极管组成;另一种是共阴数码管,其内部是由八个阴极相连接的发光二极管组成。二者原理不同但功能相同。本设计的时间显示选用4个共阳八段数码管LED,其外形和内部结构如图4.3所示:
5.5 总体电路图
六、实验程序
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar code table[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,
}; //共阳数码管段码表没有小数点 0~9
uchar code table1[]=
{0x40,0x79,0x24,0x30,0x19,
0x12,0x02,0x78,0x00,0x10};//带小数点的编码 0~9
sbit ADCCLK=P1^0;//ADC0832时钟端
sbit DI=P1^1;//ADC0832数据输入
sbit DO=P1^1;//ADC0832数据输出
sbit ADCCS=P1^2;//ADC0832片选端
uchar dat=0;//AD值
uchar count=0;//定时器计数
uchar CH=0;//通道变量
uint num,ge,xiao1,xiao2,shi,shi1,ge1,xiao3,xiao4,dy;
/**********************************************************/ /*********************************************************** 初始化函数
***********************************************************/ void init()
{
TMOD=0x01;//定时器0工作方式1
TH0=0;//赋初值
TL0=0;
EA=1;//开总中断
TR0=1;//启动定时器0
ET0=1;//开定时器0中断
}
/********************************************************* 延时函数
**********************************************************/ void delay(uint x)
{
uint a,b;