基于单片机的温湿度控制器设计.docx
- 文档编号:30323995
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:26
- 大小:1MB
基于单片机的温湿度控制器设计.docx
《基于单片机的温湿度控制器设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的温湿度控制器设计.docx(26页珍藏版)》请在冰豆网上搜索。
基于单片机的温湿度控制器设计
嵌入式系统应用
基于单片机的温湿度控制器
一、实验要求
设计一个温度测控系统(温度信号使用相应的传感器输入),利用键盘或上位机通信方式设置报警上下限值,利用数码LED或液晶模块或通过上位机进行当前值和报警值的显示。
当前值超过上限值或下限值的时候,蜂鸣器发出不同的报警声音。
二、实验分析
实验主要分为硬件设计和程序设计两部分。
硬件设计
为了实现功能,应使用合适款型的单片机,提供的单片机型号为STC公司的IAP15FCK61S2。
传感器选用的是操作简单、精度较高的DS18B20温度传感器。
蜂鸣器选型方面,有源或者无源对实验效果影响不大,但应该注意使用三极管驱动,否则无论使用I/O口灌电流或者拉电流都无法达到其电流大小的要求。
温度显示方面,此处放弃了数码管或者液晶等较为常规的方式,而是使用蓝牙模块,与安卓手机通信,完成数据传递和数值控制的功能,连接方便,且功耗较低。
电源方面,使用9V碱性电池,并使用LM7805降压至5V后,给单片机及其他部分供电。
原理图在文档后附上。
程序设计
程序方面,包括单片机下位机程序和手机上位机程序。
单片机程序总体比较简单。
在进行完单片机必要的相关程序配置之后,还要有针对性的对用到的代码块进行编程。
对于温度传感器DS18B20,使用软件模拟onewire通信协议,进行数据通信(见源码ds18b20.h、ds18b20.c)。
由于使用的是蓝牙串口模块,故需要对串行通信进行初始化和软件调用(见源码sci.h、sci.c)。
各个模块调整完毕后,还需要对传感器采集到的值与设定的温度上限限进行比较并根据不同的异常反映到蜂鸣器上,而且需要对接收到的上位机的值进行处理等工作,还需要程序协调各项工作的时序关系(见源码deal.h、deal.c)。
最后,也是最重要的部分,设置程序的入口,统筹整个工程的工作(见源码main.h、main.c)。
手机上位机程序中,主要完成了对蓝牙的配对连接、数据接收、数据显示和数据修改功能。
因为Android程序所包含的不仅仅是数据处理本身,还有很多对系统底层的配置和资源的调用部分,故代码无法全部给出,仅在附录中将数据通信、校验、处理和发送部分录入(见源码TMP.java)。
三、实验过程
完成实验要求分析后,首先进行硬件设计。
单片机选型方面,并未使用提供的IAP15F2K61S2型单片机。
因为之前有过使用STC公司另一款增强型51单片机STC12C5A16S2进行开发设计的经验,而且设计了成型的PCB板图,并发厂制作。
在征得老师同意后,选用此类型单片机,并以原先设计好的PCB板作为硬件平台。
电源部分,PCB板图已经计划并设计完成。
使用9V碱性电池,经过LM7805及多个电容降压、稳压之后,给整个系统供电。
这种供电方式的优点是,不需要使用外接的电源,器件少,稳定性好等。
当然,也有不足。
LM7805本身发热严重,而9V电池本身放电电流较小,无法支持较大功耗的器件。
主控单片机需要搭建最小系统。
使用11.0592MHz的无缘晶振作为单片机外部晶振,并连接两个33pF的电容帮助起振。
因为单片机本身有着上电复位功能,所以并未在外部给出复位电路。
引出单片机的P3.0、P3.1引脚(即TXD、RXD),作程序烧写和蓝牙串口通信用。
系统外围的外设很少,只有一个DS18B20温度传感器,一个蜂鸣器、一个LED灯,具体电路较为简单,不详细解释。
硬件部分设计制作完成并调试无误后,进行程序设计。
首先确认各个外设工作正常。
然后,依次进行点亮LED灯、蜂鸣器鸣响、串口数据传输、DS18B20数据采集、定时器功能配置等工作。
完成后,将各个部分时序协调完毕再进行手机上位机程序设计。
因手机部分与课程相关性不大,不过多赘述。
单片机程序时序分配见以下的程序设计框图。
程序设计框图
Y
N
软件设计过程中,遇到的最大问题就是手机与蓝牙的通信。
由于担心干扰的发生会引起数据的错误,所以在发送端和接收端都进行了数据校验。
开始选用的是加和校验法,发现很难收到正常的帧,导致无法进行数据传输。
之后采用标志位校验法,虽然有时会出现数据错乱,但是大部分时间都是正常的。
对于此系统来说,个别的错误数据对整体来说,影响不大,故没有再进一步优化。
附录1:
单片机程序源码
main.h
#ifndef_MAIN_H
#define_MAIN_H
#include"stc12c5a60s2.h"
#include"intrins.h"
#include"sci.h"
#include"ds18b20.h"
#include"deal.h"
sbitBEEP=P2^7;
sbitLED=P1^2;
externunsignedchartmp_top;
externunsignedchartmp_bot;
externunsignedchartmp;
externunsignedchartmp_flag;
externunsignedcharrec[4];
#endif
main.c
#include"main.h"
unsignedchartmp_top=40;
unsignedchartmp_bot=15;
unsignedchartmp;
unsignedchartmp_flag=0;
unsignedcharrec[4];
voidmain()
{
init_uart();
BEEP=1;
while(!
init_18b20());
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while
(1)
{
tmp=tmp_read();
putchar(0X70);
putchar(tmp);
putchar(tmp_bot);
putchar(tmp_top);
send_delay();
check();
}
}
voidUART_SER(void)interrupt4
{
staticunsignedcharrec_flag=0;
staticunsignedcharche_flag=0;
staticunsignedcharrec_count=1;
staticunsignedcharTemp;
if(RI)
{
RI=0;
Temp=SBUF;
if(Temp==0X8A)
{
rec[0]=Temp;
rec_flag=1;
}
if(che_flag==1&&rec[0]==0x8A)
{
rec[rec_count]=Temp;
rec_count++;
if(rec_count==3&&tmp_top>tmp_bot)
{
rec_count=1;
tmp_bot=rec[1];
tmp_top=rec[2];
rec_flag=0;
che_flag=0;
}
}
if(rec_flag==1)
{
che_flag=1;
rec_flag=0;
}
}
if(TI)
TI=0;
}
voidtimer()interrupt1
{
staticunsignedchartt=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tmp_flag)
{
if(tmp_flag==1)
{
if(tt>5)
{
LED=~LED;
BEEP=~BEEP;
tt=0;
}
}
if(tmp_flag==2)
{
if(tt>20)
{
LED=~LED;
BEEP=~BEEP;
tt=0;
}
}
}
if(tt>20)
{
tt=0;
}
if(!
tmp_flag)
{
BEEP=1;
LED=0;
}
}
sci.h
#ifndef_SCI_H
#define_SCI_H
#include"main.h"
voidinit_uart();
voidputchar(unsignedchari);
#endif
sci.c
#include"sci.h"
voidinit_uart()
{
PCON&=0x7f;//波特率不倍速
SCON=0x50;//8位数据,可变波特率
BRT=0xFD;//设定独立波特率发生器重装值
AUXR|=0x04;//独立波特率发生器时钟为Fosc,即1T
AUXR|=0x01;//串口1选择独立波特率发生器为波特率发生器
AUXR|=0x10;//启动独立波特率发生器
EA=1;
ES=1;
}
voidputchar(unsignedchari)
{
ES=0;//关串口中断
TI=0;//清零串口发送完成中断请求标志
SBUF=i;
while(TI==0);//等待发送完成
TI=0;//清零串口发送完成中断请求标志
ES=1;//允许串口中断
}
ds18b20.h
#ifndef_SCI_H
#define_SCI_H
#include"main.h"
sbitDS=P1^1;
bitinit_18b20();
voidwrite_byte(unsignedcharval);
intread_byte(void);
read_temp();
voiddelayms(unsignedintj);
#endif
ds18b20.c
#include"ds18b20.h"
voiddelay10us(unsignedintn)//10us@12.000MHz
{
unsignedchari;
while(n){
_nop_();
i=25;
while(--i);
n--;
}
}
bitinit_18b20()
{
bitflag;
inttime;
DS=1;
//delay10us
(1);
for(time=0;time<2;time++);
DS=0;
//delay10us(60);
for(time=0;time<200;time++);
DS=1;
//delay10us(3);
for(time=0;time<10;time++);
flag=DS;
//delay10us(60);
for(time=0;time<200;time++);
return(flag);
}
voidwrite_byte(unsignedcharval)//写一个命令函数
{
unsignedchari;//先写低位在写高位
for(i=0;i<8;i++)
{
DS=1;
_nop_();
_nop_();
DS=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
DS=val&0x01;
delay10us(6);
val=val>>1;
}
DS=1;
delay10us
(2);
}
intread_byte(void)
{
unsignedchari;
unsignedcharvalue=0;
for(i=0;i<8;i++)
{
DS=1;
_nop_();
_nop_();
value>>=1;
DS=0;
_nop_();
_nop_();
_nop_();
_nop_();
DS=1;//人为拉高,总线有拉低的功能没有拉低的功能,若是0则总线拉低
_nop_();
_nop_();
_nop_();
_nop_();
if(DS)
value|=0x80;
delay10us(6);
}
DS=1;
return(value);
}
read_temp()
{
init_18b20();
write_byte(0xCC);//发SkipROM命令
write_byte(0x44);//发读命令
delay10us(10);
init_18b20();
write_byte(0xCC);//SkipROM
write_byte(0xbe);//发转换命令
}
voiddelayms(unsignedintj)
{
inti=0;
while(j){
for(i=0;i<125;i++);
j--;
}
}
deal.h
#ifndef_SCI_H
#define_SCI_H
#include"main.h"
#include"sci.h"
voidcheck();
unsignedchartmp_read();
voidsend_delay();
voiddelay_s(unsignedint);
#endif
deal.c
#include"deal.h"
voidcheck()
{
if(tmp_top { tmp_flag=1; } elseif(tmp_bot>tmp) { tmp_flag=2; } else { tmp_flag=0; } } voidsend_delay() { delay_s(50000); delay_s(50000); delay_s(50000); delay_s(50000); delay_s(50000); delay_s(50000); delay_s(50000); delay_s(50000); delay_s(50000); delay_s(50000); delay_s(50000); delay_s(50000); } unsignedchartmp_read() { unsignedchartmp_get,TL,TH; read_temp();//读温度准备 TL=read_byte();//先读的是温度值低位 TH=read_byte();//接着读的是温度值高位 tmp_get=TH*16+TL/16;//实际温度值=(TH*256+TL)/16,即: TH*16+TL/16 returntmp_get; } voiddelay_s(unsignedinttt) { while(tt--); } 附录2: 手机上位机关键代码 publicclassBluetoothChatextendsActivity{ //调试 privatestaticfinalStringTAG="BluetoothChat"; privatestaticbooleanD=true; privatestaticfinalStringinfo="junge"; //类型的消息发送从bluetoothchatservice处理程序 publicstaticfinalintMESSAGE_STATE_CHANGE=1; publicstaticfinalintMESSAGE_READ=2; publicstaticfinalintMESSAGE_WRITE=3; publicstaticfinalintMESSAGE_DEVICE_NAME=4; publicstaticfinalintMESSAGE_TOAST=5; publicstaticfinalStringBluetoothData="fullscreen"; publicStringfilename="";//用来保存存储的文件名 privateStringnewCode=""; privateStringnewCode2=""; privateStringfmsg="";//保存用数据缓存 //键名字从收到的bluetoothchatservice处理程序 publicstaticfinalStringDEVICE_NAME="device_name"; publicstaticfinalStringTOAST="toast"; //独特的是这个应用程序 privatestaticfinalUUIDMY_UUID=UUID .fromString("00001101-0000-1000-8000-00805F9B34FB"); //Intent需要编码 publicstaticfinalintREQUEST_CONNECT_DEVICE=1; privatestaticfinalintREQUEST_ENABLE_BT=2; //布局控件 privateTextViewmTitle; privateEditTextmInputEditText; privateEditTextmOutEditText; privateEditTextmOutEditText2; privateButtonmSendButton; privateCheckBoxHEXCheckBox; privateButtonbreakButton; privateCheckBoxcheckBox_sixteen; privateButtonTempUpPlus; privateButtonTempUpMinus; privateButtonTempDownPlus; privateButtonTempDownMinus; //名字的连接装置 privateStringmConnectedDeviceName=null; //传出消息的字符串缓冲区 privateStringBuffermOutStringBuffer; //当地的蓝牙适配器 privateBluetoothAdaptermBluetoothAdapter=null; //成员对象的聊天服务 privateBluetoothChatServicemChatService=null; //设置标识符,选择用户接受的数据格式 privatebooleandialogs; //第一次输入加入-->变量 privateintsum=1; privateintUTF=1; //名社民党记录当创建服务器套接字 Stringmmsg=""; Stringmmsg2=""; //声明控制指令 privatebyte[]getCtr=newbyte[32]; privateintcount; privatebooleanisUnlock=false; //声明控制控件 privateButtonbtnSave=null; privateEditTextrowP=null; privateEditTextrowD=null; privateTextViewshowTemp=null; privateintUPVAL=15; privateintDOWNVAL=40; @SuppressLint("NewApi") @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); D=false; if(D) Log.e(TAG,"+++ONCREATE+++"); Log.i(info,""+dialogs); //设置窗口布局 requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.main); getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title); //实例化控制控件 btnSave=(Button)findViewById(R.id.btn_save); rowP=(EditText)findViewById(R.id.row_p); rowD=(EditText)findViewById(R.id.row_d); showTemp=(TextView)findViewById(R.id.text_temp); TempUpPlus=(Button)findViewById(R.id.btn_TU_Up); TempUpMinus=(Button)findViewById(R.id.btn_TU_Down); TempDownPlus=(Button)findViewById(R.id.btn_TL_Up); TempDownMinus=(Button)findViewById(R.id.btn_TL_Down); rowP.setInputType(InputType.TYPE_CLASS_TEXT); rowP.setText(Integer.toString(UPVAL)); rowP.setInputType(InputType.TYPE_CLASS_NUMBER); rowD.setInputType(InputType.TYPE_CLASS_TEXT);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 温湿度 控制器 设计