简易温度检测课程设计.docx

上传人:b****5 文档编号:28868048 上传时间:2023-07-20 格式:DOCX 页数:13 大小:34.27KB
下载 相关 举报
简易温度检测课程设计.docx_第1页
第1页 / 共13页
简易温度检测课程设计.docx_第2页
第2页 / 共13页
简易温度检测课程设计.docx_第3页
第3页 / 共13页
简易温度检测课程设计.docx_第4页
第4页 / 共13页
简易温度检测课程设计.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

简易温度检测课程设计.docx

《简易温度检测课程设计.docx》由会员分享,可在线阅读,更多相关《简易温度检测课程设计.docx(13页珍藏版)》请在冰豆网上搜索。

简易温度检测课程设计.docx

简易温度检测课程设计

一、中文摘要、关键字

摘要:

本设计是基于89C52单片机的一个温度报警装置,主要采用89C52单片机作为CPU,通过18B20温度传感器来进行温度检测,当温度超过预先设置值时,通过LED作为报警装置来进行报警预告,且当前温度通过液晶屏LCD1602进行显示。

整个系统可集成在一个很小的PCB板上,制作简单,且携带方便。

关键词:

89C52,18B20温度传感器,LCD1602

 

二、设计内容

本设计采用18B20对室内温度进行检测,温度检测范围在-55度到125度之间,完全适用于室内温度检测,本设计主要留四个方面构成:

51单片机最小系统、DS18B20模块、LCD1602显示模块、声光报警模块;

整个系统的工作原理如下:

首先通过DS18B20进行温度检测,然后通过单片机对采集的数据进行计算处理,然后再通过LCD1602进行显示,且单片机需要随时检测温度是否超过预先设置的上限与下限,当超过设定值时,启动声光报警装置进行报警。

此次设计的元器件选用89C52作为整个系统的CPU,DS18B20作为温度检测传感器,LCD1602作为显示模块,声光报警则采用红色LED灯组成。

 

三、Proteus仿真图设计和仿真

四、程序流程图和Keil程序编写

#include//包含单片机寄存器的头文件

#include//包含_nop_()函数定义的头文件

#defineuintunsignedint

#defineucharunsignedchar

sbitRS=P2^0;//寄存器选择位,将RS位定义为P2.0引脚//1602引脚定义

sbitRW=P2^1;//读写选择位,将RW位定义为P2.1引脚

sbitE=P2^2;//使能信号位,将E位定义为P2.2引脚

sbitBF=P0^7;//忙碌标志位,,将BF位定义为P0.7引脚

//1602数据口接单片机P0口

sbitds=P3^3;//DS18B20引脚定义

sbitLED=P3^6;

sbitwarning=P3^7;

uinttemp;

floatf_temp;

