基于STCC的数字电压表
基于单片机的数字电压表设计

基于单片机的数字电压表设计一、背景介绍随着科技的发展,越来越多的人开始关注电压表。
电压表是一种测量电压的仪器,它可以根据检测到的电压值显示出相应的数字。
传统的电压表使用指针或指示灯来显示电压值,但这种方式会有很多限制,例如不能显示小于1V的电压值,对于高精度的测量也不能满足要求。
为了解决上述问题,本文提出了一种基于单片机的数字电压表设计方案。
二、基于单片机的数字电压表设计原理基于单片机的数字电压表设计采用单片机ADC(模数转换)模块来检测电压值,将检测到的电压值转换成数字值,然后通过LCD(液晶显示器)来显示。
该设计中需要使用一个模拟信号处理电路,它包括一个放大器、一个滤波器和一个参考电压电路。
放大器可以增加信号的幅值,以便更好地检测信号的电压值;滤波器可以削弱外部电磁干扰,以便更好地检测电压值;参考电压电路可以把外部电压转换为0-5V之间的电压,以便更好地检测电压值。
三、设计方案1.单片机:AT89S522.ADC模块:AD79053.放大器:LM3584.滤波器:LPF(低通滤波器)5.参考电压电路:LM3176.LCD显示器:12864四、设计步骤1. 利用LM358放大器和LPF滤波器对测量的电压值进行放大和滤波处理,以获得更精准的数据。
2. 利用LM317参考电压电路将放大后的电压值转换为0-5V的电压,以便更好地检测电压值。
3. 将转换后的电压值送入AD7905 ADC模块,将检测到的电压值转换成数字值。
4. 将转换后的数字值送入AT89S52单片机,并通过12864 LCD显示器将检测到的电压值显示出来。
五、总结本文提出了一种基于单片机的数字电压表设计方案,主要采用单片机ADC模块来检测电压值,并将检测到的电压值转换为数字值,然后通过LCD显示器显示出来。
该设计方案可以满足各种电压测量要求,具有良好的精度和可靠性。
STC12C2052AD之数字电压表099V

STC12C2052AD之数字电压表0-99V做了N个ICL7107的数字电压表头都没有成功,今天改为带AD的单片机了。
AD部分代码来看网络。
电路就不发了。
数码管用四位共阳。
小数点后面有一点跳动,不过对于用面包板搭建的电路,应该算不错吧。
基准电压采用TL431.电压在2.61和2.37之间跳动。
/************************************************ **********************基于STC12C4052AD单片机的0-99V数字电压表程序数码之家首发。
ID:abenyaoP1.6口为0-5V模拟量输入端,P1.5口连接TL431l输出的2.5V基准电源,4位串行LED数码管显示************************************************* *********************/#include ; //单片机头文件#include ; //51基本运算(包括_nop_空函数)#define uchar unsigned char#define uint unsigned int#define LEDBus P3//a3.0-b3.1-c3.2-d3.3-e3.4-f3.5-g3.7-dp1.0#define ON 1//定义0为打开#define OFF 0//定义1为关闭sbit ge=P1^4;//个位位选sbit shi=P1^3;//十位位选sbit bai=P1^2;//百位位选sbit qian=P1^1;//千位位选sbit db=P1^0;char d[5];uint R,M,N;//若定义成uchar型就只能显示2.5V以下的数值uchar codeLEDTab[]={0xc0,0xf9,0x64,0x70,0x59,0x52,0x42,0xf8 ,0x40,0x58};/************************************************ *****************函数名:毫秒级CPU延时函数调用:delay (?);参数:1~65535(参数不可为0)返回值:无结果:占用CPU方式延时与参数数值相同的毫秒时间备注:应用于1T单片机时i;0;t--)//如果t大于0,t减1(外层循环)for(i=600;i>;0;i--);//i等于124,如果i大于0,i减1}/************************************************ *******************函数名:ADC初始化及8位A/D转换函数返回值:8位的ADC数据结果:读出指定ADC接口的A/D转换值,并返回数值备注:适用于STC12C2052AD系列单片机(必须使用STC12C2052AD.h头文件)************************************************* ******************/uchar Read (uchar CHA){uchar AD_FIN=0; //存储A/D转换标志;若在函数外定义此变量则不能得到连续变化的模拟量的显示/******以下为ADC初始化程序****************************/CHA &= 0x07;//选择ADC的8个接口中的一个(0000 0111 清0高5位)ADC_CONTR = 0x60; //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)_nop_();ADC_CONTR |= CHA;//选择A/D当前通道_nop_();ADC_CONTR |= 0x80;//启动A/D电源delay(1);//使输入电压达到稳定(1ms即可?/******以下为ADC执行程序****************************/ADC_CONTR |= 0x08;//启动A/D转换(0000 1000 令ADCS = 1)_nop_();_nop_();_nop_();_nop_();while (AD_FIN ==0){//等待A/D转换结束AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否}ADC_CONTR &= 0xE7;//1111 0111 清ADC_FLAG位, 关闭A/D转换, return (ADC_DATA);//返回A/D转换结果(8位)}/************************************************ ******************显示函数转换函数:M=模拟量采样值,N=基准电压源采样值(本例为2.5V),R=模拟量输入值(待显示值)N=256*2.5/Vcc;变形后得Vcc=256*2.5/N;代入M=256*R/Vcc;得到M=R*N/2.5;变形后得R=M*2.5/N 1.105为输入端分压比。
基于STC89C52单片机的简易数字电压表设计【毕业设计】

