基于STC12C5A60S2单片机数字电压表的设计.doc_第1页
基于STC12C5A60S2单片机数字电压表的设计.doc_第2页
基于STC12C5A60S2单片机数字电压表的设计.doc_第3页
基于STC12C5A60S2单片机数字电压表的设计.doc_第4页
基于STC12C5A60S2单片机数字电压表的设计.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于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所示。 时钟电路 测量电压输入入数码管显示stc12c5a60s2 p1 p0 p2 p2 p0复位电路 图2.1 数字电压表系统硬件设计框图第3章 硬件电路设计3.1 stc12c5a60s2单片机3.1.1 stc12c5a60s2单片机 图3.1.1 stc12c5a60s2单片机引脚图及实物图3.1.2 stc12c5a60s2系列单片机主要性能1)高速:1个时钟/机器周期,增强型8051内核,速度比普通8051快612倍。2)宽电压:5.53.3v,2.23.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) 工作频率:035mhz,相当于普通8051:0420mhz。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.3 stc12c5a60s2系列单片机的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.2 stc12c5a60s2系列单片机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中的chs2chs0确定。adc的转换速度由adc控制寄存器中的speed1和speed0确定。在使用adc之前,应先给adc上电,也就是置位adc控制寄存器中的adc_power位。当adrj=0时,如果取10位结果,则按下面公式计算:10-bita/d conversion result:(adc_res7:0,adc_resl1:0)=1023*vin/vcc当adrj=0时,如果取8位结果,则按下面公式计算:8-bita/d conversion result:(adc_res7:0)=255*vin/vcc当adrj=1时,如果取10位结果,则按下面公式计算:10-bita/d conversion result:( adc_resl1:0 ,adc_res7:0)=1023*vin/vcc当adrj=1时,如果取8位结果,则按下面公式计算:8-bita/d conversion result:( adc_resl1:0 ,adc_res7:2)=255*vin/vcc式中,vin为模拟输入电压,vcc为单片机实际工作电压,用单片机工作电压作为模拟参考电压。3.1.4 与a/d 转换相关的寄存器及说明与stc12c5a60s2系列单片机a/d转换相关的寄存器表3.1.1 a/d转换相关的寄存器1.p1口模拟功能控制寄存器p1asfstc12c5a60s2系列单片机的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.2 p1asf寄存器当p1口中的相应位作为a/d使用时,要将p1asf中的相应位置“1”表3.1.3 p1asf寄存器设置2.adc控制寄存器adc_contradc_contr寄存器的格式如下:adc_conrtr:adc控制寄存器表3.1.4 adc控制寄存器对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控制寄存器。mov adc_contr,#datanopnopnopnopmov a,adc_conrt3、a/d转换结果寄存器adc_res、adc_resl特殊功能寄存器adc_res和adc_resl寄存器用于存放a/d转换结果,其格式如下:表3.1.7 用于存放a/d转换结果寄存器adc_res、adc_reslauxr1寄存器的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-*/void initadc(void) p1asf = 0x58; /设置p1口为ad口 0100 0111 0101 1000 adc_res = 0; /清除结果寄存器 adc_contr = adc_power | adc_speedll; delay(50); /adc上电并延时6、adc读子函数/*-发送adc结果到pc-*/void showresult(byte ch) float value; 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结果-*/byte getadcresult(byte ch) 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; /close adc return adc_res; /返回adc结果3.2 共阳数码管3.2.1数码管简介数码管的一种是半导体发光器件,数码管可分为七段数码管和八段数码管,区别在于八段数码管比七段数码管多一个用于显示小数点的发光二极管单元dp(decimal point),其基本单元是发光二极管。数码管是一类价格便宜使用简单,通过对其不同的管脚输入相对的电流,使其发亮,从而显示出数字能够显示 时间、日期、温度等所有可用数字表示的参数的器件。在电器特别是家电领域应用极为广泛,如显示屏、空调、热水器、冰箱等等。绝大多数热水器用的都是数码管,其他家电也用液晶屏与荧光屏。 数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划a,b,c,d,e,f,g,dp的同名端连在一起,另外为每个数码管的公共极com增加位选通控制电路,位选通由各自独立的i/o线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是哪个数码管会显示出字形,取决于单片机对位选通com端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的com端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为12ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的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分别与上面那个图中的adp各段相对应,通过控制各个led的亮灭来显示数字。 图3.3.2共阳和共阴数码管 本实验使用的是四位数码管,内部的4个数码管共用adp这8根数据线,为人们的使用提供了方便,因为里面有4个数码管,所以它有4个公共端,加上adp,共有12个引脚,下面便是一个共阴的四位数码管的内部结构 图(共阳的与之相反)。引脚排列依然是从左下角的那个脚(1脚)开始,以逆时针方向依次为112脚,下图中的数字与之一一对应。 图3.3.3四位数码管引脚数码管使用条件: a、段及小数点上加限流电阻 b、使用电压:段:根据发光颜色决定;小数点:根据发光颜色决定c、使用电流:静态:总电流80ma(每段10ma);动态:平均电流4-5ma峰值电流 100ma 上面这个只是七段数码管引脚图,其中共阳极数码管引脚图和共阴极的是一样的。4位数码管引脚图数码管使用注意事项说明:()数码管表面不要用手触摸,不要用手去弄引角;()焊接温度:260度;焊接时间:s()表面有保护膜的产品,可以在使用前撕下来。3.3 系统电路设计、说明3.3.1 系统电路原理图 图3.4.1 电路原理图3.3.2 系统电路pcb图3.4.2 电路pcb图第4章 系统软件设计4.1 系统软件设计4.1 程序设计框图adc初始化延时400ms读取被测电压并计算数码管显示开始图4.1.1程序设计框图附 录 源程序/*函数原型: main() 函数功能:主函数说 明:stc12c5a系列单片机*/*#include / 包含51单片机寄存器定义的头文件#include#define uint unsigned int#define uchar unsigned charuchar value,bai,shi,ge;uint value0;uchar code tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f; void delay(void) unsigned char i;for(i=0;i200;i+); void main(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= tabbai ; delay(); p2=0xfd ; /p2.1引脚输出低电平,ds1点亮 p0= tab16 ; delay(); p2=0xfb; /p2.2引脚输出低电平,ds2点亮 p0= tabshi ; delay(); p2=0xf7; /p2.3引脚输出低电平,ds3点亮 p0= tabge ; delay(); p2=0xff; #include#include intrins.h#include adc.h#define fosc 18432000l#define baud 9600#define word unsigned int#define byte unsigned char unsigned int ss;#define urmd 3 sfr t2h = 0xd6; /定时器2高8位sfr t2l = 0xd7; /定时器2低8位sfr adc_low2 = 0xbe; /adc低2位结果#define adc_power 0x80 /adc电源控制位#define adc_flag 0x10 /adc完成标志#define adc_start 0x08 /adc起始控制位#define adc_speedll 0x00 /540个时钟#define adc_speedl 0x20 /360个时钟#define adc_speedh 0x40 /180个时钟#define adc_speedhh 0x60 /90个时钟byte idata disadch2; /通道号byte idata disadcval5; /adc电压值/*-发送adc结果到pc-*/void showresult(byte ch) float value; 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结果-*/byte getadcresult(byte ch) 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; /close adc return adc_res; /返回adc结果/*-初始化adc-*/void initadc(void) p1asf = 0x58; /设置p1口为ad口 0100 0111 0101 1000 adc_res = 0; /清除结果寄存器 adc_contr = adc_power | adc_speedll; delay(50); /adc上电并延时/*-软件延时-*/void delay(word n) word x; while (n-) x = 5000; while (x-); int mi(uchar dat, uchar mi)uchar i;int sum = 1;for(i=0; i= 0)if(i != point_position)arrayi = (temp%10)|0x30;temp = temp / 10;elsearrayi = .;i-;/将长整形转化为字符串 用作显示频率void change_long_data_to_array(unsigned char *array, unsigned char length,long dat)char i = length-1;arraylength-1 = 0;while(i = 0)arr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论