unsignedcharcodeUser[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//自定义字符℃

voiddelay1ms()

{

unsignedchari,j;

for(i=0;i<10;i++)

for(j=0;j<33;j++)

;

}

voiddelay(unsignedintn)

{

unsignedinti;

for(i=0;i

delay1ms();

}

voidWarning()

{

warning=0;

LED=0;

delay(100);

LED=1;//报警系统

}

bitBusyTest(void)

{

bitresult;

RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态

RW=1;

E=1;//E=1,才允许读写

_nop_();//空操作

_nop_();

_nop_();

_nop_();//空操作四个机器周期,给硬件反应时间

result=BF;//将忙碌标志电平赋给result

E=0;

returnresult;

}

voidWrite_com(unsignedchardictate)

{

while(BusyTest()==1);//如果忙就等待

RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令

RW=0;

E=0;//E置低电平(写指令时,

//就是让E从0到1发生正跳变,所以应先置"0"

_nop_();

_nop_();//空操作两个机器周期,给硬件反应时间

P0=dictate;//将数据送入P0口,即写入指令或地址

_nop_();

_nop_();

_nop_();

_nop_();//空操作四个机器周期,给硬件反应时间

E=1;//E置高电平

_nop_();

_nop_();

_nop_();

_nop_();//空操作四个机器周期,给硬件反应时间

E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令

}

voidWriteAddress(unsignedcharx)

{

Write_com(x|0x80);//显示位置的确定方法规定为"80H+地址码x"

}

voidWriteData(unsignedchary)

{

while(BusyTest()==1);

RS=1;//RS为高电平,RW为低电平时,可以写入数据

RW=0;

E=0;//E置低电平(写指令时,,

//就是让E从0到1发生正跳变,所以应先置"0"

P0=y;//将数据送入P0口,即将数据写入液晶模块

_nop_();

_nop_();

_nop_();

_nop_();//空操作四个机器周期,给硬件反应时间

E=1;//E置高电平

_nop_();

_nop_();

_nop_();

_nop_();//空操作四个机器周期,给硬件反应时间

E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令

}

voidLcdInt(void)

{

delay(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间

Write_com(0x38);//显示模式设置:

16×2显示,5×7点阵,8位数据接口

delay(5);//延时5ms 

Write_com(0x38);

delay(5);

Write_com(0x38);//3次写设置模式

delay(5);

//Write_com(0x0F);//显示模式设置:

显示开,有光标,光标闪烁

//delay(5);

Write_com(0x0c);//显示模式设置:

显示开,不显示光标

delay(5);

Write_com(0x06);//显示模式设置:

光标右移,字符不移

delay(5);

Write_com(0x01);//清屏幕指令,将以前的显示内容清除

delay(5);

}

 

voiddisplay(unsignedcharadd,unsignedcharx)//add为显示字符的位置,x为显示的字符在第二行显示

{

WriteAddress(0x00);

delay(5);

Write_com(0x80+0x40+add);

WriteData(0x30+x);

}

voidLCD1602()//1602初显示

{

intj;

LcdInt();//调用LCD初始化函数

delay(10);

Write_com(0x01);//清屏

delay(5);

WriteAddress(0x00);//设置显示位置为第一行第一个字,这条语句可以不用写,因为默认是从第一行第一个字显示

delay(5);

WriteData('T');delay(5);//第一行显示Temperature,第二行最后一位显示℃

WriteData('e');delay(5);

WriteData('m');delay(5);

WriteData('p');delay(5);

WriteData('e');delay(5);

WriteData('r');delay(5);

WriteData('a');delay(5);

WriteData('t');delay(5);

WriteData('u');delay(5);

WriteData('r');delay(5);

WriteData('e');delay(5);

WriteData(':

');delay(5);

Write_com(0x80+0x40+12);

WriteData('.');delay(5);

/*以下为自定义“℃”语句*/

Write_com(0x40);//设定CGRAM地址

delay(5);

for(j=0;j<8;j++)

{

WriteData(User[j]);//写入自定义图形℃

}

WriteAddress(0x80+0x40+15);//设定屏幕上的显示位置

delay(5);

WriteData(0x00);//从CGRAM里取出自定义图形显示

/*以上为自定义“℃”语句*/

}

voiddsreset(void)//18B20复位,初始化函数

{

uinti;

ds=0;

i=103;

while(i>0)i--;

ds=1;

i=4;

while(i>0)i--;

}

bittempreadbit(void)//读1位函数

{

uinti;

bitdat;

ds=0;i++;//i++起延时作用

ds=1;i++;i++;

dat=ds;

i=8;while(i>0)i--;

return(dat);

}

uchartempread(void)//读1个字节

{

uchari,j,dat;

dat=0;

for(i=1;i<=8;i++)

{

j=tempreadbit();

dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里

}

return(dat);

}

voidtempwritebyte(uchardat)//向18B20写一个字节数据

{

uinti;

ucharj;

bittestb;

for(j=1;j<=8;j++)

{

testb=dat&0x01;

dat=dat>>1;

if(testb)//写1

{

ds=0;

i++;i++;

ds=1;

i=8;while(i>0)i--;

}

else

{

ds=0;//写0

i=8;while(i>0)i--;

ds=1;

i++;i++;

}

}

}

voidtempchange(void)//DS18B20开始获取温度并转换

{

dsreset();

delay

(1);

tempwritebyte(0xcc);//写跳过读ROM指令

tempwritebyte(0x44);//写温度转换指令

}

uintget_temp()//读取寄存器中存储的温度数据

{

uchara,b;

dsreset();

delay

(1);

tempwritebyte(0xcc);

tempwritebyte(0xbe);

a=tempread();//读低8位

b=tempread();//读高8位

temp=b;

temp<<=8;//两个字节组合为1个字

temp=temp|a;

f_temp=temp*0.0625;//温度在寄存器中为12位分辨率位0.0625°

temp=f_temp*10+0.5;//乘以10表示小数点后面只取1位,加0.5是四舍五入

f_temp=f_temp+0.05;

returntemp;//temp是整型

}

 

voiddis_temp(uintt)

{

uchari;

i=t/100;

display(10,i);//十位

i=t%100/10;

display(11,i);//个位

i=t%100%10;

display(13,i);//小数位

}

voidmain()

{

LCD1602();

while

(1)

{

tempchange();

dis_temp(get_temp());

if(f_temp>50)

{

uinto;

for(o=0;o<5;o++)

{

Warning();

delay(20);

}

}

LED=1;

warning=1;

}

}

五、总结和体会

通过本次课程的课程设计,是自己学会了Proteuskeil编程软件的使用,在这个过程中由于对两个软件的不熟悉所以花费了很多时间,通过自己的努力,终于还是完成了本次课程设计,相对来说还是比较满意的,学会了更多关于本专业的知识,且锻炼了查阅资料与自主思考的能力。

此次课程设计通过看书学习了51单片机的相关知识,在网上学习了51单片机C语言编程的相关内容,且在这个过程中还找了相关人员进行了技术指导。

整个课程设计由硬件电路和软件程序组成,程序主要有18B20检测和LCD显示程序两部分组成,制作后期对于整个课程设计已经有了完整的掌握。

通过本次的学习,发现了自己的不足之处,在后面的学习中,将进一步的完善。

 

六、参考文献

[1]李广弟等.单片机基础[M].北京航空航天出版社,2001.

[2]王东峰等.单片机C语言应用100例[M].电子工业出版社,2009.

[3]陈海宴.51单片机原理及应用[M].北京航空航天大学出版社,2010.

[4]刘守义等.单片机技术基础[M].西安电子科技大学出版社,2007.

[5]钟富昭等.8051单片机典型模块设计与应用[M].人民邮电出版社,2007.

[6]李平等.单片机入门与开发[M].机械工业出版社,2008.

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1