基于STC89C52单片机的简易数字电压表设计【毕业设计】存档编号华北水利水电大学North China University of Water Resources and Electric Power 毕业设计题目基于单片机的数字电压表设计学院信息工程学院专业通信工程姓名学号200912303指导教师完成时间2013年5月20日教务处制目录摘要 (I)Abstract (I)绪论 ...................................................................................................................... I I 一设计背景 .. (III)二设计意义 (IV)第一章数字电压表 (5)1.1 数字电压表的优点 (5)1.2 数字电压表发展趋势 (6)1.3 设计平台 (6)1.3.1 KEIL C51开发平台 (6)1.3.2 Proteus 7 Professional设计软件 (7)第二章总体设计方案 (8)2.1数字电压设计的两种方案 (8)2.1.1 由数字电路及芯片构建 (9)2.1.2 由单片机系统及A/D 转换芯片构建 (9)2.2 设计要求 (9)2.3 技术要求 (10)2.4 设计方案 (10)第三章硬件简介 (11)3.1 本设计单片机的选择 (11)3.1.1常用单片机的特点比较 (11)3.1.2 单片机的选择 (12)3.1.3 STC89C52单片机介绍 (13)3.2 本设计显示器件选择 (18)3.2.1 常用显示器件简介 (18)3.2.2 显示器件的选择 (19)3.2.3 1602字符型LCD简介 (19)3.3A/D芯片 (24)3.3.1常用的A/D芯片 (24)3.3.2 ADC0809芯片 (25)第四章接口电路 (28)4.1 显示电路 (28)4.2 ADC0809与单片机接口电路 (29)第五章硬件电路系统模块设计 (30)5.1 总电路模块 (30)5.2 硬件系统电路简介 (30)第六章系统软件设计 (31)6.1 主程序 (31)6.2 A/D转换子程序 (32)6.3 显示子程序 (32)第七章调试及性能分析 (33)7.1 调试与测试 (33)7.2 性能分析 (34)总结 (35)参考文献 (36)致谢 (38)附录 (39)附录I(外文翻译) (39)外文译文 (49)附录II(任务书) (57)附录III(开题报告) (59)附录IV(图表) (62)I Proteus仿真图 (62)II 硬件总电路图 (63)III 实物图 (64)附录V(程序清单) (66)摘要随着时代的进步,用指针式万用表测量小幅度直流电压已经显得有些不太方便。
基于STCC的数字电压表

1引言在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常。
而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。
本文设计了一种基于单片机的简易数字电压表。
该设计主要由三个模块组成:A/D转换模块,数据处理模块及显示模块。
A/D转换主要由芯片ADC0804来完成,它负责把采集到的模拟量转换为相应的数字量在传送到数据处理模块。
数据处理则由芯片STC89C52来完成,其负责把ADC0804传送来的数字量经过一定的数据处理,产生相应的显示码送到显示模块进行显示;此外,它还控制着ADC0804芯片工作。
该系统的数字电压表电路简单,所用的元件较少,成本低,且测量精度和可靠性较高。
此数字电压表可以测量0-5V的1路模拟直流输入电压值,并通过7段数码管显示出来。
2 设计总体方案设计要求⑴以MCS-51系列单片机为核心器件,组成一个简单的直流数字电压表。
⑵采用1路模拟量输入,能够测量0-5V之间的直流电压值。
⑶电压显示用LED数码管显示,至少能够显示两位小数。
⑷尽量使用较少的元器件。
设计思路⑴根据设计要求,选择STC89C52单片机为核心控制器件。
⑵A/D转换采用ADC0804实现,与单片机的P1口相连接。
⑶电压显示采用三个7段LED数码管显示,另外三位数码管显示A/D转换的数字量的值。
⑷LED数码的段选码和位选码均由单片机P0口经过两片74HC573锁存器输入。
设计方案硬件电路设计由6个部分组成; A/D转换电路,STC89C52单片机系统,LED显示系统、时钟电路、复位电路以及测量电压输入电路。
硬件电路设计框图如图1所示。
图2-1 数字电压表系统硬件设计框图3 硬件电路设计单片机系统本次课设选择的单片机是STC89C52,之所以选择这块芯片,是因为该芯片的各项功能均符合本次课设的指标要求,并且该芯片有很多成熟的资料供我们学习,使用用起来很方便,也有专门的下载程序平台,方便现场调试。
使用STC12C5204AD单片机的数字电压表

