单片机课程设计数据采集系统Word文档下载推荐.docx
- 文档编号:16432814
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:21
- 大小:641.90KB
单片机课程设计数据采集系统Word文档下载推荐.docx
《单片机课程设计数据采集系统Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《单片机课程设计数据采集系统Word文档下载推荐.docx(21页珍藏版)》请在冰豆网上搜索。
此系统主要以ADC0808与80C51为中心,通过ADC对电阻网络采集数据,并将采集到的数据通过单片机串口传到另外一篇单片机中,在24C01芯片中存储,同时读取24C01里的数据,并将其显示在数码管中。
由于电阻网络是由滑动变阻器构成,因此,当改变滑动变阻器阻值后,ADC采集到的数据也会变化。
而采集速度也是由人通过拨码开关来控制的。
在采集速度方面,由于采集速度是可控的,因此,需要利用定时器来控制数据的发送。
3.3、方案比较
3.31.采样器方案比较:
由于采样的最重要指标是:
转化时间、转换精度。
已知ADC转换芯片有8位,10位,12位,14位,最高的达到16位。
位数不一样,导致处理速度,精度都不一样。
通常,8位逐次逼近ADC的转换时间为100US左右,为本系统的控制时间允许。
ADC的转换精度为1/28=0.39%,输入0~5V时分辨率为5/(28-1)=0.0196V。
因此选择ADC0808芯片是最佳的选择方案。
用此芯片可以直接将8个单端模拟信号输入,分时进行数据采集,转换。
3.32.单片机控制ADC方案比较:
用单片机控制ADC通常有两种方式。
一种是查询法,另外一种是中断控制法。
查询法是单片机不断地对EOC状态进行读取。
当发现EOC变化时,则单片机便对转化好的数据进行读取。
中断控制法则是当ADC变换结束后向单片机发送中断请求,然后进入中断服务进行想干操作。
查询法是用在对转换时间不高的工程中,而中断方法则应用在转换时间高的工程当中,在此次设计中,选择中断方式控制ADC。
3.33.显示方案比较:
(1)端口接线及数码管数选择:
由于本次实验显示的数据是从24C01中读取的,因此是在另外一片单片机上进行显示的。
由于该单片机的闲置端口足够提供控制显示器端口,因此不需要外加其它高级芯片。
如果端口数量不够,可以采样扩展端口,此类芯片有比较熟悉的8155芯片或者8255等等。
由于精度要求达到0.1%,因此,这里用8只数码管,3只用来显示通道数,4只用来显示数值。
(2)显示方法:
显示方法有动态显示与静态显示两种方法。
动态显示需要对CPU时刻对显示器进行数据刷新,显示数据会有闪烁感,占用的CPU时间多。
静态显示数据稳定,但是接线复杂。
这两种方法各有利弊,故当显示装置中有多个多段LED式,通常采用动态扫描驱动电路在该单片机系统中,使用7段LED显示器构成8位显示器,段选线控制显示的字符,位选线控制显示位的亮或暗。
3.34.双机通信接口方案比较:
由于此次设计是在PROTEUS上仿真的,因此不需要外加双机端口之间的诸如电平转换器、串行通信RS-232、RS-485.直接利用单片机串行接口相互连接发送便可。
3.35.外部拨码开关的方案比较:
由于通常都用switch开关来控制单片机,以便达到我们人所需要的条件。
但在此次设计中,由于在PROTEUS软件中8个switch不仅占用空间,而且还不好控制,故选择dipsw拨号开关,这个开关switch功能一样,但体积小,而且可以同时全部开,全部关,故选择dipsw开关。
3.4、电路设计(图示)
3.5、模块分析
此系统中共用到的模块如下:
ADC数据采集模块、发送机发送模块、接收机接收模块、24C01存储模块、LED数码管显示模块、采集速率处理模块。
(1)ADC数据采集模块:
在此模块中,主要是ADC采集数据是的时序处理,主要处理的拐角为0E(输出允许),START(开始转换),而EOC拐角则用来充当中断信号源
(2)发送机发送模块:
在此模块中,主要是一个中断控制处理,即当ADC转换完后,产生了一个下降沿触发信号时,发送模块进入中断,对数据进行发送,否则不发送数据,在此模块中当TI=1,进入中断以后,要用软件清零。
(3)接收机接收模块:
与发射机对应,波特率要设置成与发射机波特率相同,而且也是在收到信号后进入中断处理。
将收到的数据存到24C01芯片中。
否则,一直调用显示功能。
在此模块中,当RI=1,进入中断以后,要用软件清零
(4)24C01模块:
在此模块中,主要是处理SCK与SDA的时序问题,由于它是串行读取数据的,因此,时序出错,便不能得出数据来。
在24C01的读写过程中,地址很重要,在写过程中,要先写地址,再写数据。
在读过程也是先写入地址,在读数据。
(5)LED数码管显示模块:
在此模块中,主要是考虑将采集到的数据正确地显示处理,给操作者一个非常直观的界面。
在这个模块中要处理的一个难题是:
如何不让数码管跳动显示。
软件实现过程主要控制好段选与位选,以及延时时间上的处理。
(6)采集速率处理模块:
在此模块中,主要处理时间问题,即如何通过定时器到达用户的要求,实现人机信息交换。
在软件实现过程中,需要注意定时寄存器的重新赋值。
3.42.小结:
经简单理论分析,本系统数据采集核心采用ADC0808,单片机系统选用80C51构成的最小系统,用LED动态显示采集到的数据,数据通过80C51串行端口传输,实现单片机与单片机之间的通信。
3.6、实验流程图
3.7、程序主体
//******************************************************************************
(1)ADC采集、发送机数据处理、数据发送的程序如下:
#include<
reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitST=P3^5;
sbitOE=P3^7;
uchargetdata,picknum,t=0,Total=0;
voiddelay(uintt)//单位延时1ms,总延时1ms*t.(120为实验测试值)
{
uinti,j;
for(i=0;
i<
t;
i++)
for(j=0;
j<
121;
j++);
}
voiddelay1()
{;
;
}
voidSend(uchardat)
{
SBUF=dat;
while(!
TI);
TI=0;
voidmain(void)
{
P2=0x00;
//从0端口开始
TMOD=0x21;
//定时器1工作在方式2
SCON=0x40;
//串口工作方式1
PCON=0x00;
//波特率位9600b/s
TH1=0xfd;
TL1=0xfd;
TR1=1;
TH0=(65536-50000)/256;
//定时器0控制采集速率
TL0=(65536-50000)%256;
ET0=1;
IT0=1;
EX0=1;
EA=1;
TR0=1;
while
(1)
{
picknum=P0;
voidTimer_0()interrupt1//中断处理
TR0=0;
//关中断
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
if(t==20)//t=20,则是1S时间
Total++;
t=0;
if(picknum==0)//如果拨码开关是0,则将其置1.
picknum=1;
if(Total==picknum)//经历时间与人为设定的时间相同,则进入中断进行数据采集
P1=0xff;
OE=0;
ST=0;
delay
(1);
ST=1;
delay1();
Total=0;
}
//开中断
voidinter_0()interrupt0//当ADC转换好了后,则EOC下降沿触发中断
TR0=0;
OE=1;
getdata=P1;
delay
(1);
OE=0;
Send(getdata);
//在中断里面发送数据
delay(100);
P2++;
if(P2==0x08)
P2=0x00;
TR0=1;
}
(2)接收机接收、存储、显示的程序如下:
intrins.h>
24C01_head.h>
//包含24C01头文件
uchardispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x80};
//0~9数字(共阴CC)
uchartime[]={8,8,8,8,8,8,8,8};
ucharnum,getdata,room=0,a,count=0x08;
uchardate_deal(uchartemp)//二进制转化为十进制
ucharcont=1,sum=0,i;
8;
if(temp&
0x01)
sum=sum+cont;
cont=cont*2;
temp=temp>
>
1;
returnsum;
voidsum_change(ucharsum)//数据处理
floatc;
uintcont;
c=8000/255.0*sum;
cont=c/1;
time[3]=cont/1000;
time[5]=(cont%1000)/100;
time[6]=((cont%1000)%100)/10;
time[7]=((cont%1000)%100)%10;
voiddisp()//显示子程序
uchari;
if(count==0x08)
P0=0xff;
else
{
P2=dispbitcode[i];
if(i==0)
P0=table[count];
elseif(i==1||i==2)
P0=table[10];
elseif(i==4)
P0=table[11];
else
P0=table[time[i]];
delay(3);
P2=0xff;
}
P2=0xff;
TMOD=0x20;
//定时器T1工作于方式2
SCON=0x50;
//串口工作方式1,允许接受(REN=1)
PCON=0x00;
TH1=0xfd;
//波特率9600hz
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
init();
disp();
//显示数据
voidser()interrupt4//串行中断
RI=0;
write_add(room,SBUF);
delay(20);
getdata=read_add(room);
//读24C01里面的数据
room++;
//控制内存地址
if(room>
=8)
room=0;
num=date_deal(getdata);
//处理数据
sum_change(num);
count++;
if(count>
=8)//控制显示的数据
count=0;
//************************24C01_head.h头文件***********************************
#defineucharunsignedchar
sbitsda=P1^7;
sbitscl=P1^6;
voidstart()//开始信号
sda=1;
_nop_();
scl=1;
sda=0;
voidstop()//停止
voidrespons()//应答
while((sda==1)&
&
(i<
250))i++;
scl=0;
voidinit()
voidwrite_byte(uchardate)//写一个字节
uchari,temp;
temp=date;
temp=temp<
<
scl=0;
sda=CY;
_nop_();
scl=1;
ucharread_byte()//读一个字节
uchari,k;
k=(k<
1)|sda;
returnk;
voidwrite_add(ucharaddress,uchardate)//向一个地址里面写数据
start();
write_byte(0xa0);
respons();
write_byte(address);
write_byte(date);
stop();
ucharread_add(ucharaddress)//从一个地址里面读数据
uchardate;
write_byte(0xa1);
date=read_byte();
returndate;
//***********************************程序结束**********************************
3.8、系统效果
说明:
由于有8路采集,故用总电源电压为8V的直流电源,7个分压电阻,全为1K,再加一个滑动变阻器,阻值也为1K.够成电阻网络,这样能使结果易读。
图一:
初始显示
图二:
0通道显示
图三:
改变滑动变阻器,显示0通道
图四:
在三的基础上改变拨码开关,显示0通道
图五:
在图二的基础上,显示通道1
结合图说明:
图一时刚刚开始上电时,所有LED管全都显示,以验证数码管全都可以正常工作。
图二与图三比较,说明了,变化滑动变阻器是采集的数据变化,从而输出地数据也变化了。
图三与图四相比,说明了,在其他条件不变的情况下,拨动开关的大小会影响数据采集速率(由下面PROTEUS经历的时间大小可以看出)
图二与图五比较,说明了,正常显示下,而不是一直显示0通道。
3.9、错误处理及解决方案
3.91.在采样数据采样回来后,数码管显示总是不对,总是没有规律的显示。
解决方案:
单步调试
发现错误:
原来错误在,ADC0808转换后输出地数据对应到单片机输入端是相反的连接。
即若转换好的数据若为0xbf,在OUT0接P0的情况下,P0=0xfb,而我们要得到0Xbf,因此,硬件连接的时候要首尾对应。
3.92.无论怎么样采集,各路通道采集会来之后总是显示相同数值
接电压表读数
原来错误在,模拟仿真毕竟与实际情况不同,我用了8V的电源,但是电源的负极没有接地,因此整个系统相当于没有接地。
3.93.无论如何,ADC0808都不能工作
与以往写过的ADC0808进行比较
原来错误在,我接的时钟脉冲接错了,不小心接成了一个有边沿的脉冲,而不是时钟脉冲
4.0、实验总结
4.01.这是第一次自己设计了一个小小的系统,并且学会了很多PROTEUS新的知识,这是以前没有学过的,而且也学会了书本中一带而过的知识点,即双机通讯以及EEPROM的读写。
4.02.开始学会总体布局,由于PROTEUS布局界面有限,故如果最开始不布局,则可能功亏一篑,又得重新画图连线。
4.03.培养了在出现错误后自己通过调试,找出错误点,然后解决错误的能力。
自己写的程序只有自己知道构造,因此别人很难帮助你解决问题,只能自己一步一步慢慢调试解决。
4.04.整个大系统应该分布进行,一个一个模块化,当各个模块都成功的时候,连接它们,使它们共同运作也需要小心衔接部分
4.05.通过这次设计性试验,我了解了数据采集的全过程,也体会到了数据采集的重要性。
四、结论
此次试验是在PROTEUS上仿真,仿真效果良好,也不会出现实际工程上出现的问题。
但是在实际工程中还得考虑远距离传输的匹配问题,若传送距离达5KM,则接口RS485至少需要4片。
而且还得考虑各种噪声、滤波、高频影响等等。
五、参考文献
本部分列出撰写论文过程中所参考的文章、书本及其它文献。
【1】张毅刚.新编MCS-51单片机应用设计.哈尔滨工业大学出版社.2006年10月第二版
【2】王东锋.单片机C语言应用100例.电子工业出版社.2009年3月第一版
【3】郭天祥.10天学会单片机和C语言编程
六、附录
附录A:
中断控制寄存器
▪EX0(IE.0),外部中断0允许位;
▪ET0(IE.1),定时/计数器T0中断允许位;
▪EX1(IE.2),外部中断0允许位;
▪ET1(IE.3),定时/计数器T1中断允许位;
▪ES(IE.4),串行口中断允许位;
▪EA(IE.7),CPU中断允许(总允许)位。
控制寄存器TCON
80C51串行口的控制寄存器
附录B:
数码管结构
附录C:
串行通讯
80C51串行口的结构
方式一:
波特率表:
附录D:
24C01时序
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 数据 采集 系统