STC单片机实验报告.docx
《STC单片机实验报告.docx》由会员分享,可在线阅读,更多相关《STC单片机实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
![STC单片机实验报告.docx](https://file1.bdocx.com/fileroot1/2023-2/9/85ade9af-dfb9-45d4-aa38-f2f068695ae3/85ade9af-dfb9-45d4-aa38-f2f068695ae31.gif)
STC单片机实验报告
接口实验报告
题目:
基于单片机的电压采集系统设计
院(系):
电子工程与自动化学院
专业:
仪器仪表工程
学生姓名:
王明飞
学号:
指导老师:
李智
职称:
教授
2011年7月10日
一实验目的
本实验的功能是利用单片机控制AD7862实现模拟的电压的采集,同时利用串口与PC机进行通信对数据进行处理并显示结果。
通过应用AltiumDesigner6软件掌握电路板的原理图绘制及PCB板的生成,通过KeiluVision2软件编写并调试单片机的下位机程序,利用MicrosoftVisualC++6.0编写上位机界面以显示数据处理结果。
二电路的硬件电路设计
1、原理框图
实验原理结构框图如图1。
首先模拟电压信号经过AD7862进行模数转换,单片机按AD7862的时序读取转换结果,然后转换结果送入数据缓冲区通过串口线传送送到PC机,在PC机对接受到的数据进行处理,最终电压数值可以在上位机界面上显示。
图1系统设计原理结构框图
2、AD7862简介
AD7862是AD公司推出的12位AD转换芯片,具有以下主要特点:
a)4通道模拟输入,2路同时转换;
b)4µs转换时间,250ksps采样速率;
C)选择模拟量输入范围:
±1OV(AD7862—10);
d)高速12位并行总线输出;
e)内部提供+2.5V参考电压或者由外部提供参考电压:
f)单一电源+5V
图2AD7862的引脚图
图3AD7862采样读取典型工作时序
图3是其典型的转换时序图。
AD7862通过多路选择控制信号A0可以对输入模拟通道进行选择。
当A0=0时,AD7862将对A组两路信号VA1、VA2同时进行模数转换;当A0=1时,对B组两路信号VB1、VB2同时转换。
结合CS和RD信号,AD7862可以有不同的输入和读取模式。
在C0NVST下降沿脉冲下,跟踪/保持器同时保持两路输入信号,并且开始对2路信号同时进行模数转换,这时,BUSY脚电平抬高表示正在进行转换。
在经历4µs以后,转换完成,BUSY脚电平变低,数据存放在输出锁存器中。
在CS信号选通条件下,向RD引脚提供连续脉冲,就可以访问转换结果。
根据信号A0是低或高电平,模数转换后,第一个读脉冲将读取转换结果VAl或VB1,第二个读操作将读取转换结果VA2或VB2。
数据结果将通过12位数据总线一次读出。
AD7862可以使用内部或外部参考电压。
在参考电压VREF端用0.1uf钽电容接至模拟信号地AGND端,AD7862内部将产生+2.5V的参考电压,模拟量输入范围:
±1OV。
3、INA129简介
1)INA129是TI公司推出的仪器放大器芯片,通过改变1端与8端之间的电阻值来改变放大器的增益,具有以下主要特点:
a)低偏置电压最大50μV
b)低温度漂移
c)低输入偏置电流最大5nA
d)高共模抵制CMR最小120dB
e)输入保护至±40V
f)宽电源电压范围±2.25至±18V
2)方框图如下
图4INA129的结构框图
4、电路硬件设计原理图
根据实验要求设计了如下所示的电路原理图。
单片机采用型号为STC89c52。
选用STC系列单片机的好处是,该单片机可以利用STC-ISPV391这个软件通过串口直接向单片机下载程序,而不需要其他的外围电路,使用起来很方便。
如图5所示电路电源为系统中各芯片提供5v的电压。
其中在电源和地之间并联了0.1µF和10µF两个电容,其作用是分别滤除电源的高频与低频杂波,以提供比较稳定的电压。
如图6所示为单片机的复位及晶振电路,复位方式采用上电复位方式,采用晶振频率大小为11.0592MHz。
图5供电电路
图6单片机复位及晶振电路
如图7所示为AD7862引脚连接电路。
其中AD7862芯片的CONVST引脚与单片机P3.4脚相连,CS引脚与单片机P3.5脚相连,RD引脚与单片机P3.6引脚相连,BUSY引脚与单片
机P3.7脚既外部中断INT0相连。
图7AD7862引脚连接电路
如图8所示为单片机各引脚连接电路。
其中单片机P0.4~P0.7与AD7862的D8~D11相连,用于获取模拟信号转换结果的高四位;P2.0~P2.7与AD7862的D0~D7相连,用于获取模拟信号转换结果的低八位。
图8单片机连接电路图9RS232串行接口电路
在PC机和单片机的串口通信电路中加入了电平转换电路MAX232芯片。
这种芯片可以实现TTL电平和RS-232C电平之间的转换。
采用MAX232接口的硬件接口电路如图9所示。
RS-232逻辑电0电平规定为+5~+15V之间,逻辑1电平为-5~-15V之间,传输速率达到20Kb/s,最大传输距离为15m。
三、系统上位机软件设计
系统上位机设计采用软件为VC++,其设计操作界面如图10所示。
图10基于单片机的电压采集系统上位机控制界面
上位机功能介绍:
(1)通信端口设置。
其中端口号下拉框可供选择有COM1、COM2、COM3、COM4等四个端口。
打开串口与关闭串口按钮控件分别对应其功能。
通信参数设置信息提示编辑框用来显示当前的端口打开或关闭串口的状态,当前选择的端口号以及通信的参数设值。
例如“当前通信端口设置为COM1串口已打开通信参数为19200,n,8,1”。
(2)数据的处理。
对数据的处理,程序设计中是在接收到到100个数据的时候触发OnComm接收事件。
因为AD采集的数据一个电压点为12位的,下位机向上位机传送数据的时候分为高四位和低八位,即接受到100个数据相当于采集到的50个电压点。
对应的数据处理代码如下:
ConstintNum=50;
doubledata[Num]={0};
intCONT=0;
intReceiveData[100];
intResultData[50];
//数据的处理过程
case2:
//comEvReceiv事件,有数据到达
{VARIANTvariant_inp;
COleSafeArraysafearray_inp;
LONGlen,k;
BYTErxdata[1500];//设置BYTE数组An8-bitintegerthatisnotsigned.
variant_inp=m_MSCOMM1.GetInput();//读缓冲区
safearray_inp=variant_inp;//VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize();//得到有效数据长度
for(k=0;k{
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
}
for(CONT=0;CONT{
if(CONT==0)
m_max1=m_min1=result;
if((rxdata[2*CONT]&0x0f)==0x0f)//判断标志位,高四位
{rxdata[2*CONT]=rxdata[2*CONT]>>4;
ReceiveData[2*CONT]=rxdata[2*CONT];//高四位
ReceiveData[2*CONT+1]=rxdata[2*CONT+1];//低8位
ResultData[CONT]=ReceiveData[2*CONT]*256+ReceiveData[2*CONT+1];
if(ResultData[CONT]>0x0800)
{
ResultData[CONT]=ResultData[CONT]-4096;
}
data[CONT]=float(ResultData[CONT])*20/4096;
if(temp==1)
{data[CONT]=data[CONT]/20.036;
result=data[CONT];}//20是放大倍数}
elseif(temp==2)
result=data[CONT];
m_result=result;
if(result>m_max1)
{
m_max1=(float)result;
}
elseif(result{
m_min1=(float)result;
}
m_pp=m_max1-m_min1;
UpdateData(FALSE);
}
}UpdateData(FALSE);
}}}
(3)通道选择设置。
图10所示设置了“VA”,“VB”,2个通道选择按钮。
当按下通道选择按钮时,上位机会发送一个已经定义的数据给下位机,当下位机接收到数据后会判断接收到的数据,并根据接收到的数据选择相应的AD转换通道进行数据转换并将数据传送给上位机。
例如:
当按下“VA”按钮时,上位机会发送数据0X01给下位机,下位机接收到数据后,判断为0X01将选择转换通道VA,并将VA通道转换后的数据传送给上位机进行数据处理,然后界面中图形和电压显示控件将显示VA通道的电压。
其对应代码如下:
voidCMyDlg:
:
OnVa()
{
if(m_MSCOMM1.GetPortOpen())
{
CStringVA;
VA=0x01;
temp=1;
flag=1;
UpdateData(FALSE);//把变量的值传递给控件。
m_MSCOMM1.SetOutput(COleVariant(VA));
}
UpdateData(FALSE);
}
采样频率的选择设定也是通过类似的方式实现的,例如:
当选择5KHZ时,上位机会发送数据0X10给下位机。
(4)电压波形的显示。
图10右上角部位为图形显示区域,显示电压的范围为+10V~-10V。
“开始显示”与“停止显示”两按钮用于控制波形的显示与停止。
其中开始显示中参数设置为SetTimer(1,200,NULL);其中用于绘制波形的主要代码对应如下:
CClientDCmydc(this);//利用DC绘图
COLORREFcolor=mydc.GetBkColor();
CRectrect(200,20,760,320);//矩形
CBrushbkBrush(RGB(150,150,150));//灰色画刷
mydc.SetBkColor(color);//背景色
mydc.FillRect(rect,&bkBrush);//显示填充区域的矩形
mydc.SelectObject(&bkBrush);
intnwidth=rect.Width();//ThewidthofCRect.560
intnheigh=rect.Height();//300
CPenpen1(PS_DASH,1,RGB(0,0,255));//蓝色画笔
CPointaPoint[Num];
for(inti=0;i{aPoint[i].x=(((i)*nwidth*flag1))/Num+200;//flag1变快、变慢
aPoint[i].y=(nheigh/2)-((nheigh*flag/2)*(data[i]))/10+20+sy+xy;//flag幅度大小
}
mydc.Polyline(aPoint,Num);//利用折线近似曲线
(5)频率的计算。
主要思想是:
先设一阀值(本例采用0.001V)将正弦波变化为方波,在检测上升沿的个数,当个数大于2个时,计算间隔的点数后换算成频率。
主要代码如下:
for(CONT=0;CONT{if(data[CONT]>0.001)
data1[CONT]=255;
else
data1[CONT]=0;
}
UINTcounter=0;//上升沿的个数
UINTdata2[150]={0};//上升沿位置
floatpp=0;
for(CONT=0;CONT{UINTtemp0=data1[CONT];
UINTtemp1=data1[CONT+1];
if(temp0==0&&temp1==255)
{
data2[counter]=CONT;
counter++;
}}
pp=(float)(data2[counter-1]-data2[0])/(counter-1);
m_ff=(float)(10000/(pp*fsele));//fsels是以0.1ms为基准的倍数,pp是0-50的一个数,计算公式1(点)/0.1ms=pp/x;解得x后倒数就是频率
四、系统下位机软件设计
下位机的程序流程图如下:
图11下位机程序流程图
下位机程序主要实现代码如下:
#defineN100
sbitbusy=P3^2;//低电平表示读完,高电平硬件至高,初始应软件至低
sbitcs=P3^6;//选择位
sbitrd=P3^7;//低电平开始读
sbita0=P0^3;//AB选择位就是a0
sbitct=P3^4;//启动转换位
intdataw=0;
uchardatal[N];
uchari_receive=0x02;
uchardatag4,datad8;
voidinit_serialcom(void)
{
SCON=0x50;//UART为模式1,8位数据,允许接收
TMOD|=0x22;//定时器1/0为模式2,8位自动重装
PCON|=0x80;//SMOD=1;
TH1=0xFD;//Baud:
19200fosc="11".0592MHz
IE|=0x92;//EnableSerialInterrupt
TR1=1;//timer1run
}
//向串口发送一个字符(十六进制)函数不是ASCII码
voidsend_uart(unsignedcharch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
//串口接收中断函数
voidserial()interrupt4using3
{if(RI)
{RI=0;
i_receive=SBUF;
}}
//AD7862初始化
voidad7862_init(void)
{
ct=1;//关闭转换
a0=1;//选择VA1通道
cs=1;//关闭单片机
rd=1;//读关闭
}
voidad()interrupt1
{
m=m+1;
}
/***************************/
voidmain(void)
{inti=0,k=0;
init_serialcom();//初始化串口
ad7862_init();
cs=0;
while
(1)
{//小量程0-0.5V,VA通道
if(i_receive==0x01)
{a0=0;
}
//满量程0-10V,VB通道
elseif(i_receive==0x02)
{
a0=1;
}
/*5KHZ,最小100HZ波,0.2ms,方式2*/
elseif(i_receive==0x10)/
{TH0=0X47;
TL0=0X47;
for(k=0;k{
TR0=1;
m=0;
ct=0;//开启转换
ct=1;//关闭转换
rd=0;//读数据
datal[k+1]=P2;//读低八位
datal[k]=P0|0x0f;//读高四位(P0|0x0f)>>4;
while(m==0);
}
TR0=0;
for(i=0;isend_uart(datal[i]);
}......
}}
五、实验结果与误差分析
1)实验结果
如图11采集信号幅度大小为2V,频率为2.6KHz的正弦波,AD7862输入通道为VB。
图12采集电压2.6KHz的正弦波
如图13采集信号幅度大小为2V,频率为10Hz的正弦波,AD7862输入通道为VB。
图13采集电压10Hz的正弦波
如图14采集信号幅度大小为0.2v,频率为2.6KHz的正弦波,AD7862输入通道为VA。
图14采集电压800Hz的正弦波
如图15采集信号幅度大小为0.2v,频率为10Hz的正弦波,AD7862输入通道为VA。
图15采集电压10Hz的正弦波
2)误差分析
1、幅度误差:
为了将时间连续、幅值连续的模拟量转化为时间离散、幅值离散的数字信号,A/D转换一般要经过采样保持、量化和编码三个过程。
将采样电路每次取得的模拟信号转换为数字信号需要一定的时间,为了给量化和编码过程提供一个稳定值,每次取得的模拟信号必须经过保持电路保持一段时间。
在量化过程中,由于采样电压不一定被量化单位整除,所以量化前后不可避免的出现误差,称为量化误差。
量化误差属于原理误差,是不可避免的。
A/D转换器的位数越多,量化误差越小,分辨率也越高。
对于AD7862来说,输出位数为12位,输入信号范围为-10V到+10V,则AD7862能区分的输入信号的最小电压为:
20V/4096=4.883mV。
所以其最大转换误差为2.4415mV,因此实验中得到的测量绝对误差应低于这个值。
测小电压时,转换误差可通过INA128放大后,再除以放大倍数(20)来变小,此时理论上最大转换误差0.122mV。
然而在实验过程中,检测到的误差要高于这个值,产生误差的主要因素:
电源直流5V电压的纹波比较大,幅值很不稳定。
在电路板的电源接口部分应加上滤波电容,以减少电源波动对电路的影响。
2、频率误差:
在计算频率的算法中,因为CONT是整数,所以变量pp必是1-50中间的一个整数,但实际的波形过Y轴零点时,不一定在1-50的整数刻度上,所以可能的最大相对误差为4%。
六、实验总结及体会
做接口实验就是一个学习提高自己知识应用的过程,下面是我在本次实验过程中遇到的一些问题以及自己的一些总结体会。
(1)AltiumDesigner6是电路设计应用软件,用于生成PCB板。
首先接口实验能否按要求完成相应的功能,电路原理图的设计正确与否是其前提。
电路元器件库里面,并没有所需要的元件,这就需要自己来画该元器件的原理图以及其封装。
画元器件原理图和封装可以根据所给的元器件资料来完成,其相应的管脚定义应该正确。
原理图的封装必须与封装库内对应的封装器件相对应,否则就会出错,无法生成PCB。
在PCB图中,一个很重要的参数设置是焊盘的大小,如果设置太小在打孔焊接的过程中将有可能使焊盘上的铜层弄掉,是焊接困难。
在本实验设计中焊盘大小内径设置为0.85mm,外径除特殊的焊盘一般设置为2.37mm。
由于原来没有用过串口,所以开始的时候串口没有分清公口与母口,封装与购买的器件没有对应起来造成了错误。
焊接元器件完成后,首先测试串口是否正常工作。
如果没有正常工作的话,查找电路的错误,我是按从串口再到单片机的这一顺序查找的。
发现单片机的一引脚连接错误,导致串口无法正常工作,经过修改串口可以正常工作了。
(2)KeiluVision2是下位机的设计软件。
在检查电路板没有错误,正常工作后,接下来我进行的是下位机的设计。
这时候因为没有做上位机,我是利用串口调试助手V2.2这一个软件来观察从下位机所发送到的数据。
下位机在设计中首先进行的是串口初始化,其步骤是首先确定串口工作模式,然后确定定时器初值,再启动定时器。
然后根据AD7862的工作时序编写相应的程序。
利用STC-ISPV391下载软件可以将编译生成的HEX文件通过串口烧录到单片机内,然后观察串口调试助手接收到的数据是否正确。
(3)MicrosoftVisualC++6.0是上位机的设计软件。
上位机是负责与下位机进行通信,并显示实验数据结果的。
首先规划好整体的功能,以及所需要的控件,然后按循序渐进的方法进行设计。
首先,设计通信端口的设置,在一部分调试通过后。
然后加一个数据显示的编辑框进行数据的处理部分的编写。
数据显示完成后进行的是波形显示部分以及相关的控件的编写。
(4)在上位机与下位机编写完成后,接下来进行的是联合调试,以观察具体的实验结果。
调试过程中,由于上位机设计有很多不足,所以当下位机发送数据很快的时候,上位机就会出现错误,造成死机现象,而且上位机显示波形频率比较低,较高频率时就会失真。
主要的瓶颈在与通信的波特率。
通过对下位机程序的不断改进,调试,最终实现频率为最大可达1K的实验结果。
在完成这次课程设计及论文的过程中,通过绘制电路原理图及PCB的制作,学习了AltiumDesigner6的相关知识和应用,提高了对AltiumDesigner6电路板设计软件的熟练。
制作电路板的整个设计过程,提高了理论水平和实际的动手能力;在调试过程中,通过对相关软件的应用提高了分析问题和解决问题的能力。
七、谢辞
在设计电路、编写程序以及制作调试电路板的过程中,都遇到了很多困难和问题,同学的耐心讲解,给了我很大的帮助。
所以此次能顺利完成这次的课程设计,要感谢所有帮助过我的同学和老师。
八、参考文献
[1]何立民.单片机应用系统设计.北京:
北京航空航天大学出版社,2004.
[2]张洪润等.单片机应用设计200例.北京:
北京航空航天大学出版社,2006.
[3]谭思良等.VisualC++串口通信工程开发实例导航[M].北京.人民邮电出版社.2003
[4]李现勇.VisualC++VisualBasic串并口开发技术工程应用实例导航.北京:
人民邮电出版社,2006
[5]雷晓平等.单片计算机及其应用.成都:
电子科技大学出版社,2005.