《单片机系统设计》实验报告.docx
《《单片机系统设计》实验报告.docx》由会员分享,可在线阅读,更多相关《《单片机系统设计》实验报告.docx(19页珍藏版)》请在冰豆网上搜索。
《单片机系统设计》实验报告
短学期实验报告
(单片机系统设计)
题目:
专业:
指导教师:
学生姓名:
学号:
完成时间:
成绩:
基于单片机的交流电压表设计
1系统的设计要求⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯2
2系统的硬件要求⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯2
2.1真有效值转换电路的分析⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯2
2.2放大电路的设计⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯3
2.3A/D转换电路的设计⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯3
2.4单片机电路的分析⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯4
2.5显示电路⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯43软件设计⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯5
3.1软件的总流程图⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯5
3.2初始化定义与定时器初始化流程图⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯5
3.3A/D转换流程图⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯6
3.4数据处理流程图⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯6
3.5数据显示流程图⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯74调试⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯7
4.1调试准备⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯7
4.2关键点调试⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯7
4.3测试结果⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯8
4.4误差分析⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯85结束语⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯8
5.1总结⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯95.2展望⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯9附录1总原理图⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯10附录2程序⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯10附录3实物图⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯14
基于单片机的交流电压表设计
指导老师:
1设计要求
1)运用单片机实现真有效值的检测和显示。
2)数据采集使用中断方式,显示内容为有效值与峰值交替进行。
2硬件设计
本系统是完成一个真有效值的测量和显示,利用AD737将交流电转换成交流电压的有效值,用ADC0804实现模数转换,再通过单片机用数码管来显示。
系统原理框图如图2-1所示。
系统框图由真有效值转换电路、放大电路、A/D转换电路、单片机电路、数码管显示电路五部分。
交流
转换
放大
A/D
单片机
显示
信号
电路
电路
转换
电路
电路
图2-1原理框图
2.1真有效值转换电路真有效值转换电路主要是利用AD737芯片来实现真有效值直流变换的,即将输入的交流信号转换成直流信号的有效值,其原理图如图2-2所示。
图2-2真有效值转换电路
由于AD737最大输入电压为200mV,所以需要接两个二极管来限制输入电压,起到限幅的作用。
如图中D1、D2,由IN4148构成,电容C6是耦合电容,电阻R1是限流电阻。
2.2放大电路设计
放大电路主要是利用运放uA741来进行放大,电路原理图如图2-3所示
图2-3放大电路原理图
由于AD737可接受的信号有效值为0~200mV。
而ADC0804、单片机的电源电压都需要0~5V,因此需要一个放大电路,将AD737输出的200mV的电压提升至5V,所以放大电路的放大倍数最低需要25倍。
该放大电路采用集成芯片uA741,连接成一个同相比例运放,输入电阻采用3.3K,反馈电阻用100K的滑动变阻器,当滑动变阻器处于最大值时,放大倍数处于最大,为AVf=(1+R3/R2)≈31.3。
放大倍数可以根据滑动变阻器的滑动而改变。
2.3A/D转换电路
A/D转换电路采用ADC0804实现,其原理图如图2-4所示
图2-4A/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时开始转换。
CLKIN,CLKR:
接振荡电路,振荡频率为1/(1.1RC),如图中R9、C6,ADC0804的最大输入电压为5V,输出转换值为0~255,R5、R11组成分压电路,为VREF提供基准电压。
根据ADC0804原理图,将输入模拟值转换成数字值后由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
该部分电路采用3位数码管来交替显示所测电压的有效值和峰值,同时数码管采用动态显示,每1ms刷新一位,用3个8550的PNP型三极管来片选。
图中smg0~smg7与单片机P0口相连接,三极管的集电极分别与共阳数码管9脚相连接,基极分别与单片机的P2.1~P2.3相连接。
3软件设计
3.1总软件流程总软件流程图如图3-1所示:
图3-1总软件流程图
3.2初始化程序初始化程序主要是定义主程序中要用的变量和定时器的初始化。
变量定义如下:
unchardat;//AD采样数据变量
unchartab[3];//显示数据各个位存储数组
定时器初始化流程图如图3-2所示:
图3-2定时器初始化流程图
3.3AD采样程序
AD采样主要是根据ADC0804的时序进行对外部数据的采用读取。
其中包括AD
初始化时序和AD数据读取程序。
AD时序图3-3所示:
图3-3AD时序图
根据3-3图所示时序,写出AD程序流程图,如图3-4所示
图3-4AD程序流程图
3.4数据处理程序
AD
对AD采样的数据必须进行处理才能正常地显示。
首先的要把十六进制数的值转换成十进制数,然后进行值处理,求出有效值,峰值,接着分别求出数据中的各个位上的数字,以便显示。
其程序流程图如图3-7所示。
图3-7数据处理程序流程图
3.5数据显示程序数据显示主要是用数码管动态扫描的方法。
其程序流程图如土3-8所示
图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测试结果
4.4误差分析
(1)放大电路的放大倍数会因输入电阻,反馈电阻与理论值有偏差而存在一定的误差,放大倍数过大会波形互失真;
(2)当ADC0804的基准电压为2.56V时,其最小分辨率为20mv,因此测量值会有±20mv的偏差;
(3)输入信号存在干扰和波动;
(4)偏置电压引起的误差。
5结束语
5.1总结通过本次短学期的实验,使我对很多芯片有了一定的了解和巩固,对它们的功能有了一定的熟悉和掌握。
如AD737,该芯片可以用来将交流电转换成真有效值的直流电,如ADC0804芯片可实现数模转换,同时对真有效值的转换、放大等电路的设计有了进一步的理解和掌握。
在电路设计中必须注意电路中各元件值的选择会影响电路最终的结果。
当在设计放大电路时,输入电阻、反馈电阻的不同就会使放大倍数有所不同,根据题目要求和芯片的资料,必须保证最低放大倍数25,因此如放大倍数太小则不能满足要求,而太大则会导致输出波形的失真。
因此,要合理选择各元件的值。
在电路调试时,应该分模块进行调试,及时发现问题解决问题,等所有模块都调试成功再进行总体的调试。
最后要根据自己所测的结果,进行分析,尤其对测试出的结果与理论结果进行比较,是否有误差,并分析形成误差的原因,如何减少误差。
5.2展望虽然该电路已经基本能实现对真有效值的测量和显示,但测量结果还存在着较大的误差,电路设计还有待于进一步的完善,各部分电路的稳定性也有待于进一步的提高,希望通过更进一步的研究和学习,实现用更少的元件,设计出更加合理、更高效的电路。
附录:
1总原理图
2程序清单
主程序模块#include#include#include"adc0804.h"#include"smgdis.h"
#defineuncharunsignedchar
#defineunintunsignedintuncharcount=0;
10
uncharID=0;//任务ID,时间片分配ID
#definea0.5staticunchary;
statictime_init()
{
TMOD=0x01;/*定时器T0方式1(16位计数器)*/
/*公式为:
x=65536-fosc/12*t65536-50000=15536其中x为定时初值,fosc为晶振频率,t为定时时间*/
TH0=15536/256;/*定时器高位*/
TL0=15536%256;/*定时器低位,定时时间为50ms,20次为1s*/
ET0=1;/*允许定时器T0中断*/
TR0=1;/*开定时器T0*/
EA=1;/*开总中断*/
}
voidmain()
{
unchardat;
unchartab[3];
time_init();
while
(1)
{
dat=get_adc_value();
value_done(dat,tab,ID);
led_display(tab[0],tab[1],tab[2]);
}
}
voidtimer0()interrupt1
{
TR0=0;
TH0=15536/256;
TL0=15536%256;/*重装初值*/count++;/*计数,累加中断次数*/if(count==20)/*判断是否到10次,即0.5s*/
{
count=0;
ID++;/*转换下一个显示*/if(ID==3)ID=0;
11
TR0=1;
}
A/D转换模块:
(头文件)#ifndef__ADC0804_H__#define__ADC0804_H__#ifndefunchar
#defineuncharunsignedchar
#endif
#ifndefunint
#defineunintunsignedint
#endif#defineadc_databusP1//thedatabusofADC
sbitcs_adc=P2^0;
sbitwr=P3^6;
sbitrd=P3^7;
//tochoosethechipADC0804//wr#signal
//rd#signalvoidvalue_done(uninttvdata,uncharled[],uncharID)
uninttemp;
//temp=(unint)(tvdata*1.0/255*500);
temp=(unint)(tvdata*2);
switch(ID)
{
case0:
//有效值
break;
case1:
//峰值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;
12uncharget_adc_value(void)
{
unchark;
uninttvdata;
//adc0804start//
cs_adc=0;k=k;//nopwr=0;k=k;wr=1;k=k;
cs_adc=1;k=k;k=k;k=k;
//readvalueofadc0804//
adc_databus=0xff;
cs_adc=0;k=k;
rd=0;k=k;tvdata=adc_databus;
rd=1;k=k;
cs_adc=1;k=k;
returntvdata;
}
#endif显示模块(头文件)#ifndef__SMGDIS_H__#define__SMGDIS_H__#ifndefunchar#defineuncharunsignedchar#endif
#ifndefunint
#defineunintunsignedint
#endif
/*全局变量定义*/
#defineDataBusP0//数据口定义sbitc0=P2^1;//数码管0控制脚sbitc1=P2^2;//数码管1控制脚sbitc2=P2^3;//数码管2控制脚voiddelay(void)
{
unchari;unchart=1;while(t--)
13for(i=0;i<125;i++);
}
voidled_display(unchara,uncharb,uncharc)
{
/*共阳数码管数字码0~9+全暗码*/
Uncharcodetab0[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;
}
#endif
3实物图
14