使用STC12C5204AD单片机的数字电压表这是一块使用STC12C5204AD数字电压表的制作程序,P0.0-P0.3 共阴数码管位驱动端,P2口为共阴数码管段a-g及dp的段驱动端口,P0、P2口设置为推挽输出方式,段输出加470欧限流电阻,AD为8位,转换电压分度5/256=0.0195312V,分流电阻为实测阻值,AD值*0.0195312v/对地分流电阻,算出分流电流,然后用分流电流*分流电阻与限流电阻之和即为要显示的输入电压值。
业余使用,精度已经够用了,比那个小的指针的要准确多了。
其中涉及到端口设置的地方大家对照芯片手册更正。
#include ; //STC12C5204AD头文件 (6 K) 下载次数:15 #include ;//_nop_();#define uchar unsigned char#define uint unsigned int//sfr ADC_CONTR=0XBC;//adc使能位.ADC电源控制位sfr ADC_RES=0XBD;// adc数据高八位,即ADC值sfr P1ASF=0X9D;//P1各端口ADC使能端uchar led_bcd[]={0x3F,/*0*/ //共阴数码管0x06,/*1*/0x5B,/*2*/0x4F,/*3*/0x66,/*4*/0x6D,/*5*/0x7D,/*6*/0x07,/*7*/0x7F,/*8*/0x6F,/*9*/0x00,/* */0x7c /*b*/},ad_data;uint data dis[5]={0x00,0x00,0x00,0x00,0x00},ZZ; //定义四个显示数据单元和一个数据存储单元//dis[4,3,2,1,5] 显示:12.345为存储单元/************************************************ *******************//* 延时子程序*//**//**//************************************************ *******************/void delay(uint z)//延时子函数{uchar de1,de2;for(de1=z;de1>;0;de1--)for(de2=100;de2>;0;de2--);}/*******************************************************///显示子函数 display(h1,h2,h3,h4)//h1,h2,h3,h4 为四位LED数码管显示变量///////************************************************ *******/void display(uchar h1,uchar h2,uchar s1,uchar s2) ////LED显示函数(参数:LED1,LED2,LED3,LED4) {// 第一个数码管显示数据if(h1==0x3f) h1=0x00;//0消隐语句P2=h1;//delay(2);P00=0;delay(2);//参数2-10数值大LED亮度高但闪烁感强,数值小LED亮度低,但闪烁感小.P2=0X00;P00=1;/************************************************ *******/// 第二个数码管显示数据P2=h2|0x80;//delay(2);P01=0;delay(2); //参数2-10数值大LED亮度高但闪烁感强,数值小LED亮度低,但闪烁感小.P2=0X00;P01=1;//delay(5);/************************************************ *******/// 第三个数码管显示数据P2=s1;//delay(2);P02=0;delay(2); //参数2-10数值大LED亮度高但闪烁感强,数值小LED亮度低,但闪烁感小.P2=0X00;P02=1;// delay(5);/************************************************ *******/// 第四个数码管显示数据P2=s2;//delay(2);P03=0;delay(2); //参数2-10数值大LED亮度高但闪烁感强,数值小LED亮度低,但闪烁感小.P2=0X00;P03=1;//delay(5);}void init()//系统初始化函数{P2M1=0Xff; //强推挽推动a-g dpP2M0=0X00; //强推挽推动a-g dpP0M1=0X0f; //强推挽推动位P0M0=0X00; //强推挽推动位P0=0XFF;//初始化P2=0;//初始化/***定时器0初始化设置*****/TMOD = 0x01;TH0 = 0xFC; //初值1msTL0 = 0x18; //初值1msEA = 1;//开总中断ET0 = 1; //定时器0中断打开TR0 = 1; //打开定时器开始计时/*************************/ZZ=0;}void initADC() //AD初始化{P1ASF=0x01;//只使用P1.0端口做为ADC输入端.ADC_RES=0;//ADC数据寄存器清零ADC_CONTR=ADC_POWER|ADC_SPEEDLL; //打开ADC开关并设置转换速率详见STC12C52.Hdelay(2); //打开ADC并延时.}uchar readADC()//读AD{ADC_CONTR=ADC_POWER|ADC_SPEEDLL|0|ADC_START;_nop_();_nop_();_nop_();_nop_();while(!(ADC_CONTR&ADC_FLAG));//等待转换完成标志ADC_CONTR&=~ADC_FLAG;//close ADCreturn ADC_RES;//返回ADC值.}void main(){init();initADC();//初始化ADCad_data=readADC();//开机转换while(1){float j;uchar ad_data;while(ZZ>;=500) //500毫秒读一次ADC{ad_data=readADC();//读入ADC数据ZZ=0;}j=ad_data*19.5312;//由AD数据*19.5312(放大1000倍)=分流后的电压j=j/9890; //j(电压)/接地电阻(实测)9890欧j=j*60190;//j(电流)*(输入限流电阻(实测)60190欧+接地电阻(实测)9890欧) 计算出实际输入电压如果使用高精度电阻,则直接输入电阻值dis[4]=j/1000;dis[3]=dis[4]/10;dis[2]=dis[4]%10;//h=(h-(dis[3]*10+dis[2]))*100;dis[4]=j/10-dis[4]*100;//dis[4]=j%100;//小数位第一位dis[1]=dis[4]/10;dis[0]=dis[4]%10;//小数位第二位//delay(10000);}}void Timer0Interrupt(void) interrupt 1{ZZ++;//AD读取间隔时间控制TH0 = 0xFC;TL0 = 0x18;display(led_bcd[dis[3]],led_bcd[dis[2]],led_bcd[d is[1]],led_bcd[dis[0]]);}。
基于STC89C51单片机的数字电压表设计

