基于STC12C5A60S2单片机数字电压表的设计.docx
《基于STC12C5A60S2单片机数字电压表的设计.docx》由会员分享,可在线阅读,更多相关《基于STC12C5A60S2单片机数字电压表的设计.docx(25页珍藏版)》请在冰豆网上搜索。
基于STC12C5A60S2单片机数字电压表的设计
基于STC12C5A60S2单片机数字电压表的设计
专业班级:
电子信息工程二班
学号:
xxx
姓名:
xxx
指导教师:
xxx
基于STC12C5A60S2单片机数字电压表的设计
实训目的:
1、对安全用电知识的基本了解
1)了解一般情况下对人体的安全电流和电压,了解触电事故的发生原因及安全用电的原则。
2)掌握用电安全操作技术。
3)培养严谨的科学作风和良好的工作作风。
2、常用工具的基本使用
1)了解常用电工电子工具的用途、规格;
2)掌握常用电工电子工具的使用方法和注意事项。
3、数字电压表的组装
1)了解电路的原理,掌握数字电压表的作用。
2)注意安全,先接线,在通电。
4、一般室内电气线路的安装
1)了解室内电路的原理,掌握各个元件的作用。
2)注意电器间的连接,注意安全。
3)增强动手、合作能力。
5、常用电子仪器的使用
1)了解直流稳压电源、万用表、信号发生器、示波器等常用电子仪器的功能。
2)掌握直流稳压电源、万用表、信号发生器、示波器的基本操作方法,为后续实习打下基础。
6、常用电子元器件的认识和检测
1)通过实物认识各种常用的电子元器件。
2)掌握常用电子元器件参数的识读方法。
3)掌握使用万用表测量常用电子元器件参数的方法。
4)通过简单的实验,了解常用电子元器件的功能。
7、常用工具的使用
(二)
1)了解常用电工电子工具的用途、规格;
2)掌握常用电工电子工具的使用方法和注意事项。
8、焊接工艺焊接训练
1)掌握焊接工艺的方法,了解焊接工具的原理。
2)安全用电和注意事项
9、电子整机产品装配(数字电压表的制作)
1)掌握数字电压表的电路原理、元件的作用。
2)学会检测各个元件的好坏、
3)独立动手能力
10、印制电路板(PCB)的制作
1)了解印制电路板的功能和种类。
2)了解PCB板的快速制作方法。
3)简单了解专业电路板厂PCB板制作的流程和工艺。
11、电路组装及调试
1)了解热转印法制作PCB板的工艺流程;
2)掌握使用热转印法来制作PCB板的技能。
实训时间、地点:
第十七周,第十八周
工程训练中心
实训内容:
第1章引言
在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常。
而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。
数字电压表简称DVM,它是采用数字化测量技术,把连续的模拟量转换成不连续、离散的数字形式并加以显示的仪表。
由于数字式仪器具有读数准确方便、精度高、误差小、测量速度快等特而得到广泛应用。
传统的指针式刻度电压表功能单一,精度低,容易引起视差和视觉疲劳,因而不能满足数字化时代的需要。
采用单片机的数字电压表,将连续的模拟量如直流电压转换成不连续的离散的数字形式并加以显示,从而精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC实时通信。
数字电压表是诸多数字化仪表的核心与基础。
以数字电压表为核心,可以扩展成各种通用数字仪表、专用数字仪表及各种非电量的数字化仪表。
目前,由各种单片机和A/D转换器构成的数字电压表作全面深入的了解是很有必要的。
目前,数字电压表的内部核心部件是A/D转换器,转换的精度很大程度上影响着数字电压表的准确度,因而,以后数字电压表的发展就着眼在高精度和低成本这两个方面。
本文是以简易数字直流电压表的设计为研究内容,本系统主要包括三大模块:
转换模块、数据处理模块及显示模块。
第2章系统总体方案设计选择与说明
2.1设计要求
1、增强型MCS-51系列单片机STC12C5A60S2为核心器件,组成一个简单的直流数字电压表。
2、采用1路模拟量输入,能够测量0-10V之间的直流电压值。
3、电压显示采用数码管显示。
4、尽量使用较少的元器件。
2.2设计思路
1、根据设计要求,选择STC12C5A60S2单片机为核心控制器件。
2、A/D转换采用STC12C5A60S2内部自带A/D实现。
3、电压显示采用共阳数码管。
2.3设计方案
硬件电路设计由7个部分组成:
STC12C5A60S2单片机系统,数码管显示系统、时钟电路、复位电路档位调节电路以及测量电压输入电路。
硬件电路设计框图如图1所示。
图2.1数字电压表系统硬件设计框图
第3章硬件电路设计
3.1STC12C5A60S2单片机
3.1.1STC12C5A60S2单片机
图3.1.1STC12C5A60S2单片机引脚图及实物图
3.1.2STC12C5A60S2系列单片机主要性能
1)高速:
1个时钟/机器周期,增强型8051内核,速度比普通8051快6~12倍。
2)宽电压:
5.5~3.3V,2.2~3.6V(STC12LE5A60S2系列)。
3)增加第二复位功能脚/P4.6(高可靠复位,可调整复位门槛电压,频率<12MHz时,无需此功能)。
4)增加外部掉电检测电路/P4.6,可在掉电时,及时将数据保存进EEPROM,正常工作时无需操作EEPROM。
5)低功耗设计:
空闲模式(可由任意一个中断唤醒)。
6)低功耗设计:
掉电模式(可由外部中断唤醒),可支持下降沿/上升沿和远程唤醒。
7)支持掉电唤醒的管脚:
INT0/P3.2,INT1/P3.3,T0/P3.4,T1/P3.5,RxD/P3.0,
CCP0/P1.3(或P4.2),CCP1/P1.4(或P4.3),EX_LVD/P4.6。
8)工作频率:
0~35MHz,相当于普通8051:
0~420MHz。
9)时钟:
外部晶体或内部RC振荡器可选,在ISP下载编程用户程序时设置。
10)8/16/20/32/40/48/52/56/60/62K字节片内Flash程序存储器,擦写次数10万次以上。
11)1280字节片内RAM数据存储器。
12)芯片内EEPROM功能,擦写次数10万次以上。
13)ISP/IAP,在系统可编程/在应用可编程,无需编程器/仿真器。
14)8通道,10位高速ADC,速度可达25万次/秒,2路PWM还可当2路D/A使用。
15)2通道捕获/比较单元(PWM/PCA/CCP),也可用来再实现2个定时器或2个外部中断(支持上升沿/下降沿中断)。
16)4个16位定时器,兼容普通8051的定时器T0/T1,2路PCA实现2个定时器。
17)可编程时钟输出功能,T0在P3.4输出时钟,T1在P3.5输出时钟,BRT在P1.0输出时钟。
18)硬件看门狗(WDT)。
19)高速SPI串行通信端口。
20)全双工异步串行口(UART),兼容普通8051的串口。
21)通用I/O口(36/40/44个),复位后为:
准双向口/弱上拉(普通8051传统I/O口)。
可设置成四种模式:
准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏。
每个I/O口驱动能力均可达到20mA,但整个芯片最大不得超过120mA。
3.1.3STC12C5A60S2系列单片机的A/D转换器的结构
STC12C5A60S2系列单片机的A/D转换口在P1口(P1.7-P1.0),有8路10位高速A/D转换器,速度可达到250KHz(25万次/秒)。
8路电压输入型A/D,可做温度检测、电源电压检测、按键扫描、频谱检测等。
上电复位后P1口为弱上拉型I/O口,用户可以通过软件设置将8路中的任何一路设置为A/D转换,不需作为A/D使用的I/O口可以继续作为I/O口使用。
STC12C5A60S2系列单片机ADC的结构如下图所示
图3.1.2STC12C5A60S2系列单片机ADC的结构
图3.1.3当AUXR.1/ADRJ=0时,A/D转换结果寄存器格式
图3.1.4当AUXR.1/ADRJ=1时,A/D转换结果寄存器格式
STC12C5A60S2系列单片机ADC由多路选择开关、比较器、逐次比较寄存器、10位ADC转换寄结果存器(ADC_RES和ADC_RESL)以及ADC_CONTR构成。
STC12C5A60S2系列单片机的ADC是逐次比较型ADC,逐次比较型ADC由一个比较D/A转换器构成,通过逐次比较逻辑,从最高位(MSB)开始,顺序地对每一输入电压与内置D/A转换器输出比较,经过多次比较,使转换所得的数字量逐次比逼近输入模拟量对应值。
逐次比较型A/D转换器具有速度高,功耗低等特点。
从上图可以看出,通过模拟多路开关,将通过ADC0-ADC7的模拟量输入送给比较器。
用数/模转换器(DAC)转换的模拟量与本次输入的模拟量通过比较器进行比较,将比较结果保存到逐次比较器,并通过逐次比较寄存器输出转换结果。
A/D转换结束后,最终的转换结果保存到ADC转换结果寄存器ADC_RES和ADC_RESL,同时,置位ADC控制寄存器ADC_CONTR中的A/D转换结束标志位ADC_FLAG,以供程序查询或发出中断申请。
模拟通道的选择控制由ADC控制寄存器ADC_CONTR中的CHS2~CHS0确定。
ADC的转换速度由ADC控制寄存器中的SPEED1和SPEED0确定。
在使用ADC之前,应先给ADC上电,也就是置位ADC控制寄存器中的ADC_POWER位。
当ADRJ=0时,如果取10位结果,则按下面公式计算:
10-bitA/DConversionResult:
(ADC_RES[7:
0],ADC_RESL[1:
0])=1023*Vin/Vcc
当ADRJ=0时,如果取8位结果,则按下面公式计算:
8-bitA/DConversionResult:
(ADC_RES[7:
0])=255*Vin/Vcc
当ADRJ=1时,如果取10位结果,则按下面公式计算:
10-bitA/DConversionResult:
(ADC_RESL[1:
0],ADC_RES[7:
0])=1023*Vin/Vcc
当ADRJ=1时,如果取8位结果,则按下面公式计算:
8-bitA/DConversionResult:
(ADC_RESL[1:
0],ADC_RES[7:
2])=255*Vin/Vcc
式中,Vin为模拟输入电压,Vcc为单片机实际工作电压,用单片机工作电压作为模拟参考电压。
3.1.4与A/D转换相关的寄存器及说明
与STC12C5A60S2系列单片机A/D转换相关的寄存器
表3.1.1A/D转换相关的寄存器
1.P1口模拟功能控制寄存器P1ASF
STC12C5A60S2系列单片机的A/D转换通道与P1(P1.7-P1.0)复用,上电复位后P1为弱上拉型I/O口,用户可以通过将8路中的如何一路设置为A/D转换,不需作为A/D使用的P1口可继续作为I/O口使用(建议只作为输入)。
需作为A/D使用的口需要先将P1ASF特殊功能寄存器中的相应位置为“1”,将相应的口设置为模拟功能。
P1ASF寄存器的格式如下:
P1ASF:
P1口模拟功能控制寄存器(只读)
表3.1.2P1ASF寄存器
当P1口中的相应位作为A/D使用时,要将P1ASF中的相应位置“1”
表3.1.3P1ASF寄存器设置
2.ADC控制寄存器ADC_CONTR
ADC_CONTR寄存器的格式如下:
ADC_CONRTR:
ADC控制寄存器
表3.1.4ADC控制寄存器
对ADC_CONTR寄存器进行操作,建议直接用MOV赋值语句,不要用“与”和“或”语句。
ADC_POWER:
ADC电源控制位。
0:
关闭A/D转换电源;
1:
打开A/D转换电源;
建议进入控模式前,将ADC电源关闭,即ADC_POWER=0.启动A/D转换前一定要确认A/D电源已打开,A/D转换结束后关闭A/D电源可决定功耗,也可以不关闭。
初次打开内部A/D转换模拟电源,需适当延时,等内部模拟电源稳定后,再启动A/D转换。
建议启动A/D转换后,在A/D转换结束之前,不要改变任何I/O口的状态,有利于高精度A/D转换,若能将定时器/串行口/中断系统关闭更好。
SPEED1,SPEED0:
模数转换速度控制位
表3.1.5模数转换速度控制位设置
STC12C5A60S2系列单片机的A/D转换模块所使用的时钟时内部(或外部石英晶体)所产生的系统时钟,不使用时钟分频寄存器CLK_DIV对系统分频后所产生的供给CPU工作的时钟。
(好处:
这样可以让ADC用较高频率工作,提高A/D的转换速度。
让CPU工作工作在较低频率,降低系统功耗)。
ADC_FLAG:
模数转换结束标志位,当A/D转换完成后,ADC_FLAG=1,要由软件清零。
不管是A/D转换完成后由该位申请中断,还是由软件查询该标志A/D转换是否结束,当A/D转换完成后,ADC_FLAG=1,一定要软件清零。
ADC_START:
模数转换器(ADC)转换启动控制位,设置为“1”时,开始转换,转换结束后ADC_START=1;
CHS2/CHS1/CHS0:
模拟输入通道选择
表3.1.6模拟输入通道选择
设置ADC_CONTR控制寄存器后,要加4个空操作延时后才能正确度到ADC_CONTR寄存器的值。
原因是设置ADC_CONTR控制寄存器的语句执行后,要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR控制寄存器。
MOVADC_CONTR,#DATA
NOP
NOP
NOP
NOP
MOVA,ADC_CONRT
3、A/D转换结果寄存器ADC_RES、ADC_RESL
特殊功能寄存器ADC_RES和ADC_RESL寄存器用于存放A/D转换结果,其格式如下:
表3.1.7用于存放A/D转换结果寄存器ADC_RES、ADC_RESL
AUXR1寄存器的ADRJ位是A/D转换结果寄存器的数据格式调整控制位。
表3.1.8当ADRJ=0时,10位A/D转换结果的高8位存放在ADC_RES中,低2位存放在ADC_RESL的低2位中。
表3.1.9当ADRJ=1时,10位A/D转换结果的高2位存放在ADC_RES的低2位中,低8位存放在ADC_RESL中。
4、与A/D中断有关的寄存器
IE:
中断允许寄存器
表3.1.10中断允许寄存器
EA:
CPU的中断开放标志,EA=1,CPU开放中断,EA=0,CPU屏蔽所有的中断请求。
EADC:
A/D转换中断允许位。
EADC=1,允许A/D中断;
EADC=0,屏蔽A/D中断。
IPH:
中断优先级控制寄存器高(不可位寻址)
表3.1.11中断优先级控制寄存器高
IP:
中断优先级控制寄存器低(可以位寻址)
表3.1.12中断优先级控制寄存器低
PADCH,PADC:
ADC转换优先级控制位。
5、ADC初始化程序
/*----------------------------
初始化ADC
----------------------------*/
voidInitADC(void)
{
P1ASF=0x58;//设置P1口为AD口0100011101011000
ADC_RES=0;//清除结果寄存器
ADC_CONTR=ADC_POWER|ADC_SPEEDLL;
Delay(50);//ADC上电并延时
}
6、ADC读子函数
/*----------------------------
发送ADC结果到PC
----------------------------*/
voidShowResult(BYTEch)
{
floatvalue;
change_long_data_to_array(disadch,2,ch);
value=GetADCResult(ch);
value=value/255*4.8;
change_data_to_array(disadcval,5,1,value);
}
/*----------------------------
读取ADC结果
----------------------------*/
BYTEGetADCResult(BYTEch)
{
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;
_nop_();//等待4个NOP
_nop_();
_nop_();
_nop_();
_nop_();//等待4个NOP
_nop_();
_nop_();
_nop_();
_nop_();//等待4个NOP
_nop_();
_nop_();
_nop_();
while(!
(ADC_CONTR&ADC_FLAG));//等待ADC转换完成
ADC_CONTR&=~ADC_FLAG;//CloseADC
returnADC_RES;//返回ADC结果
}
3.2共阳数码管
3.2.1数码管简介
数码管的一种是半导体发光器件,数码管可分为七段数码管和八段数码管,区别在于八段数码管比七段数码管多一个用于显示小数点的发光二极管单元DP(decimalpoint),其基本单元是发光二极管。
数码管是一类价格便宜使用简单,通过对其不同的管脚输入相对的电流,使其发亮,从而显示出数字能够显示时间、日期、温度等所有可用数字表示的参数的器件。
在电器特别是家电领域应用极为广泛,如显示屏、空调、热水器、冰箱等等。
绝大多数热水器用的都是数码管,其他家电也用液晶屏与荧光屏。
数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是哪个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
3.2.2主要技术参数:
七段数码管引脚图
图3.3.1七段数码管引脚图
这类数码管可以分为共阳极与共阴极两种,共阳极就是把所有LED的阳极连接到共同接点com,而每个LED的阴极分别为a、b、c、d、e、f、g及dp(小数点);共阴极则是把所有LED的阴极连接到共同接点com,而每个LED的阳极分别为a、b、c、d、e、f、g
及dp(小数点),如下图所示。
图中的8个LED分别与上面那个图中的A~DP各段相对应,通过控制各个LED的亮灭来显示数字。
图3.3.2共阳和共阴数码管
本实验使用的是四位数码管,内部的4个数码管共用a~dp这8根数据线,为人们的使用提供了方便,因为里面有4个数码管,所以它有4个公共端,加上a~dp,共有12个引脚,下面便是一个共阴的四位数码管的内部结构图(共阳的与之相反)。
引脚排列依然是从左下角的那个脚(1脚)开始,以逆时针方向依次为1~12脚,下图中的数字与之一一对应。
图3.3.3四位数码管引脚
数码管使用条件:
a、段及小数点上加限流电阻
b、使用电压:
段:
根据发光颜色决定;小数点:
根据发光颜色决定
c、使用电流:
静态:
总电流80mA(每段10mA);动态:
平均电流4-5mA
峰值电流100mA
上面这个只是七段数码管引脚图,其中共阳极数码管引脚图和共阴极的是一样
的。
4位数码管引脚图数码管使用注意事项说明:
(1)数码管表面不要用手触摸,不要用手去弄引角;
(2)焊接温度:
260度;焊接时间:
5s
(3)表面有保护膜的产品,可以在使用前撕下来。
3.3系统电路设计、说明
3.3.1系统电路原理图
图3.4.1电路原理图
3.3.2系统电路PCB
图3.4.2电路PCB图
第4章系统软件设计
4.1系统软件设计
4.1程序设计框图
图4.1.1程序设计框图
附录
源程序
/********************************************************
函数原型:
main()
函数功能:
主函数
说明:
STC12C5A系列单片机
*********************************************************//*
#include//包含51单片机寄存器定义的头文件
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharvalue,bai,shi,ge;
uintvalue0;
ucharcodeTab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f};
voiddelay(void)
{
unsignedchari;
for(i=0;i<200;i++);
}
voidmain(void)
{
while
(1)//无限循环
{
value=GetADCResult(0);
value0=value*500/255*2;
bai=value0/100;
shi=value0%100/10;
ge=value0%100%10;
P2=0xfe;//P2.0引脚输出低电平,DS0点亮
P0=Tab[bai];
delay();
P2=0xfd;//P2.1引脚输出低电平,DS1点亮
P0=Tab[16];
delay();
P2=0xfb;//P2.2引脚输出低电平,DS2点亮
P0=Tab[shi];
delay();
P2=0xf7;//P2.3引脚输出低电平,DS3点亮
P0=Tab[ge];
delay();
P2=0xff;
}
}
#include
#include"intrins.h"
#include"adc.h"
#defineFOSC18432000L
#defineBAUD9600
#defineWORDunsignedint
#defineBYTEunsignedchar
unsignedintss;
#defineURMD3
sfrT2H