单片机课设Word文档下载推荐.docx
《单片机课设Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《单片机课设Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
![单片机课设Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-12/7/81dfdc00-a15a-44cf-b2f5-9a3ab098aa54/81dfdc00-a15a-44cf-b2f5-9a3ab098aa541.gif)
Keywords:
Temperaturemeasurement,AT89C52microcontroller,DS18B20temperaturesensor,LCD1602
1引言
温度传感器将环境温度数据转换成数字信号发送给单片机,单片机通过程序内部的运算将转换好的温度数值发送给显示器出来。
初步确定设计系统由单片机主控、测温、显示、警示、手动控制,共5个模块组成。
使用两个温度传感器,可以用于测试家庭中不同房间的温度并集中监视。
2设计方案及原理
2.1设计方案
首先,由DS18B20温度传感器芯片测量当前的温度,并将结果送入单片机。
然后,通过AT89C52单片机芯片对送来的测量温度读数结果进行处理,并将此结果送入显示模块。
其次,LCD1602芯片将送来的值显示于显示屏上。
同时LED会通过量不同的灯来提示当前的温度是不是在设定的范围之内,还可以在显示屏上看出是哪个房间的温度超出了范围。
最后,采取升降温措施。
设计方案框图如图1所示。
图1设计框图
2.2设计原理
电路主要由晶振电路、复位电路、测温电路、显示电路、报警提示电路以及温度控制电路组成。
DSI8B20温度传感器芯片采用“一线制”与单片机相连,它独立地完成温度测量以及将温度测量结果送到单片机的工作。
而单片机对传送来的结果有计算、转换等进一步处理的功能。
然后,输出到显示器显示。
3硬件设计
3.1芯片选择
主要选用DSl8820温度传感器芯片、LCD1602显示芯片和AT89C52单片机芯片。
3.2硬件电路
晶振电路是保证单片机能运行的所必须电路,而测温电路、显示电路、报警提示电路以及温度控制电路是为了完成设计中的各功能而设计的。
硬件电路如图2所示。
图2硬件电路图
4软件设计
程序主要由主程序和各个子程序构成,主程序主要完成是调用LCD液晶显示器的初始化及18b20初始化,对温度的采集、转化并显示以及对相应温度的控制处理。
主程序相当于一条主线,将各个子程序模块组合在一起,以实现功能要求,将当前温度值显示在液晶显示器上。
其中传感器DS18B20的软件设计是一个很重要环节。
对各个芯片的初始化、初值设定、温控门限设置、延时时间等都是软件设计所要考虑的必要因素。
系统源程序见附录一,程序流程图如图3所示。
图3程序流程图
5系统仿真
当传感器的温度都在范围之内时,蓝灯亮,表示正常。
仿真图如图4所示。
图4正常时的仿真图
其中任一个的温度超出范围,红灯都会亮,表示报警。
若第一个温度传感器的温度过高,可以按下降温装置的开关,此时绿灯亮,表示降温。
仿真图如图5所示。
图5温度过高且降温时的仿真图
若第二个温度过低,则可以按下升温装置的开关,此时黄灯亮,表示升温。
仿真图如图6所示。
图6温度过低且升温时的仿真图
6总结
该温度控制器自动测温、显示、警示、手动控温等功能,可以在监控室里同时监视多个房间的温度,并且可以根据报警和显示器的显示具体定位是哪个房间的温度超出了正常范围(15.0~20.0),然后可根据具体情况采取升温或降温等措施。
在温控模块,由于知识的限制还不能做到智能化控制,造成了该设计的一大缺陷。
所以该温度控制器属于一套简易的温控系统。
参考文献
[1]彭伟.单片机C语言程序设计实训100例[M].电子工业出版社,2009
[2]王思明.单片机原理及应用系统设计[M].科学出版社,2012
[3]潘晓宁.单片机程序设计实践教程[M].清华大学出版社,2009
[4]高峰.单片微型计算机与接口技术[M].科学出版社,1990
附录一系统源程序
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P1^0;
//ds18b20与单片机连接口
sbitDQ1=P1^1;
//ds18b201与单片机连接口
sbitP20=P2^0;
sbitP21=P2^1;
sbitRS=P2^5;
sbitRW=P2^6;
sbitEN=P2^7;
sbitP36=P3^6;
sbitP37=P3^7;
unsignedcharcodestr1[]={"
1:
"
};
unsignedcharcodestr2[]={"
H:
unsignedcharcodestr3[]={"
2:
unsignedcharcodestr4[]={"
L:
unsignedcharcodestr5[]={"
15.0"
//最低温门限
unsignedcharcodestr6[]={"
20.0"
//最高温门制
uchardatadisdata[4];
uchardatadisdata1[4];
uinttemp,temp1,tempL=15.0,tempH=20.0;
uinttvalue,tvalue1;
//温度值
uchartflag,tflag1;
//温度正负标志
/*************************lcd1602程序**************************/
voidlcd_init()//初始化设置//
{delay1ms(15);
wr_com(0x38);
delay1ms(5);
wr_com(0x08);
wr_com(0x01);
wr_com(0x06);
wr_com(0x0c);
}
voiddelay_18B20(unsignedinti)//延时1微秒
{
while(i--);
voidds1820rst()
{
DQ=1;
//DQ复位
delay_18B20(4);
//延时
DQ=0;
//DQ拉低
delay_18B20(100);
//精确延时大于480us
//拉高
delay_18B20(40);
voidds1820rst1()
DQ1=1;
DQ1=0;
//DQ拉低
}
uchards1820rd()
unsignedchari=0;
unsignedchardat=0;
for(i=8;
i>
0;
i--)
{
DQ=0;
//给脉冲信号
dat>
>
=1;
DQ=1;
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
uchards1820rd1()//读第二个温度传感器//
unsignedcharj=0;
unsignedchardat1=0;
for(j=8;
j>
j--)
{
DQ1=0;
dat1>
if(DQ1)
dat1|=0x80;
delay_18B20(10);
}
return(dat1);
voidds1820wr(ucharwdata)
{unsignedchari=0;
i>
i--)
{DQ=0;
DQ=wdata&
0x01;
wdata>
voidds1820wr1(ucharwdata1)//写第二个温度传感器//
{unsignedcharj=0;
j>
j--)
{
DQ1=wdata1&
wdata1>
read_temp()//读取温度值并转换//
{uchara,b;
ds1820rst();
ds1820wr(0xcc);
//跳过读序列号//
ds1820wr(0x44);
//启动温度转换//
//跳过读序列号//
ds1820wr(0xbe);
//读取温度//
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<
<
=8;
tvalue=tvalue|a;
if(tvalue<
0x0fff)
tflag=0;
else
{tvalue=~tvalue+1;
tflag=1;
tvalue=tvalue*(0.625);
//温度值扩大10倍,精确到1位小数
return(tvalue);
read_temp1()//读第二个温度传感器//
{ucharc,d;
ds1820rst1();
ds1820wr1(0xcc);
ds1820wr1(0x44);
ds1820wr1(0xbe);
c=ds1820rd1();
//温度2进制低8位
d=ds1820rd1();
//温度2进制高8位
tvalue1=d;
tvalue1<
tvalue1=tvalue1|c;
//合并高低位
if(tvalue1<
tflag1=0;
{
tvalue1=~tvalue1+1;
tflag1=1;
}
tvalue1=tvalue1*(0.625);
return(tvalue1);
voidds1820disp()//温度值显示
ucharflagdat;
disdata[0]=tvalue/1000+0x30;
//百位数
disdata[1]=tvalue%1000/100+0x30;
//十位数
disdata[2]=tvalue%100/10+0x30;
//个位数
disdata[3]=tvalue%10+0x30;
//小数位
temp=tvalue/10+tvalue%10;
if(tflag==0)
flagdat=0x20;
//正温度不显示符号
flagdat=0x2d;
//负温度显示负号:
-
if(disdata[0]==0x30)
{
disdata[0]=0x20;
//如果百位为0,不显示
if(disdata[1]==0x30)
disdata[1]=0x20;
//如果百位为0,十位为0也不显示
wr_com(0x82);
wr_dat(flagdat);
//显示符号位
wr_com(0x83);
wr_dat(disdata[0]);
//显示百位
wr_com(0x84);
wr_dat(disdata[1]);
//显示十位
wr_com(0x85);
wr_dat(disdata[2]);
//显示个位
wr_com(0x86);
voidds1820disp1()//温度值显示
{ucharflagdat1;
disdata1[0]=tvalue1/1000+0x30;
disdata1[1]=tvalue1%1000/100+0x30;
disdata1[2]=tvalue1%100/10+0x30;
disdata1[3]=tvalue1%10+0x30;
temp1=tvalue1/10+tvalue1%10;
if(tflag1==0)
flagdat1=0x20;
flagdat1=0x2d;
if(disdata1[0]==0x30)
{disdata1[0]=0x20;
if(disdata1[1]==0x30)
{disdata1[1]=0x20;
wr_com1(0xc0+0x02);
wr_dat1(flagdat1);
wr_com1(0xc0+0x03);
wr_dat1(disdata1[0]);
wr_com1(0xc0+0x04);
wr_dat1(disdata1[1]);
wr_com1(0xc0+0x05);
wr_dat1(disdata1[2]);
wr_com1(0xc0+0x06);
wr_dat1(0x2e);
//显示小数点
wr_com1(0xc0+0x07);
wr_dat1(disdata1[3]);
//显示小数位
/******************报警程序***********************************/
main()
P37=1;
init_play();
//初始化显示
while
(1)
delay1ms(400);
read_temp1();
//读取温度
ds1820disp1();
//显示
read_temp();
ds1820disp();
wr_com(0xcb);
display(str5);
wr_com(0x8b);
display(str6);
if((temp<
tempL||temp>
tempH)||(temp1<
tempL||temp1>
tempH))
{
unsignedchari;
for(i=20;
{
P37=0;
P36=1;
delay1ms(100);
P36=0;
}
else
P37=1;
return0;