短学期实验报告(单片机系统设计)题目:专业:指导教师:学生姓名:学号:完成时间:成绩:基于单片机的交流电压表设计目录1系统的设计要求 (2)2系统的硬件要求 (2)2.1真有效值转换电路的分析 (2)2.2放大电路的设计 (3)2.3A/D转换电路的设计 (3)2.4单片机电路的分析 (4)2.5显示电路 (4)3 软件设计 (5)3.1 软件的总流程图 (5)3.2 初始化定义与定时器初始化流程图 (5)3.3 A/D转换流程图 (6)3.4 数据处理流程图 (6)3.5 数据显示流程图 (7)4 调试 (7)4.1 调试准备 (7)4.2 关键点调试 (7)4.3 测试结果 (8)4.4 误差分析 (8)5结束语 (8)5.1 总结 (9)5.2 展望 (9)附录1 总原理图 (10)附录2 程序 (10)附录3 实物图 (14)基于单片机的交流电压表设计****学院 ****专业 姓名指导老师:*******1 设计要求(1)运用单片机实现真有效值的检测和显示。
(2)数据采集使用中断方式,显示内容为有效值与峰值交替进行。
2 硬件设计本系统是完成一个真有效值的测量和显示,利用AD737将交流电转换成交流电压的有效值,用ADC0804实现模数转换,再通过单片机用数码管来显示。
系统原理框图如图2-1所示。
系统框图由真有效值转换电路、放大电路、A/D 转换电路、单片机电路、数码管显示电路五部分。
图2-1 原理框图2.1 真有效值转换电路真有效值转换电路主要是利用AD737芯片来实现真有效值直流变换的,即将输入的交流信号转换成直流信号的有效值,其原理图如图2-2所示。
图2-2 真有效值转换电路由于AD737最大输入电压为200mV, 所以需要接两个二极管来限制输入电压,起到限幅的作用。
如图中D1、D2,由IN4148构成,电容C6是耦合电容,电阻R1是限流电阻。
2.2 放大电路设计放大电路主要是利用运放uA741来进行放大,电路原理图如图2-3所示。
A/D 转换单片机 电路显示 电路转换 电路交流 信号放大 电路图2-3 放大电路原理图由于AD737可接受的信号有效值为0~200mV。
而ADC0804、单片机的电源电压都需要0~5V,因此需要一个放大电路,将AD737输出的200mV的电压提升至5V,所以放大电路的放大倍数最低需要25倍。
该放大电路采用集成芯片u A741,连接成一个同相比例运放,输入电阻采用3.3K,反馈电阻用100K的滑动变阻器,当滑动变阻器处于最大值时,放大倍数处于最大,为A Vf=(1+R3/R2)≈31.3。
放大倍数可以根据滑动变阻器的滑动而改变。
2.3 A/D转换电路A/D转换电路采用ADC0804实现,其原理图如图2-4所示。
图2-4 A/D转换电路原理图此电路考虑到做单片机系统时,需数据采集,而数据采集能通过I/O口扩展接口电路得到,但51单片机大多不带A/D转换器,所以模拟量的采集必须靠A/D实现。
所谓A/D转换就是将输入的模拟信号转换成数字信号输出。
改该电路采用ADC0804芯片,其最快转换时间为100us,时钟频率f=1/(C5*R9),可对0~5V之间的电压进行转换;输入基准电压为实际基准电压的1/2;若输入基准电压为 2.56V,其输入模拟电压为(DATA/256)*2,DATA为转换数字量。
转换结束信号输出到单片机外中断1,如图2-4所示。
/RD为外部读取转换结果的控制输出信号。
/RD为HI时,DB0~DB7为高阻抗;/RD为LO时,数据才输出。
/WR用来启动转换控制输入,相当于ADC转换开始(/CS=0时),当/WR由HI变为LO时,转换器被清除;当/WR为HI时开始转换。
CLK IN,CLK R:接振荡电路,振荡频率为1/(1.1RC),如图中R9、C6,ADC0804的最大输入电压为5V,提供基准电压。
根据ADC0804原输出转换值为0~255,R5、R11组成分压电路,为VREF理图,将输入模拟值转换成数字值后由P0口输出。
2.4 单片机电路单片机电路主要是单片机的最小系统,其原理图如图2-5所示。
图2-5 单片机电路原理图该部分电路主要由89S51、晶振和复位电路组成其原理图如2-6所示。
采用12M的晶振,机器周期为0.1us;上电复位;信号输入到外中断0,在中断中启动AD转换;AD转换结束标志作为外中断1的中断源,在中断1中读取数据并保存;P1口为数码管提供断码;P0.0~P0.7分别为AD的启动信号、AD的读取信号和数码管的扫描信号。
2.5 显示电路显示电路采用数码管来显示。
如图2-6所示。
图2-6 显示电路原理图该部分电路采用3位数码管来交替显示所测电压的有效值和峰值,同时数码管采用动态显示,每1ms 刷新一位,用3个8550的PNP 型三极管来片选。
图中smg0~smg7与单片机P0口相连接,三极管的集电极分别与共阳数码管9脚相连接,基极分别与单片机的P2.1~P2.3相连接。
3 软件设计3.1 总软件流程总软件流程图如图3-1所示:图3-1 总软件流程图3.2 初始化程序初始化程序主要是定义主程序中要用的变量和定时器的初始化。
变量定义如下: unchar dat; //AD 采样数据变量unchar tab[3]; //显示数据各个位存储数组 定时器初始化流程图如图3-2所示:图3-2 定时器初始化流程图3.3 AD 采样程序AD 采样主要是根据ADC0804的时序进行对外部数据的采用读取。
其中包括AD程序初始化定时AD 采样初始化中断更新AD 标志位1S 定时AD 有效值更新显示初始化时序和AD 数据读取程序。
AD 时序图3-3所示:图3-3 AD 时序图根据3-3图所示时序,写出AD 程序流程图,如图3-4所示开始结束AD 初始化延时1ms读取数据图3-4 AD 程序流程图3.4 数据处理程序对AD 采样的数据必须进行处理才能正常地显示。
首先的要把十六进制数的AD 值转换成十进制数,然后进行值处理,求出有效值,峰值,接着分别求出数据中的各个位上的数字,以便显示。
其程序流程图如图3-7所示。
图3-7 数据处理程序流程图3.5 数据显示程序数据显示主要是用数码管动态扫描的方法。
其程序流程图如土3-8所示入口返回送显示段码选择数码管1关闭数码管1送显示段码选择数码管2关闭数码管2送显示段码选择数码管3关闭数码管3图3-8 数据显示程序流程图4 调试4.1 调试准备调试所用到的仪器有万用表、直流稳压电源、示波器、信号发生器。
运用万用表来测量电阻、电压,直流稳压电源接正负Vs 和地,信号发生器产生信号,示波器显示输出波形和峰值。
4.2 关键点调试(1)、放大电路调试前要先进行调零,即将运放的2个输入端(同相输入端和反向输入端)对地短路,用万用表测输出电压,调节滑动变阻器R1,使输出电压为0,如果不进行调零,则会导致输出电压有偏差。
(2)、注意输入A/D的基准电压为1/2vef,同时最合适的基准电压为2.56V,以便计算时方便。
4.2.1 放大波形(1)、理论波形(2)、实际波形4.2.2 显示电路4.3 测试结果输入 Vpp 输入信号有效值测量值(有效值)1.04 3 4 4.68 0.3031.0621.4131.630.301.051.401.661.22.30 2.81 4 0.5201.141.362.090.5241.161.352.121.04 22.52 4.680.280.5630.771.330.270.5600.561.354.4 误差分析(1)放大电路的放大倍数会因输入电阻,反馈电阻与理论值有偏差而存在一定的误差,放大倍数过大会波形互失真;(2)当ADC0804的基准电压为2.56V时,其最小分辨率为20mv,因此测量值会有±20mv 的偏差;(3)输入信号存在干扰和波动;(4)偏置电压引起的误差。
5 结束语5.1 总结通过本次短学期的实验,使我对很多芯片有了一定的了解和巩固,对它们的功能有了一定的熟悉和掌握。
如AD737,该芯片可以用来将交流电转换成真有效值的直流电,如ADC0804芯片可实现数模转换,同时对真有效值的转换、放大等电路的设计有了进一步的理解和掌握。
在电路设计中必须注意电路中各元件值的选择会影响电路最终的结果。
当在设计放大电路时,输入电阻、反馈电阻的不同就会使放大倍数有所不同,根据题目要求和芯片的资料,必须保证最低放大倍数25,因此如放大倍数太小则不能满足要求,而太大则会导致输出波形的失真。
因此,要合理选择各元件的值。
在电路调试时,应该分模块进行调试,及时发现问题解决问题,等所有模块都调试成功再进行总体的调试。
最后要根据自己所测的结果,进行分析,尤其对测试出的结果与理论结果进行比较,是否有误差,并分析形成误差的原因,如何减少误差。
5.2 展望虽然该电路已经基本能实现对真有效值的测量和显示,但测量结果还存在着较大的误差,电路设计还有待于进一步的完善,各部分电路的稳定性也有待于进一步的提高,希望通过更进一步的研究和学习,实现用更少的元件,设计出更加合理、更高效的电路。
附录:1 总原理图2 程序清单主程序模块#include<reg51.h>#include<math.h>#include"adc0804.h"#include"smgdis.h"#define unchar unsigned char#define unint unsigned intunchar count=0;unchar ID=0; //任务ID,时间片分配ID#define a 0.5static unchar y;static time_init(){TMOD=0x01;/*定时器T0方式1(16位计数器)*//*公式为:x=65536-fosc/12*t 65536-50000=15536其中x为定时初值,fosc为晶振频率,t为定时时间*/ TH0=15536/256; /*定时器高位*/TL0=15536%256; /*定时器低位,定时时间为50ms ,20次为1s */ ET0=1;/*允许定时器T0中断*/TR0=1;/*开定时器T0*/EA=1;/*开总中断*/}void main(){unchar dat;unchar tab[3];time_init();while(1){dat=get_adc_value();value_done(dat,tab,ID);led_display(tab[0],tab[1],tab[2]);}}void timer0() interrupt 1{TR0=0;TH0=15536/256;TL0=15536%256; /*重装初值*/count++; /*计数,累加中断次数*/if(count==20) /*判断是否到10次,即0.5s*/{count=0;ID++; /*转换下一个显示*/if(ID==3) ID=0;}TR0=1;}A/D转换模块:(头文件)#ifndef __ADC0804_H__#define __ADC0804_H__#ifndef unchar#define unchar unsigned char#endif#ifndef unint#define unint unsigned int#endif#define adc_databus P1 //the databus of ADCsbit cs_adc=P2^0; //to choose the chip ADC0804 sbit wr=P3^6; //wr# signalsbit rd=P3^7; //rd# signalvoid value_done(unint tvdata,unchar led[],unchar ID) {unint temp;//temp=(unint)(tvdata*1.0/255*500);temp=(unint)(tvdata*2);switch(ID){case 0: //有效值break;case 1: //峰值temp*=sqrt(2);break;default: //其他情况break;}led[0]=(temp/100)%10;//最高位led[1]=(temp/10)%10;led[2]=temp%10; //最低位if(led[0]>10||led[0]<0) led[0]=11;if(led[1]>10||led[1]<0) led[0]=11;if(led[2]>10||led[2]<0) led[0]=11;}unchar get_adc_value(void){unchar k;unint tvdata;//----adc0804 start----//cs_adc=0; k=k; //nopwr=0; k=k;wr=1; k=k;cs_adc=1; k=k;k=k;k=k;//----read value of adc0804----//adc_databus=0xff;cs_adc=0; k=k;rd=0; k=k;tvdata=adc_databus;rd=1; k=k;cs_adc=1; k=k;return tvdata;}#endif显示模块(头文件)#ifndef __SMGDIS_H__#define __SMGDIS_H__#ifndef unchar#define unchar unsigned char#endif#ifndef unint#define unint unsigned int#endif/*全局变量定义*/#define DataBus P0 //数据口定义sbit c0=P2^1; //数码管0控制脚sbit c1=P2^2; //数码管1控制脚sbit c2=P2^3; //数码管2控制脚void delay(void){unchar i;unchar t=1;while(t--)for(i=0;i<125;i++);}void led_display(unchar a,unchar b,unchar c){/*共阳数码管数字码0~9+全暗码*/Unchar code tab0[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x86};DataBus=(tab0[a]&0x7f);/*送显示码,由a控制*/c0=0; /*选通数码管0*/delay();DataBus=0xff;c0=1;DataBus=tab0[b];/*送显示码,由b控制*/c1=0; /*选通数码管1*/delay();DataBus=0xff;c1=1;DataBus=tab0[c];/*送显示码,由c控制*/c2=0; /*选通数码管2*/delay();DataBus=0xff;c2=1;}#endif3 实物图。