基于单片机的温度控制系统的设计文档格式.docx
《基于单片机的温度控制系统的设计文档格式.docx》由会员分享,可在线阅读,更多相关《基于单片机的温度控制系统的设计文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
X2
\1
方式,女口
XTALCl22pF
GND
图2单片机内部时钟方式电路
是使CPU和
始状态,并从
定造成CPU
不正常的情
系统调试方
单片机的复位电路有上电复位和按键复位两种形式3单片机按设计要求路
位键,因此本次设计采用按键复位,如图
运行时用户的按键复位功能。
键盘接口模块
本次设计需要的按键有4个,除去
按键外,还有3个功能按键,因此选择
盘。
如图4,将键盘直接与单片机P1
连。
3个键设计思路如下:
当按下S1
进入上下限警戒值调整状态;
当第一次
时,进行上限警戒值设定,当第二次按
进行下限警戒值设定,当第三次按下S1
正常工作状态。
在警戒值调整状态下,
的高增益
别为此放
~12MHz,
个匹配电
机提供时
需要有启动
3。
复位电路主要完成系统的上电复位和系统在
图4键盘接口模块
P10
P11
P12
P13
P14
m<
一个复位
独立式键
口的、、相
键时,系统
按下S1键
下S1键时,
键时,回到
按下S2键,
上下限警戒值加1按下S3键,上下限警戒值减1正常工作状态下,按下S2和S3键无作用。
温度采集模块
本次设计中的温度传感器使用的是DALLAS公司的单总线数字温度传感器DS18B20,
这是一种常用的温度传感器,具有体积小、硬件开销低、抗干扰能力强、精度高的特点。
DS18B20采用独特的一线接口,具有只需要一条口线通信多点的能力,简化了分布式
温度传感应用,无需外部元件。
可用数据总线供电,电压范围为至,测量温度的范围为-55C
至+125C,在-10C至+85C范围内精度为土C。
温度传感器可编程的分辨率为9~12位,温度转换为12位数字格式最大值为750毫秒,
用户可定义的非易失性温度报警设置,应用范围包括恒温控制、工业系统、温度计、或任
信,所以
与DS18B20只有一个一条口线连接。
因为每一个DS18B20的包含一个独特的序号,多个
DS18B20可以同时存在于一条总线,这使得温度传感器放置在许多不同的地方。
它的用途很多,包括空调环境控制,感测建筑物内温设备或机器,并进行过程监测和控制。
图5DS18B20封装及引脚
DS18B20的核心功能是它的直接读数字的温度传感器。
温度传感器的精度为用户可编程的9、10、11或12位,分别以C,C,C和C增量递增。
在上电状态下默认的精度为12位。
DS18B20启动后保持低功耗等待状态;
当需要执行温度测量和AD转换时,总线控
制器必须发出[44h]命令。
在那之后,产生的温度数据以两个字节的形式被存储到高速暂存器的温度寄存器中,DS18B20继续保持等待状态。
当DS18B20由外部电源供电时,总线控制器在温度转换指令之后发起“读时序”,DS18B20正在温度转换中返回0,转换结束返回1。
如果DS18B20由寄生电源供电,除非在进入温度转换时总线被一个强上拉拉高,否则将不会由返回值。
在硬件上,DS18B20与单片机的连接有两种方法:
一种是VDD接外部电源,GND接地,DQ与单片机的I/O口相连;
另一种是用寄生电源供电,此时,VDD、GND接地,DQ
在本次设计中,使用RT1602C字符型液晶显示模块(LCM)来设计当前温度和上下限警戒值的显示电路。
RT1602C字符型液晶显示模块是16字X2行的采用5X7点阵图形来显示字符的液晶
显示器,采用标准的16脚接口,其引脚定义如图7所示
引脚号
引脚名
说明
1
GND/Vss
电源地
7
D0
2
Vdd
+5V电源
8
D1
3
Vl
液晶显示偏压信号
9
D2
4
RS
数据/命令控制,H/L
10
D3
8位双向数据线
5
R/W
读/写控制,H/L
11
D4
6
E
使能端
12
D5
15
BLA
背光源正极
13
D6
16
BLK
背光源负极
14
D7
图7RT1602C的引脚定义
RT1602C的内部结构可以分为3个部分:
LCD控制器、LCD驱动器、LCD显示器,
其中LCD控制器采用的是HD44780。
RT1602C与单片机的连线如图8所示
LCD1602
Qu・
vcc
8RT1602C与单片机连线
LCM的数据总线与单片机的P0口通过一个上拉电阻排相连,LCM的三条控制线RS、
3引脚使
RW、EN分别与单片机的I/O口、、相连,第1、2引脚分别与地、电源相连,第
用一个10kQ的可调电阻对显示屏的明亮进行调整。
报警与指示模块
黄色发光二极管。
整个报警
灯分别接单片机、、口,电平拉低时点亮LED,蜂鸣器电路接单片机的口,电平拉高时蜂
鸣器响。
至此便完成了整个硬件电路的设计工作,整个系统的原理图见附录二,系统I/O分配
表如下:
I/O口
功能说明
LCM数据口
LCM读/写控制
键盘输入
LCM使能
DS18B20温度米集
LED信号输出
LCM数据/命令控制
报警信号输出
4•软件设计
单片机应用系统的设计中,软件设计占有重要的位置。
在本次设计中,根据功能要求,可以把系统程序划分为5个模块,即主程序模块、显示模块、温度测量模块、键盘扫描模块、其它子程序模块,如图10所示。
主程序设计
主程序的内容包括单片机初始化、相关部件初始化和一些其它子程序的调用等。
主程
开始
序清单如下,程序流程图如图11所示。
/************^主程^序************/
(2)
点击运行按钮开始仿真,初始上下限值为90C和10C,当前温度为25C,当前模式为N正常工作,绿灯亮,蜂鸣器不响,如图16。
(3)按下S1键,进入上限警戒值设置模式H,此时按S2、S3键可以进行上限值设定,同时温度正常显示,设置上限值80C,如图17。
(4)再次按下S1键,进入下限警戒值设置模设定仿真图匕时按S2、
图19下限报警仿真图
(6)
升高温度,超过上限值5C以上时,黄灯亮,蜂鸣器报警,如图20。
(7)按下S4键,单片机复位。
图20上限报警仿真图
在本次仿真中,可以看出,本次设计的硬件电路和软件程序均能成功仿真出来,设计要求的各种功能均已达到
6•总结
本次课程设计为期一周,到此已全部结束。
回想一周中的设计过程,我深深感觉收获良多。
由于从前只是在理论上学习了单片机以及各种其它知识,即使是实验也只是按照实验指导书进行操作,并没有实际的独立设计一个系统,因此在刚开始接触本次课程设计时,有一点无从下手的感觉。
后来通过查阅相关资料,渐渐开始了解课程设计的一般过程,开始明白一些元器件的相关作用与编程实现方法,并在此期间通过不断深入的学习和锻炼,开始渐渐能熟练运用和熟练编程起来。
通过本次计算机控制技术的课程设计,我更深层次的把理论知识和实际设计结合在一起,锻炼了我的综合运用所学的专业基础知识和解决实际工程问题的能力。
同时也提升了我查阅文献资料、设计手册、设计规范以及电脑制图等其他知识能力水平。
对各种系统的适用条件,各种设备的选用标准,各种管道的安装方式,我都是随着设计的不断深入而逐渐熟悉并学会应用的。
并且,通过对整体的掌控,对局部的取舍,对细节的斟酌处理,以及绘图的技巧都使我在设计领域的能力得到了锻炼,得到了较丰富经验。
?
最后,通过这次
的课程设计,我也深刻地认识到,只有将书本与具体的实践相结合,才会有真正的收获,才能巩固自己的所学,认识到自己的不足,同时我们也要有一种积极学习的态度,时代在进步我们也要跟着时代前进,要不断学习,不断创新,用自己的知识与行动来证明自己的价值。
本次课程设计以单片机为核心,介绍了用DS18B20温度传感器进行温度采集,并将其传输给AT89C51单片机进行处理再送到LCD显示屏显示。
在此期间可以通过按键进行上下限警戒值设置,通过LED和蜂鸣器进行指示和报警。
本文是采用模块化的方式进行叙述,对各模块的设计进行了比较详细地阐述,并着重分析硬件搭建过程和系统软件的设计过程,使用单片机C语言进行程序没计。
本次设计的基于DS18B20的温度测量系统是一个分布式的温度测量系统,它可以远程对温度实现测量和监控,广泛应用于电力工业、煤矿、森林、火灾、高层建筑等场合。
本设计应用性比较强,可以应用在仓库温度、大棚温度、机房温度、水池等的监控。
当然,本次设计还存在一些不足,例如在本次设计中,由于时间较短,警戒值只是在1~99°
C之间,没有能够扩展到负温度和100C以上;
在本次设计中只是用了4个独立按键,实现简单的上下限警戒值设定,操作较麻烦,如果能够设计出多按键的矩阵式键盘,则能够对温度进行很方便的设定。
此外如果把本设计方案扩展为多点温度控制,加上上位机,则可以实现远程温度监控系统,将具有更大的应用价值。
7.参考文献
[1]潘新民,王燕芳•微型计算机控制技术[M].北京:
电子工业出版社,2014
[2]王迎旭.单片机原理与应用[M].北京:
机械工业出版社,2013
[3]康华光.电子技术基础[M].北京:
高等教育出版社,2013
[4]周正华,唐宁RT1602C与FPGA接口技术[J].中国科技信息,2008(10)
⑸廖琪梅,韩彬等•基于DS18B20的温度测量仪[J].国外电子元器件,2008
(2)
附录一:
程序清单
#include<
>
#defineucharunsignedchar#defineuintunsignedint#defineBUSY0x80voidDelay(uint);
voidinit_LCD(void);
voidLCD_Command(uchar,uchar);
voidLCD_Data(uchar);
voidReadyLCD(void);
voidDisplay_char(uchar,uchar,uchar);
voidDisplay_str(uchar,uchar,ucharcode*Data);
voidChange(void);
voidDisplay(void);
voidinit_18B20(void);
ucharRead_18B20(void);
voidWrite_18B20(uchar);
voidRead_temp(void);
voidDelay_us(uchari);
voidKey_scan(void);
voidKey_set(void);
voidKey_inc(void);
voidKey_dec(void);
voidAlarm(void);
sbitLCD_RS=P2P;
sbitLCD_RW=P2a;
sbitLCD_EN=P2A2;
sbitDQ=P1A7;
sbitNormal=P2A4;
sbitAlarm_H=P2A5;
sbitAlarm_L=P2A6;
sbitAlarm_BEEP=P2A7;
ucharSet_flag=0;
ucharTemp_mea,Temp_set1,Temp_set2;
ucharTemp_high_1,Temp_high_2;
ucharTemp_low_1,Temp_low_2;
ucharTemp_true_1,Temp_true_2;
externucharcodestr0[]={"
High:
CLow:
C"
};
externucharcodestr1[]={"
Mode:
Deg:
externucharcodestr2[]={"
Hellow!
!
"
externucharcodeexternucharcodemode[]={"
NHL"
主程序
*******
*/
voidmain(void)
{
P1=0xff;
P2|=0x70;
P2&
=0x7f;
Temp_set仁90;
//上限报警温度初值90Temp_set2=10;
〃下限报警温度初值10Delay(500);
〃延时500ms启动init_LCD();
//LCD初始化
init_18B20();
//DS18B20初始化
Display_str(0,0,st⑵;
〃开机界面
Display_str(0,1,st⑵;
Delay(2000);
Display_str(0,0,str0);
Display_str(0,1,str1);
while
(1)
Key_scan();
〃扫描键盘
Read_temp();
〃读取温度Change();
Display。
;
//显示
Alarm();
〃指示灯与报警程序
Delay(1000);
}
voidDelay(uintk)
uinti,j;
for(i=0;
i<
k;
i++)
for(j=0;
j<
60;
j++)
voidinit_LCD(void)
P0=0;
Delay(15);
LCD_Command(0x38,0);
Delay(5);
LCD_Command(0x38,1);
//8位数据传送,2行显示,5*7字形
LCD_Command(0x08,1);
/关闭显示
LCD_Command(0x01,1);
/清屏
LCD_Command(0x06,1);
/显示光标右移设置
LCD_Command(0x0c,1);
/显示屏打开,光标不显示不闪烁
voidLCD_Command(ucharLC,ucharBC)
if(BC)ReadyLCD();
P0=LC;
LCD_RS=O;
选中指令寄存器
LCD_RW=O;
/写模式
LCD_EN=1;
_nop_();
LCD_EN=O;
/********
写显示数据到LCD********/
voidLCD_Data(ucharLD)
ReadyLCD();
PO=LD;
LCD_RS=1;
选中数据寄存器
检测LCD忙状态********/
voidReadyLCD(void)
PO=Oxff;
LCD_RS=0;
LCD_RW=1;
while(P0&
BUSY)
LCD_EN=0;
显示一个字符********/
voidDisplay_char(ucharX,ucharY,ucharData)
Y&
=0x01;
X&
=0x0f;
if(Y)X|=0x40;
X|=0x80;
LCD_Command(X,0);
LCD_Data(Data);
显示一串字符********/
voidDisplay_str(ucharX,ucharY,ucharcode*Data)
ucharList=0;
while(X<
16)
Display_char(X,Y,Data[List]);
List++;
X++;
voidChange(void)
Temp_high_1=Temp_set1/10;
Temp_high_2=Temp_set1%10;
Temp_low_1=Temp_set2/10;
Temp_low_2=Temp_set2%10;
Temp_true_1=Temp_mea/10;
Temp_true_2=Temp_mea%10;
voidDisplay(void)
Display_char(5,0,str3[Temp_high_1]);
Display_char(6,0,str3[Temp_high_2]);
Display_char(13,0,str3[Temp_low_1]);
Display_char(14,0,str3[Temp_low_2]);
Display_char(5,1,mode[Set_flag]);
Display_char(13,1,str3[Temp_true_1]);
Display_char(14,1,str3[Temp_true_2]);
voidinit_18B20(void)
ucharx=0;
DQ=1;
//DQ复位
Delay_us(4);
〃延时
DQ=O;
〃将DQ拉低
Delay_us(250);
〃精确延时大于480us
〃拉高总线
Delay_us(40);
x=DQ;
Delay_us(20);
/********从DS18B20读取一个字节数据********/ucharRead_18B20(void)
uchari=0;
uchardat=0;
for(i=8;
i>
0;
i--)
DQ=0;
dat>
=1;
Delay_us
(1);
if(DQ)dat|=0x80;
Delay_us(10);
return(dat);
voidWrite_18B20(uchardat)
DQ=dat&
0x01;
dat>
/********从DS18B20读取温度********/
voidRead_temp(void)
uchara=0;
ucharb=0;
uchart=0;
init_18B20();
Write_18B20(0xcc);
Write_18B20(0x44);
Write_18B20(0xbe);
a=Read_18B20();
b=Read_18B20();
t=b;
t<
<
=8;
t=t|a;
Temp_mea=t*;
voidDelay_us(uchari)
while(--i);
键盘扫描程序********/
voidKey_scan(void)
uchartemp;
if(P1!
=0xff)
Delay(20);
〃延时消抖
temp=P1;
switch(temp)
case0xfe:
Key_set();
break;
//按下,功能选择case0xfd:
Key_inc();
//按下,数字加一case0xfb:
Key_dec();
//按下,数字减一default:
voidKey_set(void)
Set_flag++;
if(Set_flag>
=3)//Set_flag=1,设定上限值
Set_flag=0;
//Set_flag=2,设定下限值
按键加一子程序********/
voidKey_inc(void)
switch(Set_flag)
case1:
Temp_set1++;
if(Temp_set1>
=99)Temp_set1=99;
case2:
Temp_set2++;
if(Temp_set2>
=Temp_set1)Temp_set2=Temp_set1;
default:
voidKey_dec(void)
//Delay(150);
Temp_set1--;
if(Temp_set1<
=Temp_set2)Temp_set1=Temp_set2;
Temp_set2--;
if(Temp_set2<
=1)Temp_set2=1;
default:
报