单片机课设基于STC89LE516AD单片机的数字电压表设计.docx
《单片机课设基于STC89LE516AD单片机的数字电压表设计.docx》由会员分享,可在线阅读,更多相关《单片机课设基于STC89LE516AD单片机的数字电压表设计.docx(30页珍藏版)》请在冰豆网上搜索。
单片机课设基于STC89LE516AD单片机的数字电压表设计
摘要…………………………………………………………2
一、总体方案设计………………………………………3
二、系统硬件设计…………………………………………4
2.1控制器—单片机…………………………………………4
2.2电源电路…………………………………………………6
2.3显示电路…………………………………………………7
2.4键盘电路…………………………………………………8
2.5晶振电路…………………………………………………10
2.6复位电路…………………………………………………10
2.7报警电路…………………………………………………11
三、系统软件设计…………………………………………12
3.1主流序程图………………………………………………12
3.1显示电路流程图…………………………………………13
3.3报警电路流程图…………………………………………14
四、结论…………………………………………………14
五、参考文献………………………………………………15
附录…………………………………………………………16
摘要
在现代检测技术中,常需用高精度数字电压表进行现场检测,将检测到的数据送入微计算机系统,完成计算、存储、控制和显示等功能。
本文中数字电压表的控制系统采用单片机实现数字电压表的硬件电路与软件设计。
该数字电压表电路简单,还可以方便地行2路数据采集,远程测量结果传送等功能。
数字电压表是诸多数字化仪表的核心与基础,电压表的数字化是将连续的模拟量如直流电压转换成不连续的离散的数字形式并加以显示,这有别于传统的以指针加刻度盘进行读数的方法,避免了读数的视差和视觉疲劳。
采用单片机的数字电压表,它的精度高、抗干扰能力强。
可扩展性强、集成方便,还可与PC进行实时通信。
目前,有各种单片A/D转换器构成的数字电压表,以被广泛用于电子及电工测量、工业自动化仪表、自动测试系统等智能测量领域,本文采用内置AD转换器对输入模拟信号进行转换,STC89C51RC对转换的结果进行运算和处理,最后驱动输出装置显示数字电压信号。
关键词:
单片机;数字电压表;模拟信号;A/D转换
一、总体方案设计
本设计利用内置A/D转换的单片机STC89LE516AD、显示电路、按键电路、振荡电路以及报警电路等构成数字电压表。
其原理是晶振电路为单片机提供稳定的时钟周期。
采集电路将基准电压和被测电压分别输入到内置A/D转换器的基准电压端及被测电压输入端。
模数转换器将被测电压输入端采集的模拟信号转换为相应的数字信号,
由于单片机的软件编程,使单片机系统能够按照规定的时序采集这些数字信号,这些数字信号通过一定的算法计算得出被测电压相应的电压值,每三次取平均值,被测出的平均电压值以一定的时序在显示电路上显示。
当计算值达到报警电路程序设定值时,发出报警脉冲,使报警电路动作,发出报警。
复位电路的功能主要用于单片机的复位,向其输入大于两个机器周期的高电平,即可使单片机复位。
键盘电路用于查看
指定通道的显示的电压值。
晶振电路
复位电路
图1-1系统总体方案设计
该系统的先进性在于可以数字化显示电压。
该系统的数字电压表电路简单,所用的元件较少,成本低,调节工作可实现自动化。
数字电压表可以测量0~5V的2路输入电压值,并在LED数码管上轮流显示或单路选择显示。
本数字电压表的设计要求
1、对两路0—5V模拟电压进行循环采集,每路采集3次,取平均值,采集的数存入内存并显示。
2、测量范围为0-5V,小数点后保留两位,误差小于等于正负0.02.
3、显示中,其中最高位显示通道提示符A-B,低三位显示实际的电压。
4、键盘控制,可查看制定通道的电压值。
5、将在1.25V和2.5V作为两路输入的报警值,当结果超过报警值时,指示灯
闪烁和蜂鸣器发声,以示警告。
二、系统硬件设计
2.1控制器—单片机
STC89LE516AD系列单片机是新一代超强干扰、高速、低功耗的单片机,指令代码完全兼容传统8051单片机,12时钟机器周期和6时钟机器周期可以任意选择,内置A/D转换电路。
引脚图如下:
图2-1STC89LE516AD单片机引脚图
VCC:
电源
VSS:
接地
P0口:
P0口是一个8位漏极开路的双向I/O口。
作为输出口,需要接上拉电阻。
对P0端口写“1”时,引脚用作高阻抗输入。
当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用
P1口:
P1口:
P1口是一个具有内部上拉电阻的8位双向I/O口,同时也是模拟量
输入口,可以对8路模拟量进行模数转换。
P2口:
P2口是一个具有内部上拉电阻的8位双向I/O口。
在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX@DPTR)时,P2口送出高八位地址。
P3口:
P3口是一个具有内部上拉电阻的8位双向I/O口。
P3口亦作为特殊功能(第二功能)使用,如表2-1所示。
P3.0
RXD(串行输入)
P3.1
TXD(串行输出)
P3.2
INT0(外部中断0)
P3.3
INT0(外部中断0)
P3.4
T0(定时器0外部输入)
P3.5
T1(定时器1外部输入)
P3.6
WR(外部数据存储器写选通)
P3.7
RD(外部数据存储器读选通)
表2-1STC89LE516AD引脚号第二功能
RST:
复位输入,晶振工作时,RST脚持续2个机器周期高电平将使单片机复位
ALE/PROG:
地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。
PSEN:
外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。
EA/VPP:
访问外部程序存储器控制信号。
为使能从0000H到FFFFH的外部程序存储器读取指令,EA必须接GND。
为了执行内部程序指令,EA应该接VCC。
XTAL1:
振荡器反相放大器和内部时钟发生电路的输入端。
XTAL2:
振荡器反相放大器的输出端。
2.2电源电路
2.2电源电路
.
图2-2+5V电源
该电路通过整流桥整流,各级的电容滤波(滤去交流高频信号),再通过采用CW7805三端稳压片即可满足要求,该电源提供的电能可靠,可以满足实验要求。
图2-3+3V电源
该电路可以产生+3V电压,因为STC89LE516AD需要+3V电压做A/D基准。
该电路里利用LM117等组成电路如上,为单片机提供稳定直流的3V电源
由上图可知U=(1+R2/R1)*1.25,取R1=240欧姆,则R2=336欧姆,即将R2调至为336欧姆,输出为3V。
2.3显示电路
(1)驱动器件MC14543
MC14543是16引脚双列直插式,塑料封转得硬件译码芯片,各引脚的表示功能说明如下
A,B,C,D引脚:
数据输入引脚,BCD码,D为最高位。
a-g:
7位字段码输出端
PH:
驱动方式控制端
LD:
片内存储器控制端。
LD=1时,A-D端数据输入到片内锁存器;LD=0时,输入数据被锁存
BI:
消隐控制端。
当BI=1时,使PH端和a-g端的信号相位相同,不显示字符;当BI=0时,显示字符
图2-4MC14543
(2)本系统采用LED数码管动态显示,经过上拉电阻限流,用MC14543作为驱动器件,驱动四个LED数码管显示逐一数字,由于人眼产生的误差,实际看到的是四个数码管同时进行显示。
STC89LE516AD
图2-5显示电路
2.4键盘电路
由于采用两路进行采集,而且要进行查看指定通道的电压值。
所以采用两个按键进行查看其电压值。
一键一线,各键相互独立,每个键各连一条I/O口线,通过检测输入线的电平状态就可以判断那个键被按下。
图2-6键盘电路
2.5晶振电路
采用内部时钟方式使用现成的外部振荡器产生脉冲信号,晶体的频率越高,系统的时钟频率越高,单片机的运行速度越快。
时钟电路是单片机的心脏,它控制着单片机的工作节奏。
单片机允许的时钟频率是因型号而异的,其典型值为12MHZ。
STC89LE516AD内部有一个反相振荡放大器,XTAL1 和XTAL2分别是该反向振荡放大器的输入端和输出端。
该反向放大器可配置为片内振荡器,石晶振荡和陶瓷振荡均可采用。
本系统使用12MHZ的晶体,电容为30PF,晶体和电容安装的与单片机近似接近,减少寄生电容。
更好的保证振荡器的稳定工作。
晶振电路的两端分别接于单片机的XTAL1、XTAL2两个端口。
图2-7晶振电路
2.6复位电路
按键手动电平复位是通过RST端经电阻与电源VCC接通来实现的,当按键没有按下时,C3起到隔断直流电源的作用,使RST处于低电平状态。
当S3按下,将C3短路,使电路导通,RST端为高电平,当时间长到单片机的两个机器周期后,单片机就会复位。
复位后,只影响SFR中的内容,内部RAM中的数据不受影响。
外部复位有上电复位和按键电平复位。
由于单片机运行过程中,其本身的干扰或外界干扰会导致出错,此时我们可按复位键重新开始运行。
为了便于本设计运行调试,复位电路采用按键复位方式。
图2-8复位电路
2.7报警电路
利用三极管进行放大驱动LED或蜂鸣器进行工作,将在1.25V和2.5V作为两路输入的报警值,当结果超过报警值时,指示灯闪烁和蜂鸣器发声,以示警告。
在数字电路中,是以脉冲信号驱动蜂鸣器以产生声音,若要以C51产生声音,可利用程序产生频率,送到IO口,再从该点连接到蜂鸣器的驱动电路,即可驱动蜂鸣器,这里采用的是以PNP晶体管放大电路。
数字微处理电路输出高电位时,由IC内部流出的电流很小。
虽然我们可以利用高增益晶体管,在连接上拉电阻,以提供较大的驱动电流,以驱动蜂鸣器或其他负载。
而数字微处理电路输出低电位时,IC可吸入较大电路,连接PNP晶体管构成的简单放大电路,即可提供足够的驱动能力。
图2-9报警电路
(三)系统软件设计
3.1主流序程图
图3-1主程序流程图
对两路0—5V模拟电压进行循环采集,每路采集3次,取平均值,采集的数存入内存并显示。
对其扫描的过程进行了概括和分析。
3.2显示电路流程图
键盘控制,可查看制定通道的电压值。
显示中,其中最高位显示通道提示符A-B,低三位显示实际的电压。
显示电路流程图如下。
图3-2显示电路流程图
3.3报警电路流程图
将在1.25V和2.5V作为两路输入的报警值,当结果超过报警值时,指示灯。
数字微处理电路输出高电位时,由IC内部流出的电流很小。
虽然我们可以利用高增益晶体管,在连接上拉电阻,以提供较大的驱动电流,以驱动蜂鸣器或其他负载。
而数字微处理电路输出低电位时,IC可吸入较大电路,连接PNP晶体管构成的简单放大电路,即可提供足够的驱动能力。
图3-3报警电路流程图
(四)结论总结
1、课题总结
通过单片机课程设计,我对内置单片机STC89LE516AD各引脚及功能有了深刻的了解,我设计的是数字电压表,包含了STC89LE516A单片机,MC14543驱动LED数码管显示电路,电源电路,键盘电路,晶振电路,复位电路,报警电路,以及程序流程图,对各部分进行了详细的分析,在画图过程中尽量注意各部分搭配美观,电路的设计基本包含了课本上的大部分内容,因此,我对课本有了进一步掌握。
2、心得
这是我第一次进行课程设计,单片机课程设计使我受益匪浅,以前老师在课上教给我们的都是理论知识,从来没有动手连接过芯片,这次数字电压表的设计使我能够亲自体会到如何连接芯片,当然前提是对各器件引脚的功能进行仔细阅读以及与课上的理论知识相结合才能设计出正确的电路。
同时这次课程设计锻炼了我的实践能力,我查阅了课本及一些书籍,从中找到一些很有用的知识,应用到设计电路中。
刚开始设计的时候遇到一些困难,最后通过分析一一克服。
这次课程设计使我对课程设计有了清晰的了解,也为我以后的课程设计提供了很丰富的经验。
(五)参考文献
[1]杨居义.单片机课程设计指导[M].北京:
清华大学出版社,2009:
89~94.
[2]夏路易.单片机技术基础教程与实践[M].北京:
电子工业出版社.2008:
180—194.
[3]沙占友.新型数字电压表原理与应用[M].北京:
机械工业出版社,2006:
70—85.
[4]应明仁,壬化成.单片机原理及应用[M].广州:
华南理工大学出版,2005:
200-240
[5]张毅刚.单片微机原理及应用[M].西安:
西安电子科技大学出版社,1994:
155—160
[6]马忠梅.单片机的C语言应用程序设计[M].北京:
北京航空航天大学出版社,2003:
90—101.
[7]程宇红.基于EPROM的高精度数字电压表设计[J].自动化与仪器仪表,2001(5):
52—54.
[8]公茂法,黄鹤松,杨学蔚.MCS-51单片机原理与实践[M].北京:
北京航空航天大学出版社,2009:
170-175.
[9]苗红霞.单片机实现数字电压表的软硬件设计[J].河海大学常州分校学报,2002(3):
74—
79.
[10]宋凤娟,孙军,李国忠.基于89C51单片机的数字电压表的设计[J]制造业自动化,2007,29
(2):
89-90.
附录
源程序代码
A/D转换程序
//定义与ADC有关的特殊功能寄存器
sfrADC_CONTR=0xC5;
sfrADC_DATA=0xC6;
sfrADC_LOW2=0xBE;
sfrP1M0=0x91;
sfrP1M1=0x92;
sbitp20=P2^0;
voidSTC90CxxAD_delay(inttimer)//延时函数
{
while(timer--);
}
intAd_Change(charchannel)//AD转换
{
intAD_Result_Temp=0;
P1=0xff;//将P1口置高,为A/D转换作准备
ADC_CONTR=ADC_CONTR|0x80;//1000,0000打开A/D转换电源
P1M0=0x03;//0000,0011用于A/D转换的P1.x口,先设为开漏
P1M1=0x03;//0000,0011P1.0--P1.1先设为开漏。
断开内部上拉电阻
STC90CxxAD_delay(20);//20
ADC_CONTR=ADC_CONTR&0xE0;//1110,0000清ADC_FLAG,ADC_START位和低3位
ADC_CONTR=ADC_CONTR|(channel);//设置当前通道号
STC90CxxAD_delay
(1);//延时使输入电压达到定
ADC_DATA=0;//清A/D转换结果寄存器
ADC_LOW2=0;
ADC_CONTR=ADC_CONTR|0x08;//0000,1000ADCS=1,启动转换
do{;}
while((ADC_CONTR&0x10)==0);//0001,0000等待A/D转换结束
ADC_CONTR=ADC_CONTR&0xE7;//1110,0111清ADC_FLAG位,停止A/D转换
AD_Result_Temp=((AD_Result_Temp|ADC_DATA)<<2)|(ADC_LOW2&0x03);
//保存返回AD转换的结果
STC90CxxAD_delay
(1);//
returnAD_Result_Temp;
}
常数定义
;****************************************************************
TMELEQU0E0H;20ms,定时器0时间常数
TMEHEQU0B1H
TMEPHEADEQU36H
****************************************************************
工作内存定义
****************************************************************
BITSTDATA20H
TIMEISOKBITBITST.1
TEMPONEOKBITBITST.2
TEMPLDATA26H
TEMPHDATA27H
TEMPHCDATA28H
TEMPLCDATA29H
****************************************************************
引脚定义
****************************************************************
TEMPDINBITP3.7
****************************************************************
中断向量区
****************************************************************
ORG000H
LJMPSTART
ORG00BH
LJMPT0IT
****************************************************************
系统初始化
****************************************************************
ORG100H
START:
MOVSP,#60H
CLSMEM:
MOVR0,#20H
MOVR1,#60H
CLSMEM1:
MOV@R0,#00H
INCR0
DJNZR1,CLSMEM1
MOVTMOD,#00100001B
MOVTH0,#TIMEL
MOVTL0,#TIMEH
SJMPINIT
ERROR:
NOP
LJMPSTART
NOP
INIT:
NOP
SETBET0
SETBTR0
SETBEA
MOVPSW,#00H
CLRTEMPONEOK
LJMPMAIN
;****************************************************************
;定时器0中断服务程序
;****************************************************************
T0IT:
PUSHPSW
MOVPSW,#10H
MOVTH0,#TIMEH
MOVTL0,#TIMEL
INCR7
CJNER7,#32H,T0ITI
MOVR7,#00H
SETBTIMEISOK
TOIT1:
POPPSW
RETI
;****************************************************************
;主程序
;****************************************************************
MAIN:
LCALLDISP1
JNBTIME1SOK,MAIN
CLRTIME1SOK
JNBTEMPONEOK,MAIN2
LCALLREADTEMP1
LCALLCONVTEMP
LCALLDISPBCD
LCALLDISP1
MAIN2:
LCALLREADTEMP
SETBTEMPONEOK
LJMPMAIN
;****************************************************************
;****************************************************************
;子程序区
;****************************************************************
;RESETDS18B20
;****************************************************************
INITDS1820:
SETBTEMPDIN
NOP
NOP
CLRTEMPDIN
MOVR6,#0A0H
DJNZR6,$
MOVR6,#0A0H
DJNZR6,$
SETBTEMPDIN
MOVR6,#32H
DJNZR6,$
MOVR6,#3CH
LOOP1820:
MOVC,TEMPDIN
JCINITDS1820OUT
DJNZR6,LOOP1820
MOVR6,#064H
DJNZR6,$
SJMPINITDS1820
RET
;
INITDS1820OUT:
SETBTEMPDIN
RET
;;****************************************************************
;READTEMP
;****************************************************************
READTEMP:
LCALLINITEDS1820
MOVA,#0CCH
LCALLWRITEDS1820
MOVR6,#34H
DJNZR6,$
MOVA,#44H
LCALLWRITEDS1820
MOVR6,#34H
DJNZR6,$
RET
READTEMP1:
LCALLINITDS1820
MOVA,#0CCH
LCALLWRITEDS1820
MOVR6,#34H
DJNZR6,$
MOVA,#0BEH
LCALLWRITEDS1820
MOVR6,#34H
DJNZR6,$
MOVR5,#09H
MOVR0,#TEMPHEAD
MOVB,#00H
READTEMP2:
LCALLREADDS1820
MOV@R0,A
INCR0
READTEMP21:
LCALLCRC8CAL
DJNZR5,READTEMP2
MOVA,B
JNZREADTEMPOUT
MOVA,TEMPHEAD+0
MOVTEMPL,A
MOVA,TEMPHEAD+1
MOVTEMPH,A
READTEMPOUT:
RET
;****************************************************************
;处理电压BCD码子程序
;****************************************************************
CONVTEAMP:
MOVA,TEMPH
ANLA,#80H
JZTEMPC1
CLRC
MOVA,TEMPL