单片机课程设计报告远程温度采集系统Word文件下载.docx
- 文档编号:21498077
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:28
- 大小:413.06KB
单片机课程设计报告远程温度采集系统Word文件下载.docx
《单片机课程设计报告远程温度采集系统Word文件下载.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告远程温度采集系统Word文件下载.docx(28页珍藏版)》请在冰豆网上搜索。
2、课程设计工具及题目………………………………………………………4
2.1、课程设计工具…………………………………………………...……4
2.2、课程设计题目……………………………………………...…………4
3、课程设计内容、步骤及电路原理图………………………………………4
3.1、课程设计内容………………………………………………………..4
3.2、课程设计步骤………………………………………………………..4
3.3、整个系统的电路原理图……………………………………………..5
4、课程设计各模块工作原理…………………………………………………5
4.1、温度采集模块.………………………………………………………...5
4.1.1、LM20经AD1674转换为12位数据给从机……………….6
4.1.2、从机接收主机发送的波特率并且设置自己的波特率……....8
4.1.3、拨码开关实现地址的变换…………………………………....8
4.1.4、定时器实现5秒间隔…………………………………………8
4.1.5、发送温度和地址,及其通信协议……………………………9
4.2、温度接收模块……………………………………………………….10
4.2.1、波特率设定及发送…………………………………………...11
4.2.2、波特率显示并且延时3s……………………………………...11
4.2.3、温度、地址的接收和判断……………………………………11
4.2.4、数码管显示…….……………………………………………...12
4.2.5、系统报警………………………………………………………12
5、课程设计成果………………………………………………………………13
5.1、显示波特率…………………………………………………………..13
5.2、显示温度与地址……………………………………………………..14
5.3、改变温度地址后重新显示…………………………………………..14
5.4、报警…………………………………………………………………..14
6、课程设计心得……………………………………………………………....15
7、参考文献…………………………………………………………………....16
8、附录:
源程序代码及注释…………………………………………………17
8.1、从机源代码…………………………………………………………..17
8.2、主机源代码…………………………………………………………..20
课程设计目的:
单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。
目前,一个学习与应用单片机的高潮在全社会大规模地兴起。
学习单片机的最有效方法就是理论与实践并重。
系统地运用已学的理论知识解决实际问题的能力和查阅资料的能力。
培养一定的自学能力和独立分析问题、解决问题的能力,能通过独立思考、查阅工具书、参考文献,寻找解决方案;
课程设计工具及题目:
1、课程设计工具:
PC机、KeiluVision4、Protues7.64
2、课程设计题目:
课程设计内容及步骤
1、使用LM20温度传感器、AD1674模数转换器、AT89C51单片机、4位拨码开关组成温度采集模块(从机),拨码开关用于设定模块的地址(00-15),从机在采集完温度信号(间隔5S)后通过串口发送到主机;
2、使用AT89C51单片机、4位拨码开关、LED显示组成温度接收模块(主机),4位拨码开关用于设定通讯波特率(1200,2400,4800,9600)当主机波特率改变后,从机波特率也自动改变,上电运行显示波特率信息(停3S),之后显示接收地址与温度信息,当接收时间间隔超过6S未收到数据,系统报警;
3、单片机一次只能发送一个字节的信息,使用多字节数据组成一帧数据,自定义一套通信协议来完成一、二的功能;
各功能模块的工作原理:
1、温度采集模块
使用LM20温度传感器、AD1674模数转换器、AT89C51单片机、4位拨码开关组成温度采集模块(从机),拨码开关用于设定模块的地址(00-15),从机在采集完温度信号(间隔5S)后通过串口发送到主机;
(1)LM20经AD1674转换为12位数据给从机
LM20温度传感器经过电压跟随器后输入到AD1674的10VIN口,AD1674组成双峰。
STS、CS、A0、CE、RC分别接到从机的P0-P4口实现AD1674的控制作用。
一开始CE=1,CS=0,RC=0,A0=0启动12位温度转换,然后等待数据采集结束while(STS==1);
接着CE=1,CS=0,RC=1,12/8=1,A0=0允许高八位数据并行输出,最后CE=1,CS=0,RC=1,12/8=0,A0=1允许低四位数据并行输出。
读出的12位数据存放在变量temp中。
经过AD1674转换后输出的结果精确到(10.0/4095.0)。
若LM20温度转换为电压值是1.13598v时,经过AD1674转换后输出的12位数为1.13598*4095/10=465转换为2进制为000111010001。
12位数据经过公式转换T=(1.8525-temp*10/4095.0)*10000/11.79.然后把低位小数位给temp1,temp就为整数部分,接着就是等待发送给主机。
/*读取AD1674转换结果*/
uintAD1674_Read(void)
{
uinttemp;
uchartemp1,temp2;
CS=1;
CE=0;
//初始化,关闭数据采集
CS=0;
A0=0;
RC=0;
CE=1;
//CE=1,CS1=0,RC=0,A0=0启动12位温度转换
_nop_();
while(STS==1);
//等待数据采集结束
//芯片使能关闭
RC=1;
//CE=1,CS1=0,RC=1,12/8=1,A0=0允许高八位数据并行输出
temp1=P0;
//读取转换结果的高八位
//芯片使能关闭
A0=1;
//CE=1,CS1=0,RC=1,12/8=0,A0=1允许低四位数据并行输出
temp2=P0;
//读取转换结果的低四位
temp=(temp1<
<
8)|temp2;
//高位和低位合成实际温度,temp2为P0口的高四位
return(temp>
>
4);
//返回转换结果,右移四位是因为temp2为P0口的高四位
}
(2)从机接收主机发送的波特率并且设置自己的波特率
主机发送波特率给从机,从机查询法判断是否接收到主机发送的波特率,如果接收到主机发送的波特率则改变自己的波特率,跳出循环来实现发送温度地址的发送,否则一直循环判断是否接收到主机发送的波特率。
/*查询法接收波特率*/
while
(1)
if(RI==1)
{
temp=SBUF;
set_bote(temp);
//设置波特率
break;
}
(3)拨码开关实现地址的变换
拨码开关接从机的P1口,然后改变拨码开关的值,P1口的数据变换,等待传送给主机。
(4)定时器实现5秒间隔
定时器0工作方式1,初值装(65536-50000)实现50ms的定时,num为定时次数,当num=100时,定时为5s的间隔。
(5)发送温度和地址,及其通信协议
由于温度经过转换后发送给主机要保留一位小数的话大于255(即8位),还有温度有正负要判断,所以要发送多次数据给主机,主机经过判断才能确认从机发送的温度是整数部分、小数部分还是地址。
通信协议如下:
因为采集到的温度有正负,所以定义j表示温度的正负,j=0表示正,j=1表示负。
j=0;
//温度正负标志位
temp=AD1674_Read();
//读取转换后的12位温度值
temp=(int)((1.8528-temp*addo)*10000/11.79);
//实现实际温度的转换其中add=10.0/4095
if(temp<
0){temp=-temp;
j=0x20;
}//温度若为负,则标志位00100000
temp2=temp%10;
//温度小数位存放在temp2中
temp=temp/10;
小数部分
temp2=temp2+132;
//温度小数位+132用于接收时的判断
温度正负标志和地址
temp=P1;
temp=temp&
0x0f;
//地址为P1口的低4位
temp1=temp1<
4;
temp1=temp1|0xc0;
//地址高位置1即11000000用于接收判断
temp=temp|temp1;
temp=temp|j;
//正负标志位存于temp中
因为温度值是0-130之间的由于精度在1.41所以是0-132之间。
所以温度值是小于132的。
小数部分是0-9,所以小数部分+133即133-142之间的。
而地址低4位0-15,高位直接置为1100,即大于192。
所以主机只要判断在0-132之间就为温度的整数部分,133-142之间的就为温度的小数部分。
剩下的就是地址、温度正负标志位的组合了。
2、温度接收模块
使用AT89C51单片机、4位拨码开关、LED显示组成温度接收模块(主机),4位拨码开关用于设定通讯波特率(1200,2400,4800,9600)当主机波特率改变后,从机波特率也自动改变,上电运行显示波特率信息(停3S),之后显示接收地址与温度信息,当接收时间间隔超过6S未收到数据,系统报警;
(1)波特率设定及发送
拨码开关接主机的P1口,用于设定主机的波特率。
P1口的数据分别为1、2、4、8时的波特率为1200、2400、4800、9600。
然后发送给从机波特率,接着自己的波特率也随之改变。
(2)波特率显示并且延时3s
由P1口可以得到不同的值,从而用软件设定波特率(即设定定时器1的初值),不同的值存放在bote[]数组中用以数码管的显示。
定时器T0实现定时功能,初值装(65536-50000)实现50ms的定时,num为定时次数,当num为60的时候定时到了3s,以后就不用显示波特率了,所以用m变量为1表示波特率显示结束,不再显示波特率。
(3)温度、地址的接收和判断
温度地址接收是用串口中断实现的。
RI为1的时候表示一帧数据已经接收完了,所以就开始判断是温度的整数部分、小数部分、还是地址和正负标志位组成的数据。
通信协议如上:
132)//若所接收到的数小于132则是温度正数部分值
{
HEXTOBCD(temp,aa,cc);
//转换为温度值
elseif(temp<
143)//若小于143,则为温度的小数部分值
cc=temp-132;
//小数部分还原
}
else
bb=temp&
//温度为低4位
disnum[6]=bb/10;
//存于数组中用于显示中
disnum[7]=bb%10;
aa=temp&
0x20;
if(aa==0)aa=0;
elseaa=1;
(4)数码管显示模块
数据存于disnum数组中,用8位数码管来显示温度、地址以及波特率。
段选接主机的P0口,片选接主机的P2口。
一开始显示波特率,就选中最后4位。
然后就是要显示温度和地址的信息了。
温度为-55—130所以前面4位显示温度后2位显示地址即:
XXX.XC-XX。
由于数码管是动态扫描的,所以要一定速度才可以实现视觉残留。
看上去好像是一直点亮一样的。
voiddisplay_led()
uchari;
for(i=0;
i<
8;
i++)
{
P2=disbit[i];
//使用查表法进行位选
if(i!
=2)
P0=table[disnum[i]];
else
P0=table1[disnum[i]];
delay(150);
//扫描间隔时间太长会数码管会有闪烁感
(5)系统报警
定时器0实现定时功能,num1为报警的时间的计算,定时器是实现50ms的,所以要120才能实现6s。
num1=120,那么判断一下flag(是否接收到传送过来的数据)如果flag=0;
说明没有接收到采集的数据,接着就报警,还要把num1和flag重新清0,实现下次的报警功能。
m=0;
//波特率显示结束
if(num1==120)//若已经计时6s
{
if(flag==0)//若没有接收到数据
{
uchart=8;
while(t--)//报警
BEEP();
}
else
flag=0;
//否则接收到数据标志位清0
num1=0;
//计数次数清0
}
display_led();
//显示温度和地址
课程设计成果
1、显示波特率
2、显示温度与地址
3、改变温度地址后重新显示
4、报警
课程设计心得
通过本次课程设计我学到了很多很多,虽然一开始的时候已经学过了C语言。
并且自认为学得不错。
但是到了实际的单片机还是有点区别的。
不是再控制台下直接运行的,他还有他的一个方式,一个功能来实现的。
还好开学的时候学过单片的C语言。
并且也买了很好的郭天祥的单片机C语言教程,还买了实际的开发板来做很多很多的实验。
基本上单片机C语言已经入门了。
但是那个开发板是已经焊好了的。
不知道怎么连AD1674,不知道怎么连数码管。
用protues仿真也是一开始用那个汇编编的。
所以还是要慢慢地学习。
第一天、看到题目觉得一片茫然。
不知道从何下手。
慢慢地一点一点地来。
首先是LM20。
查看它的功能和作用。
知道了他的转换公式。
接着要用单片机采集的话,必须经过模数转换才可以实现。
于是便开始AD1674芯片的学习了。
被这个芯片搞得头都大了。
花了1天时间总算弄好了采集那个部分。
不过只是用了8位采集,还没有12位的,精度不够。
因为一开始用了12位的一直是出错的,后来8位居然是对的。
就用了8位。
第二天、开始了从机采集到的数据发给主机。
还得学习下串口怎么发送,怎么接收,怎么初始化,怎么设定波特率,好多好多问题。
迎面而来。
此时又找不到任何一个人帮帮忙。
于是便自己找资料,看书,图书馆。
上网。
最后终于兴奋地完成了从机发送采集到的数据给主机。
第三天、那便是怎么把接收到的数据用数码管显示出来,这个倒是很容易。
很快地,一个显示模块搞定了。
此时整个系统基本上已经形成了。
看着这一天天学到的,远远比课堂学到的多多了,所以理论联系实际才是最最重要的。
接着便是改变地址,改变波特率,报警等等功能。
也很快得到了解决。
第四天、通过了微机的课程设计,于是便是单片机的了,早上很早就到了,心想得用12位的,于是便开始改了,居然人品爆了,改了以后一次性通过。
所有的功能都实现了。
真是太开心了。
最后便交给老师检查,通过了。
好开心啊!
不仅学到了这么多,对于单片机还兴趣更加浓厚了。
相信再努力点,以后会得到很多很多。
此次课程设计,我知道了,做事不能犹豫,不能害怕,遇到困难就想办法解决。
不要总是等着别人去完成,自信的自己才是最最好的。
相信自己肯定可以完成一切。
可以战胜困难,最后得到成功!
参考文献
[1]郭天祥。
新概念51单片机C语言教程[M]2009.12
附录:
源程序代码及注释
从机代码:
#include<
reg51.h>
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineaddo(10.0/4095.0)//转换进率,12位精度(2^12-1=4095),满量程为10V
uintnum;
//计数次数
/*管脚定义*/
sbitSTS=P2^0;
sbitCS=P2^1;
sbitA0=P2^2;
sbitCE=P2^3;
sbitRC=P2^4;
/*毫秒延时函数*/
voiddelay_ms(uintn)
uinti;
while(n--)
for(i=0;
i<
110;
i++);
/*数据发送*/
voidputbyte(ucharbyte)//利用硬件串口方式2发送一个字节数据
SBUF=byte;
//将要发送的数据送到发送缓冲区域,系统自动发送
while(!
TI);
//查询是否发送结束当TI=1代表发送结束
TI=0;
//清发送结束位方便下一次发送
voidinit()
TMOD=0x21;
//定时器为方式2
TL1=0xFD;
TH1=0xFD;
//波特率为9.6K
TH0=(65536-50000)/256;
//装初值实现50ms
TL0=(65526-50000)%256;
TR0=1;
//启动定时器0
TR1=1;
//启动定时器1
ET0=1;
//开定时器0
SM0=0;
//方式2
SM1=1;
RI=0;
REN=1;
EA=1;
//开总中断
ES=1;
//开串口中断
voidset_bote(uchartemp)
if(temp==1)
TL1=0xE8;
TH1=0xE8;
//波特率为1.2k
elseif(temp==2)
TL1=0xF4;
TH1=0xF4;
//波特率为2.4K
elseif(temp==4)
TL1=0xFA;
TH1=0xFA;
//波特率为4.8K
elseif(temp==8)
/*主函数*/
voidmain(void)
inttemp,temp1;
uchara,temp2;
ucharj;
init();
/*查询法接收波特率*/
while
(1)
if(RI==1)
temp=SBUF;
set_bote(temp);
break;
}
}
while
(1)
while(num==100);
//num计数100实现5秒的延时
num=0;
j=0;
temp=AD1674_Read();
temp=(int)((1.8528-temp*addo)*10000/11.79);
//实现实际温度的转换
if(temp<
temp2=temp%10;
temp=temp/10;
a=(uchar)temp;
putbyte(a);
//发送温度
delay_ms
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 报告 远程 温度 采集 系统