单片机原理及系统课程设计Word格式.docx
《单片机原理及系统课程设计Word格式.docx》由会员分享,可在线阅读,更多相关《单片机原理及系统课程设计Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
它要求通过键盘调节设定温度,以温度传感器DS18B20对水温进行温度检测,将测得的数字温度信号送给单片机处理后经液晶显示器LCD1602显示。
当设定的温度比实时温度高则启动热水器加热,反之,启动风扇降温并发出声光警告。
同时该系统可以对工作的时间进行计时,也可以通过键盘调节时、分、秒实现电子表功能。
本系统的温度静态误差≤0.5°
C,能够很精确地实现水温控制,是一个很好的水温控制方案。
2设计方案与原理
2.1温度传感器的比较与选择
方案一、采用半导体集成电路AD590。
根据热力学温度和发射极电流Ir的关系:
T/Ir=1实现对温度的检测,需要将温度传感器的温度值进行AD转换。
方案二、采用热敏电阻来采集温度。
热敏电阻线性度不好,与数字仪表配合测温时必须对其特性进行线性化处理。
精度不高,而且外围电路比较复杂。
方案三、采用DS18B20数字温度传感器对水温进行采样,无需进行AD转换。
DS18B20测温范围-55℃~+125℃,测温分辨率0.5℃。
综合考虑,本系统选择方案三。
2.2输入方式的比较与选择
方案一、采用独立式按键键盘。
独立按键的特点是编程容易,电路简单。
使用时需要用软件进行去抖动和松手检测处理,缺点是占用IO口较多,适用于按键数量较少的系统。
方案二、采用矩阵键盘。
矩阵键盘的特点是编程复杂,电路复杂,但节省IO口,适用于按键数量较多的系统,当需要六个以上的按键时推荐使用矩阵键盘,矩阵键盘同样需要用软件进行去抖动处理。
方案三、遥控器输入。
由于红外发光二极管的发射功率一般都较小,所以红外接收二极管接收到的信号比较微弱,因此就要增加高增益放大电路。
综合考虑,本系统选择方案一。
2.3显示器的比较与选择
方案一、采用四位一体的七段数码管LED做输出显示,经济实用。
若需要多个数码管,其显示需要锁存器74LS573首先对地址和数据进行锁存,增加了软件设计和硬件电路的复杂度。
方案二、采用LCD1602作为显示器件。
LCD1602能够同时显示16x2个字符,采用16脚接口,控制简单,使用方便。
综合考虑,本系统选择方案二。
3硬件设计
3.1总体设计
系统总体框架如图1所示。
图1系统总体框架
3.2局部电路设计
3.2.1温度传感器电路设计
DS18B20采用一总线技术,在使用时需在外部接一个上拉电阻,在总线闲置时为高电平。
电路如图2所示。
信息通过单总线接口将数字温度值送入单片机进行处理和显示。
DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温。
当在寄生电源供电方式下,DS18B20从单线信号线上汲取能量:
在信号线DQ处于高电平期间把能量储存在内部电容里,在信号线处于低电平期间消耗电容上的电能工作,直到高电平到来再给寄生电源(电容)充电。
图2温度传感器电路
3.2.2显示电路设计
在本系统中LCD1602的数据口接单片机的P0口,由于P0口的特殊性,必须外接上拉电阻。
如图3所示,LCD1602的控制端口E和RS通过P36与P37进行电平控制,由于在本系统软件只对LCD1602进行写操作,故RW直接接地即可。
在软件设计时,必须严格按照液晶资料中的读、写时序图进行编程。
图3液晶显示电路
3.2.3功率电路设计
通过控制继电器的开合状态实现对热水器、风扇的工作状态进行改变。
图中二极管为“续流二极管”,它在电路中用来保护元件不被感应电压击穿或烧坏。
图中的三极管起驱动放大作用。
图4功率电路
4系统软件设计
4.1主函数
主函数流程图如图5所示:
图5主函数流程图
4.2总体设计
总程序一共包含五个软件模块,程序结构框图如图7所示:
Main.c
ds18b20.c
系统初始化
调用子函数
循环执行测温函数
温度获取函数
写入各种控制命令
读取温度转换结果
图6程序结构
5系统仿真及调试
(1)加热时的仿真
设置温度S:
93.8℃,实时温度T:
49.0℃,时间21:
54:
19,此时设置温度高于水的实时温度,继电器控制热水器进行加热,加热指示灯亮。
此时左边继电器控制的灯泡被点亮,仿真结果如附录中图7所示。
(2)降温时的仿真
23.8℃,实时温度T:
27.0℃,时间21:
55:
21,此时水温高于设置温度,蜂鸣器报警,继电器控制风扇对水进行降温,降温指示灯亮。
此时右边继电器控制的灯泡被点亮,仿真结果如附录中图8所示。
6总结
通过实物测试,该水温自动控制系统运行良好,能实现自动控制水温,达到了设计的要求。
由于上学期在学校国家电工电子实验做过课程设计的项目,对单片机设计有一些基础,因此对于此次课程设计我充满信心。
事实证明,此次设计使我受益匪浅。
在设计过程中我遇到一个问题是如何将按键输入的设置温度与温度传感器检测到的温度进行比较,使得单片机对继电器进行控制以达到对水加热、降温的目的。
如果使用读指令程序,将增加程序的复杂度。
指导老师建议我在键盘扫描程序里将所设温度读出,我恍然大悟,这样的话只需要一条语句即可实现两温度的比较!
所以我认为编程思想是程序的灵魂。
此次单片机课程设计顺利完成,它培养了我对单片机的兴趣,提升了解决问题的能力,动手能力也得到锻炼,是一次很有意义的课程设计。
参考文献
[1]郭天祥.新概念51单片机C语言教程[M].电子工业出版社.2009.1
[2]林德杰.电气测试技术.机械工业出版社[M].2010.1
[3]谭浩强.C++程序设计.清华大学出版社[M].2004.6
附录1源程序
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitrs=P3^7;
sbitlcden=P3^6;
sbits1=P2^0;
sbits2=P2^1;
sbits3=P2^2;
sbitbeep=P3^4;
sbitled1=P2^4;
sbitled2=P2^7;
sbitDQ=P3^5;
sbitjdq1=P1^2;
sbitjdq2=P1^3;
ucharcount,s1num,set,temp;
charmiao,shi,fen,zh,xi;
uchardatadisdata[5];
uinttvalue;
ucharcodetable[]="
S:
00.0T:
"
;
ucharcodetable1[]="
00:
00:
00"
voidwrite_ds(uchar,uchar);
ucharread_ds(uchar);
ucharrade_set();
voiddelay(uintz)
{uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
voidwrite_com(ucharcom)
{rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
voidwrite_date(uchardate)
{rs=1;
lcden=0;
P0=date;
voidinit()
{ucharnum;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;
num<
16;
num++)
{write_date(table[num]);
delay(5);
write_com(0x80+0x40);
12;
{write_date(table1[num]);
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
voidwrite_sfm(ucharadd,uchardate)
{ucharsh,ge;
sh=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+sh);
write_d