单片机温度控制系统的设计.docx
- 文档编号:10883418
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:45
- 大小:149.97KB
单片机温度控制系统的设计.docx
《单片机温度控制系统的设计.docx》由会员分享,可在线阅读,更多相关《单片机温度控制系统的设计.docx(45页珍藏版)》请在冰豆网上搜索。
单片机温度控制系统的设计
<<温度控制系统的设计>>
课程设计报告
题目:
____
专业:
_____________________
年级:
_____________________
学号:
_____________________
学生姓名:
_____________________
联系电话:
_____________________
完成日期:
年月日
摘要
单片机在电子产品中的应用已经越来越广泛,在很多的电子产品中也用到了温度检测和温度控制。
随着温度控制器应用范围的日益广泛和多样,各种适用于不同场合的智能温度控制器应运而生。
单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。
而51单片机是各单片机种最为典型和最有代表性的一种。
本系统是基于MCS51系列单片机所设计的,可以实现键盘按键与数字动态显示并可以显示出实时温度。
本系统基于单片机技术原理,以单片机芯片AT89C51作为核心控制器,通过硬件电路的制作以及软件程序的编制,设计制出一个温度控制系统,包括以下功能:
1能设置需要控制的温度;2检测实际温度;3能显示设置温度和实际温度;4比较实际温度和设定温度,判断是否启动加热装置;该温度系统主要有LCD显示模块、LED状态灯模块、键盘模块、温度检测模块,复位模块等部分组成。
关键词:
AT89C51LED单片机
ABSTRACT
SCMhasbecomeincreasinglywideapplicationintheelectronicproducts,alsousedinmanyelectronicproductstothetemperaturedetectionandcontrol.Thescopeofapplicationofincreasinglywideandvariedwithtemperaturecontrollers,variousarisesatthehistoricmomentofintelligenttemperaturecontrollerissuitablefordifferentoccasions.MCUapplicationthereisagrowing,atthesametime,drivetraditionalcontroltesttechnologyisbecomingmoreandmoreupdates.Inreal-timedetectionandautomaticcontrolofmicrocomputerapplicationsystem,thesinglechipmicrocomputeroftenasacorecomponenttouse,onlysinglechipmicrocomputeraspectsknowledgeisnotenough,stillshouldaccordingtothespecificcombinationofhardwareandsoftware,thehardwarestructure,perfected.The51single-chipmicrocomputeristhesinglechipmicrocomputeristhemosttypicalandmostrepresentativeone.ThissystemisdesignedbasedontheMCS51seriessinglechipmicrocomputer,canrealizethekeyboardkeysanddigitaldynamicdisplayandcandisplaythereal-timetemperature.Principlesofthissystembasedonsinglechipmicrocomputertechnologyandsingle-chipmicrocomputerAT89C51asthecorecontroller,throughtheproductionofhardwarecircuitandsoftwareprogramcompiled,designtoproduceatemperaturecontrolsystem,includingthefollowingfunctions:
1cansettheneedtocontroltemperature;2detecttheactualtemperature;3candisplaysettemperatureandrealtemperature;4compareactualtemperatureandsettemperature,determinewhethertostarttheheatingdevice;ThetemperaturesystemmainlyincludeLCDdisplaymodule,LEDstatuslightmodule,keyboardmodule,temperaturedetectionmodule,resetthemodulecomponents.
KeyWords:
frequencymodulatedtransmitter;crystaloscillator;outputfilter.
1设计要求及方案选择
1.1设计要求
(1)制作完成简易的电子时钟,时间可调整。
(2)有闹钟功能。
(3)利用数码管或者液晶显示器显示时间(XX-XX-XX由左向右分别为:
时、分、秒,且每秒更新一次)。
(4)设计电路
(5)在KEIL中编辑、编译、调试程序,并在protuse中仿真。
扩展部分(选作)
(1)显示年月日;
(2)声音播报时间;
(3)有温度显示;
(4)其它
1.2方案选择
本系统由51系列单片机AT89S52、按键、时钟、液晶显示和外围降温、加热电路等部分构成。
对温度进行实时采集并通过程序设定最高温度、最低温度。
采集到的实时温度通过串口向单片机进行传输,最后将测得的结果发送到液晶1602显示出来。
该系统对所测得的温度值进行分析,当温度高于或者低于设定的温度限时自动报警,并驱动相应的降温或加热设备,以达到对温度智能控制,从而使环境温度维持在设定的有利温度范围内。
系统总体结构图如图
2理论分析与设计
2.1温度测量电路的分析及设计
DS18B20通过P3.3口和AT89S52进行通讯。
GND为接地线,Q为数据输入输出接口,通过一个较弱的上拉电阻与单片机相连。
VCC为电源接口,既可由数据线提供电源,又可由外部提供电源,范围3.O~5.5V。
其接口电路如图
图4-2
2.2 时钟电路的分析及设计
利用DS1320芯片完成实时时钟的读取和设置,能实现对年、月、日、星期、时、分、秒进行记时,具有闰年补偿功能。
其工作电压为2.5伏到5.5伏,采用三线接口与CPU进行同步通信,并可采用突发方式一次传递多个字节的时钟信号或RAM数据。
其接口电路如图
3 电路设计
3.1硬件电路的设计
3.2 软件的设计
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineLCD_DATA1//Data
sbitLCD_RS=P2^0;
sbitLCD_RW=P2^1;
sbitLCD_EN=P2^2;
sbitLCD_LED=P2^6;
sbitK1=P1^4;
sbitK2=P1^5;
sbitK3=P1^6;
sbitK4=P1^7;
sbitreset=P1^2;
sbitsclk=P1^0;
sbitio=P1^1;
sbitDQ=P3^3;
sbitBEEP=P3^7;
sbitJDQ1=P2^3;//驱动电动机(0表示接通,1表示关闭)
bitflag=1,hour=0,min=0,sec=0;
bityear=0,month=0,day=0,week=0;
bitalarm_flag=0;
sfrDBPort=0x80;//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
uchartimecount=0,count=0;
uchartemp_value;//温度值
uchardigital;
ucharTempBuffer[7];
unsignedcharfrq;
ucharstr1[]="--Week:
";
ucharstr2[]="";
ucharstr3[]="Alarm:
";
ucharinit[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};//
ucharinit1[]={0x00,0x00};
ucharinit2[]={0x00,0x59,0x23,0x11,0x06,0x03,0x08};//
//秒,分,时,日,月,星期,年
ucharbj_time[]={0x00,0x00,0x00};
//秒,分,时
ucharcodemytab[8]={0x01,0x1b,0x1d,0x19,0x1d,0x1b,0x01,0x00};//小喇叭
#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};
voidSet_W1302(ucharaddr);
voidSet_Flash(ucharrow,ucharcol);
voidSet_place(ucharrow,ucharcol);
voidPlay_nowtime();
voidkey_set(ucharnum,ucharrow,ucharcol);
voidkey_set_1(ucharnum,ucharrow,ucharcol);
voidalarm_time();
voidPlay_alarmtime();
voidTime_compare();
voidInit_DS18B20(void);
unsignedcharReadOneChar(void);
voidWriteOneChar(uchardat);
voidReadTemp(void);
voidtemp_to_str(void);
voidPrint(unsignedchar*str);
voidLCD_Write(bitstyle,unsignedcharinput);
unsignedcharLCD_Wait(void);
voidRead_DS18B20(void);
voidspeak(void);
voiddelayms(unsignedcharms);
voidbeep_temp();
voiddianji(void);
voiddelay1(intms)
{
unsignedchary;
while(ms--)
{
for(y=0;y<250;y++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/******************************************************************/
/**/
/*检查LCD忙状态*/
/*lcd_busy为1时,忙,等待。
lcd-busy为0时,闲,可写指令与数据。
*/
/**/
/******************************************************************/
bitlcd_busy()
{
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delayNOP();
result=(bit)(P0&0x80);
LCD_EN=0;
return(result);
}
/*********************************************************/
/**/
/*写指令数据到LCD*/
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
*/
/**/
/*********************************************************/
voidlcd_wcmd(ucharcmd)
{
while(lcd_busy());
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
_nop_();
_nop_();
P0=cmd;
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}
/*********************************************************/
/**/
/*写显示数据到LCD*/
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。
*/
/**/
/*********************************************************/
voidlcd_wdat(uchardat)
{
while(lcd_busy());
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P0=dat;
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}
/*********************************************************/
/**/
/*LCD初始化设定*/
/**/
/*********************************************************/
voidinit_lcd()
{
delay1(15);
lcd_wcmd(0x01);//清除LCD的显示内容
lcd_wcmd(0x38);//16*2显示,5*7点阵,8位数据
delay1(5);
lcd_wcmd(0x38);
delay1(5);
lcd_wcmd(0x38);
delay1(5);
lcd_wcmd(0x0c);//显示开,关光标
delay1(5);
lcd_wcmd(0x06);//移动光标
delay1(5);
lcd_wcmd(0x01);//清除LCD的显示内容
delay1(5);
}
/*********************************************************/
//
/*********************************************************/
voiddelay()
{
ucharj;
for(j=250;j>0;j--);
}
/*********************************************************/
/**/
/*写字符串函数*/
/**/
/*********************************************************/
voidwrite_str(ucharaddr,uchar*p)
{
uchari=0;
lcd_wcmd(addr);
while(p[i]!
='\0')
{
lcd_wdat(p[i]);
i++;
}
}
/*********************************************************/
/**/
/*设定显示位置*/
/**/
/*********************************************************/
voidwrite_position(ucharrow,ucharcol)
{
ucharplace;
if(row==1)
{
place=0x80+col-1;
lcd_wcmd(place);
}
else
{
place=0xc0+col-1;
lcd_wcmd(place);
}
}
/*********************************************************/
/**/
/*自定义字符写入CGRAM*/
/**/
/*********************************************************/
voidwritetab()
{
unsignedchari;
lcd_wcmd(0x40);//写CGRAM
for(i=0;i<8;i++)
lcd_wdat(mytab[i]);
}
/**********************************************************/
//
/**********************************************************/
voidwrite_byte(ucharinbyte)
{
uchari;
for(i=0;i<8;i++)
{
sclk=0;//写的时候低电平改变数据
if(inbyte&0x01)
io=1;
else
io=0;
sclk=1;//写的时候高电平,把数据写入ds1302
_nop_();
inbyte=inbyte>>1;
}
}
/**********************************************************/
/**********************************************************/
ucharread_byte()//sclk的下跳沿读数据
{
uchari,temp=0;
io=1;//设置为输入口
for(i=0;i<7;i++)
{
sclk=0;
if(io==1)
temp=temp|0x80;
else
temp=temp&0x7f;
sclk=1;//产生下跳沿
temp=temp>>1;
}
return(temp);
}
/**********************************************************/
//往ds1302的某个地址写入数据
/**********************************************************/
voidwrite_ds1302(ucharcmd,ucharindata)
{
sclk=0;
reset=1;
write_byte(cmd);
write_byte(indata);
sclk=0;
reset=0;
}
/**********************************************************/
//读ds1302某地址的的数据
/**********************************************************/
ucharread_ds1302(ucharaddr)
{
ucharbackdata;
sclk=0;
reset=1;
write_byte(addr);//先写地址
backdata=read_byte();//然后读数据
sclk=0;
reset=0;
return(backdata);
}
/**********************************************************/
//设置初始时间
/**********************************************************/
voidset_ds1302(ucharaddr,uchar*p,ucharn)//写入n个数据
{
write_ds1302(0x8e,0x00);//写控制字,允许写操作
for(;n>0;n--)
{
write_ds1302(addr,*p);
p++;
addr=addr+2;
}
write_ds1302(0x8e,0x80);//写保护,不允许写
}
/**********************************************************/
//读取当前时间
/**********************************************************/
voidread_nowtime(ucharaddr,uchar*p,ucharn)
{
for(;n>0;n--)
{
*p=read_ds1302(addr);
p++;
addr=addr+2;
}
}
/**********************************************************/
//初始化DS1302
/**********************************************************/
voidinit_ds1302()
{
reset=0;
sclk=0;
write_ds1302(0x80,0x00);
write_ds1302(0x90,0xa6);//一个二极管+4K电阻充电
write_ds1302(0x8e,0x80);//写保护控制字,禁止写
}
/**************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 温度 控制系统 设计