基于STC89C51单片机的数字电压表设计数字表的设计和开发已有无数类型和款式,传统的数字电压表有自己的特点,它们适合在现场做手工测量,而要完成远程测量并对测量的数据做进一步处理,运用传统的数字电压表是无法完成的。
为此,本文设计了基于PC通信的数字电压表,该表既可以完成测量数据的传递,又可借助PC举行测量数据的处理。
所以,这种类型的数字电压表无论在功能和实际应用上,都具有传统数字电压表无法比拟的优点,这使得它的开发和应用都具有良好的前景。
2 系统构成本系统主要由硬件和软件两部分构成,硬件主要包括数据采集,最小数据采集系统,单片机与PC机的接口电路等。
软件主要有单片机数据采集程序,单片机与上位机通信程序,以及上位机数据处理程序。
3 数据采集电路原理该新型数字电压表测量的电压类型为直流,测量范围为0~5 V,下位机采纳的单片机为STC89C51,AD转化采纳的是最频繁的0809,可通过RS232串行口与PC机举行通信,以传送所测量的直流电压数据。
图1所示是该数字电压表的数据采集电路。
电路的设计已做到了最小化,即没实用任何附加规律器件做接口电路,便可实现单片机对ADC0809转换芯片的操作。
图1中的ADC0809是8位的模数转化芯片,片内有8路模拟选通开关以及相应的通道锁存译码电路,转化时光大约为100μs左右。
在电路应用中,首先要指定ADC0809的数据通道,当外部电压进入芯片后,STATR信号由高到低,在脉冲的下降沿ADC0809开头转换,同时管脚EOC电平变低,表示转化正在举行,转化完成之后,管脚EOC的电平变高,表示一次转化结束。
4 软件编程本系统的软件程序主要包括下位机数据采集程序、上位机可视化界面程序、单片机与PC机的串口通信等。
单片机可采纳C51编程,上位机操作可采纳VC++6.0举行可视化编程,这样,在串口调试的时候,就第1页共4页。
基于单片机实现简易数字电压表的设计.

