proteus课程设计基于单片机的数据采集.docx
《proteus课程设计基于单片机的数据采集.docx》由会员分享,可在线阅读,更多相关《proteus课程设计基于单片机的数据采集.docx(15页珍藏版)》请在冰豆网上搜索。
proteus课程设计基于单片机的数据采集
电子设计应用软件训练总结报告
一.任务说明
(一)设计利用51单片机设计一个数据采集系统,用3位数码管显示输入的电压:
1设计中自行定义电路图纸尺寸。
2按照设计任务在Proteus6Professional中绘制电路原理图。
3根据设计任务的要务求编写程序,画出程序流程图,并在Proteus下进行仿真,实现相应的功能。
(二)完成设计任务后应具备的能力:
1熟练掌握Proteus软件的使用。
2按照设计要求绘制电路原理图。
3能够按要求对所设计的电路进行仿真。
二.原理图绘制说明
电路原理图的设计与绘制是整个电路设计的基础,电路原理图的设计与绘制的流程,包括设置电路图纸、放置元器件、调整元器件的布局、放置导线等步骤。
打开PROTEUS软件,在原理图编辑窗口绘制电路图。
在该界面环境下,还有预览窗口和元件列表区。
编辑窗口用于放置元器件,进行连线,绘制原理图。
预览窗口可以显示全部原理图。
左侧工具箱中,还有供使用的工具。
首先要建立设计文件,选择合适的模板,并保存在预先建立好的文件夹中。
选择图纸,本次设计应用的是A4图纸,然后即开始进行电路原理图的绘制了。
利用软件的搜索功能在元件库中找到需要的元件,放置到图纸的合适位置,并分别设置好各个元器件的参数,再在需要的位置放置图形文本框,最后将各个元器件连接起来,这样原理图就绘制完成了。
然后对所绘制的电路原理图进行检查,如有错误就要作进一步的调整与修改,以保证原理图准确无误。
并在绘制原理图结束后,保存原理图文件
同时,按照设计任务的要求必须首先在Proteus6Professional中绘制电路原理图。
随后,要根据设计任务的要求编写程序,并在Proteus下进行仿真,实现相应功能。
在Proteus6Professional中点击“Library”->“PickDevices”可以在弹出的对话框中填写需要的元器件名称,通过这种方式,就可以找到并放置相应的器件了。
我们可以看到器件的一些基本信息,如管脚数目和PCB图形样式等。
根据设计任务的要求,电路原理图主要应包含数据采集电路,AD(模数)转换电路,数据显示电路三个部分。
下面分三个部分对原理图的绘制进行说明。
(一)数据采集电路
根据任务的要求,该部分电路需要对八路数据进行采集,然后输出到下一级电路,在这里,用八个显示不同电压值的电压源来构成,其输出端对应连接到AD转换电路的输入端即可。
(二)AD(模数)转换电路
根据任务的要求,本部分电路需要把数据采集电路采集到的模拟电压量转换成数字电压量,所以在这里选用一个ADC0808芯片作为AD转换电路,本部分电路需把转换之后的数字量输出到数据显示电路即可。
ADC0808是一个有8路输入的AD转换器,可以根据需要来选择使用的输入通道个数,用ABC三个端口可以控制通道的选择,这里因为需要对八路数据进行采集转换,所以,这里需要使用ADC0808所有的输入通道,通道0到7分别和电压源0到7进行连接。
转换启动信号START和地址所存信号ALE都是用51单片机的P2.7和P3.6口通过与非门后的输出来控制,允许输出信号OE由P2.7口和P3.7口通过与非门后的输出控制,通道选择端控制端ABC分别用单片机的P0.0,P0.1和P0.2三个端口来控制。
转换结果输出端(OUT0到OUT7)通过总线分别与51单片机的P0.7到P0.0口连接。
具体连接方式如图1所示:
图1AD转换电路的连接方式
(三)数据显示电路
本部分电路主要由AT89C51单片机和一个四位一体的共阴极的数码管以及电阻构成。
其中,前三个数码管用来显示采集到的电压值,后一个数码管用来显示采集数据来自哪路通道。
51单片机的P3.0,P3.1,P3.2,P3.3口分别用来控制数码管的开启和关闭,P2.0到P0.6以及P3.5分别与数码管的各段连接。
具体链接方式如图2所示:
图2数据显示电路
三.流程图绘制以及说明
(一)主程序流程图如图3所示:
说明:
程序开始执行后,首先启动ADC0808,执行AD转换,接着判断转换是否结束,如果转换没有结束,则程序原地等待,如果转换结束,ADC0808允许转换后数据输出,同时将输出数据暂存起来,此时关闭输出;同时,由单片机将接收到得数字量转换成BCD码,再调用BCD码显示子程序来显示转换后的BCD码,到此,程序结束。
这样,主程序就完成了一次模拟量采集,AD转换,BCD码转换,并最终显示的过程。
图3主程序流程图
(二)显示子程序流程图如图4所示:
说明:
子程序开始后,通过查表法来获取数码管要显示的数据并且暂存,接下来选通某位数码管,来显示数据,然后调用延时子程序,延时结束后关闭该位数码管,各位数码管的显示都是这样的流程,当需要显示的数据都显示完毕后,返回主程序。
图4显示子程序流程图
(三)延时子程序如图5所示:
说明:
首先是初始化,即赋初值。
接着判断循环是否结束,如果未结束,则继续执行,如果进行第二层循环,同样,循环未结束则继续执行,如果结束,则返回。
图6延时子程序流程图
四.Proteus仿真说明
图7单片机导入程序的对话框
按照要求连接好电路原理图之后,此时的电路并不能完成数据采集并且显示的功能,这是因为此时的单片机还没有导入能够使其工作的程序,所以此时的电路还不能完成任何工作,需要导入相应的程序才可以。
这时候,就用到了另一种软件KEIL,我们需要把按照要求编写好的汇编程序在KEIL中编译,在编译没有错误之后,便会生成一个后缀名为.hex的文件,这个文件就是单片机需要导入的文件。
在完成源程序的正确编译之后,进入proteus仿真环境中,打开已经连接好的电路原理图,打开单片机导入文件的对话框,找到指定的后缀名为.hex文件,单片机导入程序之后便可以工作了。
单击运行按钮就可以实现相应的功能。
导入文件的对话框如图7所示,运行结果示例图如图8所示:
图8运行示例图
改变电压源的输出电压,实现采集数据的变化,采集数据即电压值由ADC0808的八个通道输入,实现模拟量到数字量的转换,再由单片机实现数字量到BCD码的转换,最后由单片机控制数码管输出,这样整个数据采集到显示的过程就实现了。
图中,数码管显示的数据即为数据采集后变换为BCD码的输出,其中,前三位现实的是AD转换后的数据,最后一位现显示的是该时刻转换的通道号,其前面的小数点使用以区分数据输出是数字电压量还是通道号的。
五.体会及合理化建议
为期一周的电子设计应用软件训练结束了,在这一周的时间当中,我学到了很多东西。
首先我学会了proteus仿真软件极其辅助软件keil的使用方法,从开始对软件的一无所知,到渐渐地熟悉,在这个过程中对于软件的应用逐步熟练,对于各部分的功能也逐步地了解了一些,proteus可以用于单片机及外围电路的仿真,其功能是比较强大的,在用单片机设计相应功能电路的时候起到非常重要的作用,而且软件的使用也比较容易掌握。
其次,由于刚刚结束单片机课程的学习,所以通过这次实训,我对于单片机知识的了解又更加深刻了,对于单片机的应用领域也有了更进一步的了解,我了解到单片机的应用领域是非常广泛的,从非常简单的小规模电路到比较复杂的大型电路,有很多方面都会用到单片机。
这让我对于单片机学习的兴趣又浓厚了许多。
虽然对于该软件的使用还显得稚嫩,但对于我以后的工作或者学习都会有很大的帮助。
同时,我希望老师可以多给同学们一些这样的实训机会,让同学们更多的接触这些电子设计应用软件,我觉得这样的机会很难得,并且这些应用软件对于同学对于相应课程的学习会起到促进理解的作用,同时让同学们的动手能力得到加强,也培养了同学们的自主创新能力。
这些能力对于大家在以后的学习和工作中会起到非常重要的作用,可以让同学们在步入社会后更加有竞争力。
参考文献
[1]张毅刚,刘杰.MCS-51单片机原理及应用.[M]哈尔滨工艺大学出版社,2004年.第102-112页
[2]周润景,张丽娜.基于PROTUSE的电路及单片机系统设计与仿真.[M]北京航空航天大学出版社,2006年.第20-39页
[3]林志琦,郎建军,李会杰,佟大鹏.基于PROTUSE的单片机可视化软硬件仿真.[M]北京航空航天大学出版社,2006年.第5-29页
[4]周润景,袁伟亭.基于PROTUSE的ARM虚拟开发技术.[M]北京航空航天大学出版设,2007年。
第32-39页
[5]张靖武,周灵杉.单片机系统的PROTUSE设计与仿真.[M]电子工业出版社,2007年。
第81-100页
[6]张伟.单片机原理及应用,[M]北京:
机械工业出版社,2005年3月.216—218.
[7]薛栋梁.单片机原理及应用,[M]北京:
中国水利水电出版社.2001年.35-29.
附录Ⅰ电路原理图
图9电路原理图
附录Ⅱ源程序
#ifndef__ABSACC_H__
#define__ABSACC_H__
#defineCBYTE((unsignedcharvolatilecode*)0)
#defineDBYTE((unsignedcharvolatiledata*)0)
#definePBYTE((unsignedcharvolatilepdata*)0)
#defineXBYTE((unsignedcharvolatilexdata*)0)
#defineCWORD((unsignedintvolatilecode*)0)
#defineDWORD((unsignedintvolatiledata*)0)
#definePWORD((unsignedintvolatilepdata*)0)
#defineXWORD((unsignedintvolatilexdata*)0)
#ifdef__CX51__
#defineFVAR(object,addr)(*((objectvolatilefar*)(addr)))
#defineFARRAY(object,base)((objectvolatilefar*)(base))
#defineFCVAR(object,addr)(*((objectconstfar*)(addr)))
#defineFCARRAY(object,base)((objectconstfar*)(base))
#else
#defineFVAR(object,addr)(*((objectvolatilefar*)((addr)+0x10000L)))
#defineFCVAR(object,addr)(*((objectconstfar*)((addr)+0x810000L)))
#defineFARRAY(object,base)((objectvolatilefar*)((base)+0x10000L))
#defineFCARRAY(object,base)((objectconstfar*)((base)+0x810000L))
#endif
#endif
#include"adc0809.c"
#defineLED_DataP2
#defineA10
#defineU11
sbitLED1=P3^0;
sbitLED2=P3^1;
sbitLED3=P3^2;
sbitLED4=P3^3;
sbitdp=P3^5;
#defineLED_slectP3
staticuchardispdata[4];
voiddecodenum(floatadv,ucharchn)
{
uinttemp;
temp=(uint)(adv*100);
dispdata[0]=temp/100;
dispdata[1]=temp/10%10;
dispdata[2]=temp%10;
dispdata[3]=chn;
}
voidselect(ucharLED)
{
switch(LED)
{
case0:
LED1=0;break;
case1:
LED2=0;break;
case2:
LED3=0;break;
case3:
LED4=0;break;
default:
LED_slect=0xff;
}
}
voiddispone(ucharLED,bitifpoint,ucharnumber)//,number0--9
{
select(LED);
if(ifpoint)
dp=1;
else
dp=0;
LED_Data=num[number]|0x80;
delayus(200);
LED_slect=0xff;
}
voiddisp()
{
uchari;
bitpoint;
for(i=0;i<4;i++)
{
if(i==1)
point=0;
else
point=1;
dispone(i,point,dispdata[i]);
}
}
#include
#include
#include"numcode.h"
#defineucharunsignedchar
#defineuintunsignedint
#defineadinXBYTE[0x7fff]
voiddelayus(uintus)
{
while(us--);
}
ucharad_action(ucharchn)
{
ucharread_data;
adin=chn;
delayus(6);
read_data=adin;
returnread_data;
}
#ifndef__REG51_H__
#define__REG51_H__
/*BYTERegister*/
sfrP0=0x80;
sfrP1=0x90;
sfrP2=0xA0;
sfrP3=0xB0;
sfrPSW=0xD0;
sfrACC=0xE0;
sfrB=0xF0;
sfrSP=0x81;
sfrDPL=0x82;
sfrDPH=0x83;
sfrPCON=0x87;
sfrTCON=0x88;
sfrTMOD=0x89;
sfrTL0=0x8A;
sfrTL1=0x8B;
sfrTH0=0x8C;
sfrTH1=0x8D;
sfrIE=0xA8;
sfrIP=0xB8;
sfrSCON=0x98;
sfrSBUF=0x99;
/*BITRegister*/
/*PSW*/
sbitCY=0xD7;
sbitAC=0xD6;
sbitF0=0xD5;
sbitRS1=0xD4;
sbitRS0=0xD3;
sbitOV=0xD2;
sbitP=0xD0;
/*TCON*/
sbitTF1=0x8F;
sbitTR1=0x8E;
sbitTF0=0x8D;
sbitTR0=0x8C;
sbitIE1=0x8B;
sbitIT1=0x8A;
sbitIE0=0x89;
sbitIT0=0x88;
/*IE*/
sbitEA=0xAF;
sbitES=0xAC;
sbitET1=0xAB;
sbitEX1=0xAA;
sbitET0=0xA9;
sbitEX0=0xA8;
/*IP*/
sbitPS=0xBC;
sbitPT1=0xBB;
sbitPX1=0xBA;
sbitPT0=0xB9;
sbitPX0=0xB8;
/*P3*/
sbitRD=0xB7;
sbitWR=0xB6;
sbitT1=0xB5;
sbitT0=0xB4;
sbitINT1=0xB3;
sbitINT0=0xB2;
sbitTXD=0xB1;
sbitRXD=0xB0;
/*SCON*/
sbitSM0=0x9F;
sbitSM1=0x9E;
sbitSM2=0x9D;
sbitREN=0x9C;
sbitTB8=0x9B;
sbitRB8=0x9A;
sbitTI=0x99;
sbitRI=0x98;
#endif
unsignedcharcodenum[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x3e
};