单片机课设:基于STC89LE516AD单片机的数字电压表设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
摘要 (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-1 STC89LE516AD单片机引脚图
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所示。
表2-1 STC89LE516AD引脚号第二功能
RST: 复位输入,晶振工作时,RST脚持续2个机器周期高电平将使单片机复位
ALE/PROG: 地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8 位地址的输出脉冲。
PSEN: 外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。
EA/VPP: 访问外部程序存储器控制信号。
为使能从0000H 到FFFFH的外部程序存储器读取指令,EA必须接GND。
为了执行内部程序指令,EA应该接VCC。
XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。
XTAL2:振荡器反相放大器的输出端。
2.2电源电路
2.2 电源电路
.
S
T
AC220V
50HZ
图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时,显示字符
MC14543
图2-4 MC14543
(2)本系统采用LED数码管动态显示,经过上拉电阻限流,用MC14543作为驱动器件,驱动四个LED数码管显示逐一数字,由于人眼产生的误差,实际看到的是四个数码管同时进行显示。
STC89LE516AD
STC89LE516AD
图2-5 显示电路
2.4 键盘电路
由于采用两路进行采集,而且要进行查看指定通道的电压值。
所以采用两个按键进行查看其电压值。
一键一线,各键相互独立,每个键各连一条I/O口线,通过检测
输入线的电平状态就可以判断那个键被按下。
+5V
STC89LE516AD
图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有关的特殊功能寄存器
sfr ADC_CONTR =0xC5;
sfr ADC_DATA =0xC6;
sfr ADC_LOW2 =0xBE;
sfr P1M0 =0x91;
sfr P1M1 =0x92;
sbit p20 =P2^0;
void STC90CxxAD_delay(int timer) //延时函数
{
while(timer--);
}
int Ad_Change(char channel) //AD转换
{
int AD_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); //
return AD_Result_Temp;
}
常数定义
;************************************************************* ***
TMEL EQU 0E0H ;20ms,定时器0时间常数TMEH EQU 0B1H
TMEPHEAD EQU 36H
************************************************************** **
工作内存定义
************************************************************** **
BITST DATA 20H
TIMEISOK BIT BITST.1
TEMPONEOK BIT BITST.2
TEMPL DATA 26H
TEMPH DATA 27H
TEMPHC DATA 28H
TEMPLC DATA 29H
************************************************************** **
引脚定义
************************************************************** **
TEMPDIN BIT P3.7
************************************************************** **
中断向量区
************************************************************** **
ORG 000H
LJMP START
ORG 00BH
LJMP T0IT
************************************************************** **
系统初始化
************************************************************** **
ORG 100H
START: MOV SP,#60H
CLSMEM: MOV R0,#20H
MOV R1,#60H
CLSMEM1: MOV @R0,#00H
INC R0
DJNZ R1,CLSMEM1
MOV TMOD,#00100001B
MOV TH0,#TIMEL
MOV TL0,#TIMEH
SJMP INIT
ERROR: NOP
LJMP START
NOP
INIT: NOP
SETB ET0
SETB TR0
SETB EA
MOV PSW,#00H
CLR TEMPONEOK
LJMP MAIN
;************************************************************* ***
; 定时器0中断服务程序
;************************************************************* ***
T0IT: PUSH PSW
MOV PSW,#10H
MOV TH0,#TIMEH
MOV TL0,#TIMEL
INC R7
CJNE R7,#32H,T0ITI
MOV R7,#00H
SETB TIMEISOK
TOIT1: POP PSW
RETI
;************************************************************* ***
; 主程序
;************************************************************* ***
MAIN: LCALL DISP1
JNB TIME1SOK,MAIN
CLR TIME1SOK
JNB TEMPONEOK,MAIN2
LCALL READTEMP1
LCALL CONVTEMP
LCALL DISPBCD
LCALL DISP1
MAIN2: LCALL READTEMP
SETB TEMPONEOK
LJMP MAIN
;************************************************************* ***
;************************************************************* ***
;子程序区
;************************************************************* ***
; RESET DS18B20
;************************************************************* ***
INITDS1820: SETB TEMPDIN
NOP
NOP
CLR TEMPDIN
MOV R6,#0A0H
DJNZ R6,$
MOV R6,#0A0H
DJNZ R6,$
SETB TEMPDIN
MOV R6,#32H
DJNZ R6,$
MOV R6,#3CH
LOOP1820: MOV C,TEMPDIN
JC INITDS1820OUT
DJNZ R6,LOOP1820
MOV R6,#064H
DJNZ R6,$
SJMP INITDS1820
RET
;
INITDS1820OUT: SETB TEMPDIN
RET
;;
************************************************************** **
; READ TEMP
;
************************************************************** **
READTEMP: LCALL INITEDS1820
MOV A,#0CCH
LCALL WRITEDS1820
MOV R6,#34H
DJNZ R6,$
MOV A,#44H
LCALL WRITEDS1820
MOV R6,#34H
DJNZ R6,$
RET
READTEMP1: LCALL INITDS1820 MOV A,#0CCH
LCALL WRITEDS1820
MOV R6,#34H
DJNZ R6,$
MOV A,#0BEH
LCALL WRITEDS1820
MOV R6,#34H
DJNZ R6,$
MOV R5,#09H
MOV R0,#TEMPHEAD
MOV B,#00H
READTEMP2: LCALL READDS1820 MOV @R0,A
READTEMP21: LCALL CRC8CAL
DJNZ R5,READTEMP2
MOV A,B
JNZ READTEMPOUT
MOV A,TEMPHEAD+0
MOV TEMPL,A
MOV A,TEMPHEAD+1
MOV TEMPH,A
READTEMPOUT: RET
;
************************************************************** **
; 处理电压BCD码子程序
;
************************************************************** **
CONVTEAMP: MOV A,TEMPH
ANL A,#80H
JZ TEMPC1
CLR C
MOV A,TEMPL
ADD A,#01H
MOV TEMPL,A
MOV A,TEMPH
CPL A
ADDC A,#00H
MOV TEMPH,A
MOV TEMPHC,#0BH
SJMP TEMPCH
TEMPC1: MOV TEMPHC,#0AH TEMPC11: MOV A,TEMPHC SWAP A
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH
MOV DPTR,#TEMPDOTTAB
MOVC A,@A+DPTR
MOV TEMPLC,A
MOV A,TEMPL
ANL A,#0F0H
SWAP A
MOV TEMPL,A
MOV A,TEMPH ANL A,#0FH SWAP A
ORL A,TEMPL LCALL HEX2BCD1 MOV TEMPL,A ANL A,#0F0H SWAP A
ORL A,TEMPHC MOV TEMPHC,A MOV A,TEMPL ANL A,#0FH SWAP A
ORL A,TEMPLC MOV TEMPLC,A MOV A,R7
JZ TEMPC12 ANL A,#0FH SWAP A
MOV R7,A
MOV A,TEMPHC ANL A,#0FH
MOV TEMPHC,A
TEMPC12: RET
;
************************************************************** **
; 小数部分码表
;
************************************************************** **
TEMPDOTTAB: DB 00H, 01H, 01H, 02H, 03H, 03H, 04H,04H,05H,06H DB 06H,07H,08H,09H,09H
;
************************************************************** **
; 显示区BCD码电压值刷新子程序
;
************************************************************** **
DISPBCD: MOV A,TEMPLC
ANL A,#0FH
MOV 70H,A
SWAP A
ANL A,#0FH
MOV 71H,A
MOV A,TEMPHC
ANL A,#0FH
MOV 72H,A
MOV A,TEMPHC
SWAP A
ANL A,#0FH
MOV 73H,A
MOV A,TEMPHC
ANL A,#0F0H
CJNZ A,#010H,DISPBCD0
SJMP DISPBCD2
DISPBCD0: MOV A,TEMPHC ANL A,#0FH
JNZ DISPBCD2 MOV A,TEMPHC SWAP A
ANL A,#0FH
MOV 73H,#0AH
DISPBCD2: RET
;
************************************************************** *
; 显示子程序
;
************************************************************** **
; 显示数据在70H—73H单元内,用4位LED共阴数码管显示,每个LED 数码管亮1s时间再逐位循环。
DISP1: MOV R1,#70H
MOV R5,#0FEH
PLAY: MOV P1,#0FFH
MOV A,R5
MOV P3,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
MOV A,R5
JB ACC.1,LOOP5
CLR P1.7
LOOP5: LCALL DLIMS
INC R1
MOV A,R5
JNB ACC.3,ENDOUT
RL A
MOV R5,A
AJMP PLAY
ENDOUT: MOV P1,#0FEH
MOV P3,#0FEH
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH
;共阳段码表“0” “1” “2” “3”“4” “5” “6” “7” “8” “9” “不亮”“—”
DL1MS: MOV R6,#14H
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
;
**************************************************************
; 单字节十六进制转BCD
;
************************************************************** **
HEX2BCD1: MOV B,#064H
DIV AB
MOV R7,A
MOV A,#0AH
XCH A,B
DIV AB
SWAP A
ORL A,B
RET
;
************************************************************** **
; Calculate CRC—8 Values. Uses The CCITT—8 Polynomial,Expressed As
; X^8+X^5+X^4+1
;
**************************************************************
CRC8CAL: PUSH ACC MOV R7,#08H
CRC8LOOP1: XRL A,B RRC A
MOV A,B
JNC CRC8LOOP2
XRL A,#18H
CRC8LOOP2: RRC A MOV B,A
POP ACC
RR A
PUSH ACC
DJNZ R7,CRC8LOOP1
POP ACC
RET
EN D
电路总原理图。