基于单片机实现简易数字电压表的设计任务的功能要求:1. 可以选择8路0~5V的输入电压值;2. 可以轮流显示或是单路选择显示;3. 测量显示的最小分辨率为0.01V,测量误差正负0.02V;4. 具有电压过低、过高的声光报警功能。
在此我们选择的单片机为STC89C52芯片、ADC0809数模转换器(因仿真软件没有,故选用ADC0808替代,其实差不多的,就是输出管脚的排序问题)、LCD1602液晶屏(接线相对与数码管简单多了)。
在protel软件中的仿真电路图如下:P2.7的开关的选择是选择显示1,2,3,4路或是5,6,7,8路。
下面的单片机的C程序长是长了点,但确实运行有效,主要花费在8路的数据实现上了,另外其中的报警设置也是思路中有一路需要报警也即报警的。
关于各个芯片及液晶的资料自己去网上找就好了。
另外P0端口必须接上拉电阻!lcd1602的3脚管必须接可调电阻!单片机的C程序清单:#include <reg52.h>#include <intrins.h>#include<string.h>#define dat_port P0#define uchar unsigned char #define uint unsigned int#define delay4us() {_nop_();_nop_();_nop_();_nop_();}sbit AB1=P3^2;sbit AB2=P3^1;sbit AB3=P3^0;sbit AB5=P3^3;sbit AB4=P2^7;sbit RS=P2^0;//RS=1 数据 RS=0 命令sbit RW=P2^1;//RW=1 读取 RW=0 写入sbit E=P2^2;//E 使能信号sbit EOC=P2^4;sbit OE=P2^5;sbit START=P2^3;sbit CLOCK=P2^6;uchar X[4]={"0000"};void Refresh_show();void delay50us(uint m){uint n,k;for(n=m;n>0;n--)for(k=25;k>0;k--);}void Write_LCD_Command(uchar cmd);//向LCD写入命令void Write_LCD_Data(uchar dat); //向LCD写入一个字节的数据函数 void Initialize_LCD1602(); //液晶初始化函数void LCD_Display(uchar *str);//在LCD上显示字符串//---------------忙检查-------------------//uchar LCD_Busy_Check(){uchar LCD_Status;RS = 0;RW = 1;E = 1;delay50us(4);LCD_Status = P0;E = 0;return LCD_Status;}//--------------向LCD写入命令--------------------//void Write_LCD_Command(uchar cmd){while((LCD_Busy_Check()& 0x80)==0x80); //忙等待RS = 0;RW = 0;E = 0;P0 = cmd;delay4us();E = 1;delay4us();E = 0;}//-----------向LCD写入一个字节的数据函数-----------------*/void Write_LCD_Data(uchar dat){while((LCD_Busy_Check()&0x80)==0x80);RS = 1;RW = 0;E = 0;P0 = dat;delay4us();E = 1;delay4us();E = 0;}//-----------LCD初始化-----------------*/void Initialize_LCD1602() //液晶初始化函数{Write_LCD_Command(0x38);delay50us(10); //功能设置,数据长度为8位,双行显示,5×7点阵字体Write_LCD_Command(0x0C);delay50us(10); // 显示开,关光标Write_LCD_Command(0x06);delay50us(10); //字符进入模式:屏幕不动,字符后移Write_LCD_Command(0x01); delay50us(10);//清屏}//-----------在LCD上显示字符串-----------------*/void LCD_Display(uchar *str){uchar i;for(i=0;i<strlen(str);i++){Write_LCD_Data(str[i]);delay50us(100);}}unsigned long dat_adc0808;uchar display_buffer[][16]={{"DC1=0.00DC2=0.00"}, {"DC3=0.00DC4=0.00"}};uchar display1_buffer[][16]={{"DC5=0.00DC6=0.00"}, {"DC7=0.00DC8=0.00"}};uint adc0808_init() // AD初始化{START=0;OE=0;START=1;START=0;while(EOC==0);OE=1;dat_adc0808=P1;OE=0;return dat_adc0808;}void Refresh_show0() //刷新显示{uint t=dat_adc0808*500.0/255; //if(t>400||t<100)X[0]=1;elseX[0]=0;display_buffer[0][4] = t/100+'0'; //整数位display_buffer[0][6] = t/10%10+'0'; //两个小数位 display_buffer[0][7] = t%10+'0'; }void Refresh_show1() //刷新显示{uint t=dat_adc0808*500.0/255; //if(t>400||t<100)X[1]=1;elseX[1]=0;display_buffer[0][12] = t/100+'0'; //整数位display_buffer[0][14] = t/10%10+'0'; //两个小数位 display_buffer[0][15] = t%10+'0'; }void Refresh_show2() //刷新显示{uint t=dat_adc0808*500.0/255; //if(t>400||t<100)X[2]=1;elseX[2]=0;display_buffer[1][4] = t/100+'0'; //整数位display_buffer[1][6] = t/10%10+'0'; //两个小数位 display_buffer[1][7] = t%10+'0'; }void Refresh_show3() //刷新显示{uint t=dat_adc0808*500.0/255; //if(t>400||t<100)X[3]=1;elseX[3]=0;display_buffer[1][12] = t/100+'0'; //整数位display_buffer[1][14] = t/10%10+'0'; //两个小数位 display_buffer[1][15] = t%10+'0';}void Refresh1_show0() //刷新显示{uint t=dat_adc0808*500.0/255; //if(t>400||t<100)X[0]=1;elseX[0]=0;display1_buffer[0][4] = t/100+'0'; //整数位display1_buffer[0][6] = t/10%10+'0'; //两个小数位 display1_buffer[0][7] = t%10+'0';}void Refresh1_show1() //刷新显示{uint t=dat_adc0808*500.0/255; //if(t>400||t<100)X[1]=1;elseX[1]=0;display1_buffer[0][12] = t/100+'0'; //整数位display1_buffer[0][14] = t/10%10+'0'; //两个小数位 display1_buffer[0][15] = t%10+'0'; }void Refresh1_show2() //刷新显示{uint t=dat_adc0808*500.0/255; //if(t>400||t<100)X[2]=1;elseX[2]=0;display1_buffer[1][4] = t/100+'0'; //整数位display1_buffer[1][6] = t/10%10+'0'; //两个小数位 display1_buffer[1][7] = t%10+'0';}void Refresh1_show3() //刷新显示{uint t=dat_adc0808*500.0/255; //if(t>400||t<100)X[2]=1;elseX[2]=0;display1_buffer[1][12] = t/100+'0'; //整数位display1_buffer[1][14] = t/10%10+'0'; //两个小数位 display1_buffer[1][15] = t%10+'0'; }void main(){TMOD=0x02;TH0=0x14;TL0=0x00;IE=0x82;TR0=1;Initialize_LCD1602();delay50us(10);while(1){if(AB4==1){AB1=0;AB2=0;AB3=0;adc0808_init();Refresh_show3();Write_LCD_Command(0x80);//设置显示的初始位置LCD_Display(display_buffer[0]); //显示测得的数据AB1=0;AB2=0;AB3=1;adc0808_init();Refresh_show0();Write_LCD_Command(0x80);//设置显示的初始位置LCD_Display(display_buffer[0]); //显示测得的数据 AB1=0;AB2=1;AB3=0;adc0808_init();Refresh_show1();Write_LCD_Command(0xC0);//设置显示的初始位置LCD_Display(display_buffer[1]); //显示测得的数据 AB1=0;AB2=1;AB3=1;adc0808_init();Refresh_show2();Write_LCD_Command(0xC0);//设置显示的初始位置LCD_Display(display_buffer[1]); //显示测得的数据 if(X[0]||X[1]||X[1]||X[2]==1) AB5=1;elseAB5=0;}else{AB1=1;AB2=0;AB3=0;adc0808_init();Refresh1_show3();Write_LCD_Command(0x80);//设置显示的初始位置LCD_Display(display1_buffer[0]); //显示测得的数据 AB1=1;AB2=0;AB3=1; adc0808_init();Refresh1_show0();Write_LCD_Command(0x80);//设置显示的初始位置LCD_Display(display1_buffer[0]); //显示测得的数据 AB1=1;AB2=1;AB3=0; adc0808_init();Refresh1_show1();Write_LCD_Command(0xC0);//设置显示的初始位置LCD_Display(display1_buffer[1]); //显示测得的数据 AB1=1;AB2=1;AB3=1; adc0808_init();Refresh1_show2();Write_LCD_Command(0xC0);//设置显示的初始位置LCD_Display(display1_buffer[1]); //显示测得的数据 if(X[0]||X[1]||X[1]||X[2]==1) AB5=1;elseAB5=0;}}}void Timer0_INT() interrupt 1 {CLOCK=!CLOCK; }。
STC12C5A60S2单片机数字电压表的设计 精品

