温控系统课程设计.docx
- 文档编号:292605
- 上传时间:2023-04-28
- 格式:DOCX
- 页数:29
- 大小:841.99KB
温控系统课程设计.docx
《温控系统课程设计.docx》由会员分享,可在线阅读,更多相关《温控系统课程设计.docx(29页珍藏版)》请在冰点文库上搜索。
温控系统课程设计
广州学院
嵌入式技术应用项目说明书
温控系统
院(系)机械工程学院
专业机械电子工程
班级机械电子工1班
学生姓名温伟杰
指导老师王建春
成绩
2015年月日
课程设计任务书
兹发给机械电子1班班学生课程设计任务书,内容如下:
1.设计题目:
温控系统
2.应完成的项目:
(1)设计说明书计算准确、书写工整,字数不少于3000字;图纸正确清晰,符合制图标准及有关规定。
(2)
(3)基于相关电路完成电路设计、程序设计与实物。
(4)完成总体内容,实现具体功能。
3.参考资料以及说明:
(1)《微机原理与接口技术》
(2)《电子线路CAD与实训》
(3)《DS18B20技术手册》
(4)《LCD1602液晶技术手册》
4.本设计任务书于2015年11月16日发出,应于2015年11月27日前完成,然后进行答辩。
指导教师签发2015年月日
评语:
总评成绩:
指导教师签字:
年月日
摘要
本次课程设计使用DS18B20温度传感器设计温度报警系统,完成如下功能:
(1)在LCD液晶屏上显示当前采集到的环境温度
(2)在环境温度低于27度时,蜂鸣器开始以慢“滴”声报警,并且伴随LCD液晶屏上显示三个感叹号(!
!
!
);当环境温度低于25度时,蜂鸣器以快“滴”声报警。
并且伴随LCD液晶屏上显示六个感叹号(!
!
!
!
!
!
)。
(3)在环境温度高于30度时,蜂鸣器开始以慢“滴”声报警,并且伴随LCD液晶屏上显示三个感叹号(!
!
!
);当环境温度高于32度时,蜂鸣器以快“滴”声报警。
并且伴随LCD液晶屏上显示六个感叹号(!
!
!
!
!
!
)。
关键词:
DS18B20温度传感器LCD液晶显示屏蜂鸣器报警
第一章绪论
温度传感器是各种传感器中最常用的一种,早期使用的是模拟温度传感器,如热敏电阻,随着环境温度的变化,它的阻值也发生线性变化,用处理器采集电阻两端的电压,然后根据某个公式就能计算出当前环境温度。
随着科技的进步,现代的温度传感器已经走向数字化,外形小,接口简单,广泛应用在生产实践的各个领域,为我们的生活提供便利。
随着现代仪器的发展,微型化、集成化、数字化、正成为传感器发展的一个重要方向。
美国DALLAS半导体公司推出的数字化温度传感器DS18B20采用单总线协议,即与单片机接口仅需占一个I/O端口,无须任何外部元件,直接将环境温度转化为数字信号,以数字码方式串行输出,从而大大简化了传感器与微处理器的接口。
第二章总体内容及设计
2.1总体内容设计及目标
2.2组员及任务
温伟杰查询技术手册,编写程序,调试单片机,编写说明书
朱永豪绘制电路层次原理图,元器件图,编写说明书
邓耀斌绘制仿真电路图,编写说明书
李智杰调试仿真,编写说明书
第三章电路设计及元器件选型
3.1单片机基本电路设计
电源模块
通过三端稳压芯片7805将输入的直流转化为稳压直流5V电源。
图3-1-1电源模块
CPU模块
AT89C51单片机作为CPU处理程序,实现程序中所编写的功能。
图3-1-2CPU模块
蜂鸣器模块
当环境温度不在适宜范围,蜂鸣器将跟随灯的闪烁开始以“滴”声报警。
图3-1-3蜂鸣器模块
DS18B20温度传感器模块
温度传感器DS18B20采用单总线协议,下图中16号引脚与单片机的P3.7相连接,并外接一个约为4.7K欧姆的上拉电阻。
图3-1-4DS18B20模块
LCD1602液晶屏模块
1,2引脚分别为接地和电源。
3为对比调整电压引脚,4为指令/数据引脚,5为读取/写入引脚,6为使能引脚,7~14引脚为数据总线,15,16为背光电源正负极引脚。
图3-1-5CPU模块
3.2传感器功能及电路
DS18B20测温原理如图3-2-1所示。
图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。
高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。
计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。
斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。
图3-2-1DS18B20测温原理
在外部电源供电方式下,DS18B20工作电源由VCC引脚接入,I/O引脚与单片机的P3.7相连接,并外接一个约为4.7K欧姆的上拉电阻。
图3-2-2DS18B20电路图
初始化DS18B20温度传感器,初始化时序如图3-2-3所示。
图3-2-3初始化时序图
按初始化时序图写入相应的代码即可完成DS18B20温度传感器的初始化。
由于只有一个温度传感器所以向温度传感器写入0XCC跳过ROM操作指令(温度传感器的数据引脚与单片机的P3.7引脚相连)。
详细解释如图3-2-4所示。
图3-2-4ROM操作命令
接着向温度传感器写入0X44执行温度转换命令,是模拟信号变为数字信号,命令如图3-2-5所示。
图3-2-5温度变换命令
DS18B20温度传感器的写数据时序如图3-2-6所示
图3-2-6写数据时序图
接着向温度传感器读出温度值,读取数据的时序如图.3-2-7所示。
图3-2-7读数据时序图
第四章程序设计
第五章电路设计及结果
5.1电路仿真设计
图5-1仿真结果图
(1)在LCD液晶屏上显示当前采集到的环境温度
(2)在环境温度低于27度时,蜂鸣器开始以慢“滴”声报警,并且伴随LCD液晶屏上显示三个感叹号(!
!
!
);当环境温度低于25度时,蜂鸣器以快“滴”声报警。
并且伴随LCD液晶屏上显示六个感叹号(!
!
!
!
!
!
)。
(3)在环境温度高于30度时,蜂鸣器开始以慢“滴”声报警,并且伴随LCD液晶屏上显示三个感叹号(!
!
!
);当环境温度高于32度时,蜂鸣器以快“滴”声报警。
并且伴随LCD液晶屏上显示六个感叹号(!
!
!
!
!
!
)。
5.2当温度小于25度时的仿真现象:
图5-2温度小于25度时的仿真结果
LCD液晶屏上显示当前采集到的环境温度,当环境温度低于25度时,蜂鸣器以快“滴”声报警。
并且伴随LCD液晶屏上显示六个感叹号(!
!
!
!
!
!
)。
5.3电脑接收串口数据:
第六章总结
做为一名机电专业的学生,我觉得能做这样的课程设计是十分有意义。
在已度过的两年大学生活里我们大何去面对现实中的各种电子设计?
如何把我们所学到的专业基础理论知识用到实践中去呢?
我想做类似的大多数接触的是专业基础课。
我们在课堂上掌握的仅仅是专业基础课的理论面,如作业就为我们提供了良好的实践平台。
在做本次课程设计的过程中,我感触最深的当属查阅了很多次设计书和指导书,以及大量的网络资料。
为了让自己的设计更加完善,更加符合设计标准,一次次翻阅指导书是十分必要的,同时也是必不可少的。
本次课程设计为我们搭建了一个很好的平台在理论和实际之间。
另外,课堂上也有部分知识不太清楚,于是我又不得不边学边用,时刻巩固所学知识,这也是我作本次课程设计的第二大收获。
整个设计我基本上还满意,由于水平有限,难免会有错误,还望老师批评指正。
由此我可用更好地了解到自己的不足,以便课后加以弥补。
参考文献
[1]王国玉,电子线路CAD与实训,北京,电子工业出版社,2011年。
[2]李全利,单片机原理及应用,北京,清华大学出版社,2006年。
[3]郭天祥,51单片机C语言教程,北京,电子工业出版社,2012年。
附件
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineLCD1602_DATAPINSP0
sbitBEEP=P2^2;
sbitLCD1602_E=P2^7;
sbitLCD1602_RW=P2^5;
sbitLCD1602_RS=P2^6;
sbitDSPORT=P3^7;
uintwarn_l1=2700;
uintwarn_l2=2500;
uintwarn_h1=3000;
uintwarn_h2=3200;//定义温度限值是温度值乘以100后的结果
intalarm=0;//定义警报等级
ucharCNCHAR[6]="摄氏度";
/*LCD写入8位命令函数*/
voidLcdWriteCom(ucharcom);
/*LCD写入8位数据函数*/
voidLcdWriteData(uchardat);
/*LCD初始化函数*/
voidLcdInit();
/*LCD显示函数*/
voidLcdDisplay(int,int);
/*毫秒延时函数*/
voidDelay1ms(uint);
/*延时函数*/
voiddelay(uint);
/*温度传感器初始化函数*/
voidDs18b20Init();
/*温度传感器写字节函数*/
voidDs18b20WriteByte(ucharcom);
/*温度传感器读字节函数*/
ucharDs18b20ReadByte();
/*温度传感器温度转换函数*/
voidDs18b20ChangTemp();
/*温度传感器温度读取函数*/
intDs18b20ReadTemp();
/*温度处理函数*/
voiddeal(int);
/*蜂鸣器报警函数*/
voidwarn(int);
/*串口设置函数*/
voidUsartConfiguration();
/*****************主函数***********************/
voidmain()
{
UsartConfiguration();
LcdInit();//初始化LCD1602
LcdWriteCom(0x88);//写地址80表示初始地址
LcdWriteData('C');
while
(1)
{
deal(Ds18b20ReadTemp());
}
}
/*****************LCD写入8位命令函数***********************/
voidLcdWriteCom(ucharcom)//写入命令
{
LCD1602_RS=0;//选择发送命令
LCD1602_RW=0;//选择写入
LCD1602_DATAPINS=com;//放入命令
LCD1602_E=1;//写入时序
LCD1602_E=0;//下降沿写入
Delay1ms(5);//保持时间
}
/*****************LCD写入8位数据函数***********************/
voidLcdWriteData(uchardat)//写入数据
{
LCD1602_RS=1;//选择输入数据
LCD1602_RW=0;//选择写入
LCD1602_DATAPINS=dat;//写入数据
LCD1602_E=1;//写入时序
LCD1602_E=0;//下降沿写入
Delay1ms(5);//保持时间
}
/*****************LCD初始化函数***********************/
voidLcdInit()//LCD初始化子程序
{
LcdWriteCom(0x38);//开显示
LcdWriteCom(0x0c);//开显示不显示光标
LcdWriteCom(0x06);//写一个指针加1
LcdWriteCom(0x01);//清屏
Delay1ms(5);
}
/*****************LCD显示函数***********************/
voidLcdDisplay(inttemp,intalarm)//lcd显示
{
unsignedchari,datas[]={0,0,0,0,0};//定义数组
datas[0]=temp/10000;
datas[1]=temp%10000/1000;
datas[2]=temp%1000/100;
datas[3]=temp%100/10;
datas[4]=temp%10;
LcdWriteCom(0x82);//写地址80表示初始地址
LcdWriteData('0'+datas[0]);//百位
SBUF='0'+datas[0];//将接收到的数据放入到发送寄存器
while(!
TI);//等待发送数据完成
TI=0;
LcdWriteCom(0x83);//写地址80表示初始地址
LcdWriteData('0'+datas[1]);//十位
SBUF='0'+datas[1];//将接收到的数据放入到发送寄存器
while(!
TI);//等待发送数据完成
TI=0;
LcdWriteCom(0x84);//写地址80表示初始地址
LcdWriteData('0'+datas[2]);//个位
SBUF='0'+datas[2];//将接收到的数据放入到发送寄存器
while(!
TI);//等待发送数据完成
TI=0;
LcdWriteCom(0x85);//写地址80表示初始地址
LcdWriteData('.');//显示‘.’
SBUF='.';//将接收到的数据放入到发送寄存器
while(!
TI);//等待发送数据完成
TI=0;
LcdWriteCom(0x86);//写地址80表示初始地址
LcdWriteData('0'+datas[3]);//显示十分位
SBUF='0'+datas[3];//将接收到的数据放入到发送寄存器
while(!
TI);//等待发送数据完成
TI=0;
LcdWriteCom(0x87);//写地址80表示初始地址
LcdWriteData('0'+datas[4]);//显示百分位
SBUF='0'+datas[4];//将接收到的数据放入到发送寄存器
while(!
TI);//等待发送数据完成
TI=0;
for(i=0;i<6;i++)
{
SBUF=CNCHAR[i];//将接收到的数据放入到发送寄存器
while(!
TI);//等待发送数据完成
TI=0;
}
if(alarm==0)
{
intn,address=0x8A;
LcdWriteCom(address);
for(n=6;n>0;n--)
{
LcdWriteData(0x20);
}
}
if(alarm==1)
{
intn,address=0x8A;
LcdWriteCom(address);
for(n=3;n>0;n--)
{
LcdWriteData('!
');
}
}
if(alarm==2)
{
intn,address=0x8A;
LcdWriteCom(address);
for(n=6;n>0;n--)
{
LcdWriteData('!
');
}
}
}
/*****************毫秒延时函数***********************/
voidDelay1ms(uinty)
{
uintx;
for(;y>0;y--)
{
for(x=110;x>0;x--);
}
}
/*****************延时函数***********************/
voiddelay(uintx)
{
while(x--);
}
/*****************温度传感器初始化函数***********************/
voidDs18b20Init()
{
DSPORT=1;
delay(8);
DSPORT=0;
delay(90);
DSPORT=1;
}
/*****************温度传感器写字节函数***********************/
voidDs18b20WriteByte(uchardat)
{
uinti,j;
for(j=0;j<8;j++)
{
DSPORT=0;//每写入一位数据之前先把总线拉低1us
i++;
DSPORT=dat&0x01;//然后写入一个数据,从最低位开始
i=6;
while(i--);//延时68us,持续时间最少60us
DSPORT=1;//然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
dat>>=1;
}
}
/*****************温度传感器读字节函数***********************/
ucharDs18b20ReadByte()
{
ucharbyte,j;
DSPORT=1;//拉高总线
_nop_();
for(j=8;j>0;j--)
{
DSPORT=0;//拉低总线
byte>>=1;//数据字节向右移1位
DSPORT=1;//拉高总线
_nop_();
_nop_();
if(DSPORT)//总线在两个空步延时后仍为高电平
byte|=0x80;//数据字节最高位置1
delay(30);//延时
DSPORT=1;//总线拉高
}
returnbyte;
}
/*****************温度传感器温度转换函数***********************/
voidDs18b20ChangTemp()
{
Ds18b20Init();
Delay1ms
(1);
Ds18b20WriteByte(0xcc);//跳过ROM操作命令
Ds18b20WriteByte(0x44);//温度转换命令
}
/*****************温度传感器温度读取函数***********************/
intDs18b20ReadTemp()
{
inttemp=0;
floattp;
uchartmh,tml;
Ds18b20ChangTemp();//先写入转换命令
Ds18b20Init();
Delay1ms
(1);
Ds18b20WriteByte(0xcc);//跳过ROM操作命令
Ds18b20WriteByte(0xbe);//发送读取温度命令
tml=Ds18b20ReadByte();//读取温度值共16位,先读低字节
tmh=Ds18b20ReadByte();//再读高字节
temp=tmh;
temp<<=8;
temp|=tml;
if(temp<0)//当温度值为负数
{
LcdWriteCom(0x80);//写地址80表示初始地址
LcdWriteData('-');//显示负
//因为读取的温度是实际温度的补码,所以减1,再取反求出原码
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了。
}
else
{
LcdWriteCom(0x80);//写地址80表示初始地址
LcdWriteData('+');//显示正
tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
//如果温度是正的那么,那么正数的原码就是补码它本身
temp=tp*0.0625*100+0.5;
//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了。
}
returntemp;
}
/*****************温度处理函数***********************/
voiddeal(inttemp)//温度处理函数
{
if((temp>warn_l2)&&(temp<=warn_l1))
{
LcdDisplay(temp,0);
alarm=1;
LcdDisplay(temp,alarm);
warn(500);
}
elseif(temp<=warn_l2)
{
alarm=2;
LcdDisplay(temp,alarm);
warn(100);
}
elseif((temp
{
LcdDisplay(temp,0);
alarm=1;
LcdDisplay(temp,alarm);
warn(500);
}
elseif(temp>=warn_h2)
{
alarm=2;
LcdDisplay(temp,alarm);
warn(100);
}
else
alarm=0;
LcdDisplay(temp,alarm);
}
/*****************蜂鸣
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 温控 系统 课程设计