基于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章引言在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于S T C C的数字电压表文档编制序号:[KK8UY-LL9IO69-TTO6M3-MTOL89-FTT688]1引言在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常。
而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。
本文设计了一种基于单片机的简易数字电压表。
该设计主要由三个模块组成:A/D转换模块,数据处理模块及显示模块。
A/D转换主要由芯片ADC0804来完成,它负责把采集到的模拟量转换为相应的数字量在传送到数据处理模块。
数据处理则由芯片STC89C52来完成,其负责把ADC0804传送来的数字量经过一定的数据处理,产生相应的显示码送到显示模块进行显示;此外,它还控制着ADC0804芯片工作。
该系统的数字电压表电路简单,所用的元件较少,成本低,且测量精度和可靠性较高。
此数字电压表可以测量0-5V的1路模拟直流输入电压值,并通过7段数码管显示出来。
2 设计总体方案设计要求⑴以MCS-51系列单片机为核心器件,组成一个简单的直流数字电压表。
⑵采用1路模拟量输入,能够测量0-5V之间的直流电压值。
⑶电压显示用LED数码管显示,至少能够显示两位小数。
⑷尽量使用较少的元器件。
设计思路⑴根据设计要求,选择STC89C52单片机为核心控制器件。
⑵A/D转换采用ADC0804实现,与单片机的P1口相连接。
⑶电压显示采用三个7段LED数码管显示,另外三位数码管显示A/D转换的数字量的值。
⑷LED数码的段选码和位选码均由单片机P0口经过两片74HC573锁存器输入。
设计方案硬件电路设计由6个部分组成; A/D转换电路,STC89C52单片机系统,LED显示系统、时钟电路、复位电路以及测量电压输入电路。
硬件电路设计框图如图1所示。
图2-1 数字电压表系统硬件设计框图3 硬件电路设计单片机系统本次课设选择的单片机是STC89C52,之所以选择这块芯片,是因为该芯片的各项功能均符合本次课设的指标要求,并且该芯片有很多成熟的资料供我们学习,使用用起来很方便,也有专门的下载程序平台,方便现场调试。
复位电路和时钟电路单片机在启动运行时都需要复位,使CPU和系统中的其他部件都处于一个确定的初始状态,并从这个状态开始工作。
MCS-51单片机有一个复位引脚RST,采用施密特触发输入。
当震荡器起振后,只要该引脚上出现2个机器周期以上的高电平即可确保时器件复位。
复位完成后,如果RST端继续保持高电平,MCS-51就一直处于复位状态,只要RST恢复低电平后,单片机才能进入其他工作状态。
单片机的复位方式有上电自动复位和手动复位两种,图6是51系列单片机统常用的上电复位和手动复位组合电路,只要Vcc上升时间不超过1ms,它们都能很好的工作。
图3-1复位电路时钟电路单片机中CPU每执行一条指令,都必须在统一的时钟脉冲的控制下严格按时间节拍进行,而这个时钟脉冲是单片机控制中的时序电路发出的。
CPU执行一条指令的各个微操作所对应时间顺序称为单片机的时序。
MCS-51单片机芯片内部有一个高增益反相放大器,用于构成震荡器,XTAL1为该放大器的输入端,XTAL2为该放大器输出端,但形成时钟电路还需附加其他电路。
本设计系统采用内部时钟方式,利用单片机内部的高增益反相放大器,外部电路简,只需要一个晶振和 2个电容即可图3-2 时钟电路A/D转换模块本次课设采用的A/D转换芯片是AD0804,其为逐次比较型A/D转换芯片,它完成一次转换所需时间与其位数和时钟频率有关,位数越少,时钟频率越高,转换时间越短,该芯片的分辨率为8位,转换时间为100μm,输入电压范围为0~5V。
芯片内部具有三态输出锁存器,可直接连接在数据总线上。
由于本次显示小数点后两位的电压值,因此A/D0804满足要求。
LED显示系统设计LED是发光二极管显示器的缩写。
LED由于结构简单、价格便宜、与单片机接口方便等优点而得到广泛应用。
在单片机中使用最多的是七段数码显示器。
本次采用的是共阴极7端数码管。
并且采用软件译码的方式,既简化了硬件电路又增加了程序编写的灵活性。
表共阴极字段码表LED显示器与单片机接口设计由于单片机的并行口不能直接驱动LED显示器,所以,在一般情况下,必须采用专用的驱动电路芯片,使之产生足够大的电流,显示器才能正常工作。
为了简化数字式直流电压表的电路设计,在LED驱动电路的设计上,可以利用单片机P0口上外接的上拉电阻来实现。
由于数码管的个数较多,因此用两片74HC573锁存器芯片与单片机P0口相连,分别控制数码管的段选码和位选码。
总体电路设计此电路的工作原理是:+5V模拟电压信号通过变阻器Re2分压后由ADC0804的Vin+通道进入(由于使用的Vin+通道,所以Vin-接地),经过模/数转换后,产生相应的数字量经过其输出通道D0-D7传送给STC89C52芯片的P1口,STC89C52负责把接收到的数字量经过数据处理,产生正确的7段数码管的显示段码传送给四位LED,同时它还通过P0口产生位选信号控制数码管的亮灭。
此外,STC89C52还控制ADC0804的工作。
片选CS与单片机的P0^7相连,WR、RD分别与和相连,数据输出端与P1口相连。
工作是先将CS置为低电平,即选中该AD转换芯片,/WR随后置低电平,经过短暂延迟后,/WR拉高,随后AD转换器被启动,并且经过(1-8个A/D时钟周期后)时间后,A/D转换结束,转换结果存入数据锁存器,延迟一段时间后,将/RD之低电平,再延迟一段时间后,将端口上的数据读到P1口上,读走数据后将/RD拉高,并将CS拉高。
简易数字直流电压表的硬件电路已经设计完成,就可以选取相应的芯片和元器件,利用Proteus软件绘制出硬件的原理,并仔细地检查修改,直至形成完善的硬件原理图。
但要真正实现电路对电压的测量和显示的功能,还需要有相应的软件配合,才能达到设计要求。
图5-1 总体电路图4 程序设计程序设计总方案利用KEIL软件进行程序编写,根据模块的划分原则,将该程序划分初始化模块,A/D转换子程序和显示子程序,这三个程序模块构成了整个系统软件的主程序,如图12所示。
图4-1 数字式直流电压表主程序框图5仿真软件调试软件调试的主要任务是排查错误,错误主要包括逻辑和功能错误,这些错误有些是显性的,而有些是隐形的,可以通过仿真开发系统发现逐步改正。
编好程序后,在KEIL平台下对程序进行调试,由于程序代码不多,因此调试也较为顺利,但还是遇到一些问题,因此也学到了不少东西,积累了一些调试经验。
结果显示及误差分析5.2.1结果显示(1)当IN0口输入电压值为时,显示结果如图5-1所示,测量误差为前三位为实际电压值,后三位为A/D转换的数值图(2)当IN0输入电压值为时,显示结果如图15所示。
测量误差为 V。
(3)当IN0口输入电压值为时,显示结果如图16。
测量误差为。
误差分析通过以上仿真测量结果可得到简易数字电压表与“标准”数字电压表对比测试表,如下表所示:表4 简易数字电压表与“标准”数字电压表对比测试表由于单片机STC89C52为8位处理器,当输入电压为时,ADC0804输出数据值为255(FFH),因此单片机最高的数值分辨率为(5/255)。
这就决定了电压表的最高分辨率只能到,从上表可看到,测试电压一般以的幅度变化。
从上表可以看出,简易数字电压表测得的值基本上比标准电压值偏大,这可以通过校正ADC0804的基准电压来解决。
因为该电压表设计时直接用5V的供电电源作为电压,所以电压可能有偏差。
当要测量大于5V的电压时,可在输入口使用分压电阻,而程序中只要将计算程序的除数进行调整就可以了。
6 设计总结与体会经过一段时间的努力,基于单片机的简易数字电压表基本完成。
但设计中的不足之处仍然存在。
在这过程中,我对电路设计,单片机的使用等都有了新的认识。
通过这次设计我加深了对Keil软件的使用方法,掌握了从系统的需要、方案的设计、功能模块的划分、原理图的设计和电路图的仿真的设计流程,积累了不少经验。
基于单片机的数字电压表使用性强、结构简单、成本低、外接元件少。
在实际应用工作应能好,测量电压准确,精度高。
系统功能、指标达到了课题的预期要求、系统在硬件设计上充分考虑了可扩展性,经过一定的改造,可以增加功能。
本文设计主要实现了简易数字电压表测量一路电压的功能,详细说明了从原理图的设计、电路图的仿真再到软件的调试。
通过本次设计,我对单片机这门课有了进一步的了解。
无论是在硬件连接方面还是在软件编程方面。
本次设计采用了STC89C52单片机芯片,与以往的单片机相比增加了许多新的功能,使其功能更为完善,应用领域也更为广泛。
设计中还用到了模/数转换芯片ADC0804,以前在学单片机课程时只是对其理论知识有了初步的理解。
通过这次设计,对它的工作原理有了更深的理解。
在调试过程中遇到很多问题,硬件上的理论知识学得不够扎实,对电路的仿真方面也不够熟练。
总之这次电路的设计和仿真,基本上达到了设计的功能要求。
在以后的实践中,我将继续努力学习电路设计方面的理论知识,并理论联系实际,争取在电路设计方面能有所提升。
参考文献[1]胡健.单片机原理及接口技术.北京:机械工业出版社,2004年10月[2]王毓银.数字电路逻辑设计.高等教育出版社,2005年12月[3]于殿泓、王新年.单片机原理与程序设计实验教程.西安电子科技大学出版社,2007年5月[4]谢维成、杨加国.单片机原理与应用及C51程序设计实例.电子工业出版社,2006年3月[5]李广弟.单片机基础.北京航空航天大学出版社,2007年5月[6]姜志海,黄玉清等着.单片机原理及应用[M] .北京:电子工业出版社.2005年7月[7]魏立峰.单片机原理及应用技术.北京大学出版社,2005年[8]周润景.Protues在MCS-51&ARM7系统中的应用百例.第一版.北京:电子工业出版社,2006年[9]边春远等着.MCS-51单片机应用开发实用子程序[M] .北京:人民邮电出版社.2005年9月.[10]苗红霞.单片机实现数字电压表的软硬件设计[J] .河海大学常州分校学报,2002,(03).[11]宋凤娟,孙军,李国忠.基于89C51单片机的数字电压表设计[J] .工业控制计算机,2007,(04).说明:改程序只在实验板上能正常显示电压,在proteus里面显示数码管会乱码,不知道问什么。
但是电路图是和实物一模一样的。
附录程序代码#include<>#include <>#include <>#define uint unsigned int#define uchar unsigned charsbit adrd=P3^7; //IO口定义sbit adwr=P3^6;sbit diola=P2^5;sbit dula=P2^6;sbit wela=P2^7;unsigned int j,k,ADVAL1,adval;uchar a,A1,A2,A3,A4,A5,A6;void delay(unsigned char i)//延时程序{for(j=i;j>0;j--)//for(k=125;k>0;k--);for(k=110;k>0;k--);}uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,//数码管编码 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void display(uchar GEWEI,uchar SHIFENWEI,uchar BAIFENWEI)//显示程序{dula=1;dula=0;P0=0x80;wela=1;wela=0;delay(1);//**显示输出电压的个位**//P0=table[GEWEI]+0x80;dula=1;dula=0;P0=0xfe;wela=1;wela=0;delay(1);//***显示输出电压的十分位****// dula=0;P0=table[SHIFENWEI];dula=1;dula=0;wela=0;P0=0xfd;wela=0;delay(1);//**显示输出电压的百分位**//P0=table[BAIFENWEI];dula=1;dula=0;wela=0;P0=0xfb;wela=1;wela=0;delay(1);}//********数码管后三位输出AD转换的实际值***************// void display1( uchar bai,uchar shi,uchar ge){//******显示百位*******//dula=0;P0=0;dula=1;dula=0;P0=0xf7;wela=0;delay(1);dula=0;P0=table[bai];dula=1;dula=0;P0=0xf7;wela=1;wela=0;delay(1);//******显示十位*******// dula=0;P0=table[shi];dula=1;dula=0;wela=0;P0=0xef;wela=1;wela=0;delay(1);//********显示个位******//dula=0;P0=table[ge];dula=1;dula=0;wela=0;P0=0xdf;wela=1;wela=0;delay(1);dula=0;P0=0;dula=1;dula=0;wela=0;P0=0xdf;wela=1;wela=0;delay(1);}void ADCHANGE(){wela=1; //重新打开有AD片选信号锁存器的锁存端P1=0xff; //读取P1口之前先给其写全1P0=0; //选通ADCSadrd=0; //AD读使能adval=P1;//AD数据读取赋给P1口 ADVAL1=P1;adval=adval*5*100/255; //将AD转换的数据再次转换为实际电压值 adrd=1; //5为参考电压P0=0xff; //关闭ADCSadwr=0;A1= adval/100;//A1~A3为实际电压值,A4~A6为AD转换后实际值 A2= adval%100/10;A3= adval%100%10;A4=ADVAL1/100;A5=ADVAL1%100/10;A6=ADVAL1%100%10;}//*************主函数***************//void main(){diola=1;P1=0xff;//关闭流水灯diola=0;P1=0;while(1){wela=1;P0=0; //选通ADCSadwr=0;//AD写入_nop_();adwr=1;P0=0xff; //关闭ADCSdelay(10);wela=0; //关闭有AD片选信号锁存器的锁存端以防止在操作数码管时使AD的片选发生变化ADCHANGE();for(a=20;a>0;a--){ display(A1,A2,A3);display1(A4,A5,A6);} //送去显示各位。