粮仓温度控制系统完整C文档.docx
- 文档编号:27561472
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:27
- 大小:19.56KB
粮仓温度控制系统完整C文档.docx
《粮仓温度控制系统完整C文档.docx》由会员分享,可在线阅读,更多相关《粮仓温度控制系统完整C文档.docx(27页珍藏版)》请在冰豆网上搜索。
粮仓温度控制系统完整C文档
#include
#include"1602.h"
#include"dht.h"
#include"2402.h"
//定义三个LED灯
sbitLed_qushi=P1^6;//去湿灯
sbitLed_jiangwen=P1^5;//降温灯
sbitLed_shengwen=P1^4;//升温灯
sbitKey_TH1=P3^2;
sbitKey_TH2=P3^3;
sbitKey_HH1=P3^4;
sbitKey_HH2=P3^5;
//定义标识
volatilebitFlagStartRH=0;//开始温湿度转换标志
volatilebitFlagKeyPress=0;//有键按下
//定义温湿度传感器用外部变量
externU8U8FLAG,k;
externU8U8count,U8temp;
externU8U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
externU8U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
externU8U8comdata;
externU8count,count_r;
U16temp;
S16temperature,humidity;
S16idataTH,HH;//温度上限和湿度上限
char*pSave;
U8keyvalue,keyTH1,keyTH2,keyHH1,keyHH2;
//定义变量
U16RHCounter;
//数据初始化
voidData_Init()
{
RHCounter=0;
Led_qushi=1;
Led_jiangwen=1;
Led_shengwen=1;
TH=40;
HH=85;
keyvalue=0;
keyTH1=1;
keyTH2=1;
keyHH1=1;
keyHH2=1;
}
//定时器0初始化
voidTimer0_Init()
{
ET0=1;//允许定时器0中断
TMOD=1;//定时器工作方式选择
TL0=0x06;
TH0=0xf8;//定时器赋予初值
TR0=1;//启动定时器
}
//定时器0中断
voidTimer0_ISR(void)interrupt1using0
{
TL0=0x06;
TH0=0xf8;//定时器赋予初值
//每2秒钟启动一次温湿度转换
RHCounter++;
if(RHCounter>=1000)
{
FlagStartRH=1;
RHCounter=0;
}
}
//存入设定值、
voidSave_Setting()
{
pSave=(char*)&TH;//地址低位对应低8位,高位对应高8位
wrteeprom(0,*pSave);//存温度上限值TH低8位
DELAY(500);
pSave++;
wrteeprom(1,*pSave);//存温度上限值TH高8位
DELAY(500);
pSave=(char*)&HH;
wrteeprom(2,*pSave);//存湿度上限值RH低8位
DELAY(500);
pSave++;
wrteeprom(3,*pSave);//存湿度上限值RH高8位
DELAY(500);
}
//载入设定值、
voidLoad_Setting()
{
pSave=(char*)&TH;
*pSave++=rdeeprom(0);
*pSave=rdeeprom
(1);
pSave=(char*)&HH;
*pSave++=rdeeprom
(2);
*pSave=rdeeprom(3);
if((TH>99)||(TH<0))TH=40;
if((HH>99)||(HH<0))HH=85;
}
voidKeyProcess(uintnum)
{
switch(num)
{
case1:
if(TH<99)TH++;
L1602_char(1,15,TH/10+48);
L1602_char(1,16,TH%10+48);
break;
case2:
if(TH>1)TH--;
L1602_char(1,15,TH/10+48);
L1602_char(1,16,TH%10+48);
break;
case3:
if(HH<99)HH++;
L1602_char(2,15,HH/10+48);
L1602_char(2,16,HH%10+48);
break;
case4:
if(HH>1)HH--;
L1602_char(2,15,HH/10+48);
L1602_char(2,16,HH%10+48);
break;
default:
break;
}
Save_Setting();
}
/********************************************************************
*名称:
Main()
*功能:
主函数
***********************************************************************/
voidmain()
{
U16i,j,testnum;
EA=0;
Timer0_Init();//定时器0初始化
Data_Init();
EA=1;
L1602_init();
L1602_string(1,1,"WelcometoT&H");
L1602_string(2,1,"ControlSystem!
");
//延时
for(i=0;i<1000;i++)
for(j=0;j<1000;j++)
{;}
//清屏
L1602_string(1,1,"");
L1602_string(2,1,"");
L1602_string(1,1,"Tem:
CTH:
");
L1602_string(2,1,"Hum:
%HH:
");
//载入温度上限和湿度上限设定值
Load_Setting();
L1602_char(1,15,TH/10+48);
L1602_char(1,16,TH%10+48);
L1602_char(2,15,HH/10+48);
L1602_char(2,16,HH%10+48);
while
(1)
{
//温湿度转换标志检查
if(FlagStartRH==1)
{
TR0=0;
testnum=RH();
FlagStartRH=0;
TR0=1;
//读出温湿度,只取整数部分
humidity=U8RH_data_H;
temperature=U8T_data_H;
//显示温湿度
L1602_int(1,5,temperature);
L1602_int(2,5,humidity);
}
//温湿度控制
if(temperature>TH)Led_jiangwen=0;
elseLed_jiangwen=1;//降温
if(humidity>HH)Led_qushi=0;
elseLed_qushi=1;//去湿
//键盘查询,在弹起时响应
if((Key_TH1)&&(keyTH1==0)){FlagKeyPress=1;keyvalue=1;}
elseif((Key_TH2)&&(keyTH2==0)){FlagKeyPress=1;keyvalue=2;}
elseif((Key_HH1)&&(keyHH1==0)){FlagKeyPress=1;keyvalue=3;}
elseif((Key_HH2)&&(keyHH2==0)){FlagKeyPress=1;keyvalue=4;}
if(FlagKeyPress==1)
{
KeyProcess(keyvalue);
FlagKeyPress=0;
}
if(!
Key_TH1)keyTH1=0;
elsekeyTH1=1;
if(!
Key_TH2)keyTH2=0;
elsekeyTH2=1;
if(!
Key_HH1)keyHH1=0;
elsekeyHH1=1;
if(!
Key_HH2)keyHH2=0;
elsekeyHH2=1;
}
}
/********************************************************************
*文件名:
液晶1602显示.c
*描述:
该程序实现了对液晶1602的控制。
***********************************************************************/
#include"1602.h"
#include"math.h"
/********************************************************************
*名称:
delay()
*功能:
延时,延时时间大概为140US。
*输入:
无
*输出:
无
***********************************************************************/
voiddelay()
{
inti,j;
for(i=0;i<=10;i++)
for(j=0;j<=2;j++)
;
}
/********************************************************************
*名称:
Convert(ucharIn_Date)
*功能:
因为电路设计时,P0.0--P0.7接法刚好了资料中的相反,所以设计该函数。
*输入:
1602资料上的值
*输出:
送到1602的值
***********************************************************************/
ucharConvert(ucharIn_Date)
{
/*
uchari,Out_Date=0,temp=0;
for(i=0;i<8;i++)
{
temp=(In_Date>>i)&0x01;
Out_Date|=(temp<<(7-i));
}
returnOut_Date;
*/
returnIn_Date;
}
/********************************************************************
*名称:
enable(uchardel)
*功能:
1602命令函数
*输入:
输入的命令值
*输出:
无
***********************************************************************/
voidenable(uchardel)
{
P0=Convert(del);
RS=0;
RW=0;
E=0;
delay();
E=1;
delay();
}
/********************************************************************
*名称:
write(uchardel)
*功能:
1602写数据函数
*输入:
需要写入1602的数据
*输出:
无
***********************************************************************/
voidwrite(uchardel)
{
P0=Convert(del);
RS=1;
RW=0;
E=0;
delay();
E=1;
delay();
}
/********************************************************************
*名称:
L1602_init()
*功能:
1602初始化,请参考1602的资料
*输入:
无
*输出:
无
***********************************************************************/
voidL1602_init(void)
{
enable(0x01);
enable(0x38);
enable(0x0c);
enable(0x06);
enable(0xd0);
}
/********************************************************************
*名称:
L1602_char(ucharhang,ucharlie,charsign)
*功能:
改变液晶中某位的值,如果要让第一行,第五个字符显示"b",调用该函数如下
L1602_char(1,5,'b')
*输入:
行,列,需要输入1602的数据
*输出:
无
***********************************************************************/
voidL1602_char(ucharhang,ucharlie,charsign)
{
uchara;
if(hang==1)a=0x80;
if(hang==2)a=0xc0;
a=a+lie-1;
enable(a);
write(sign);
}
/********************************************************************
*名称:
L1602_string(ucharhang,ucharlie,uchar*p)
*功能:
改变液晶中某位的值,如果要让第一行,第五个字符开始显示"abcdef",调用该函数如下
L1602_string(1,5,"abcdef;")
*输入:
行,列,需要输入1602的数据
*输出:
无
***********************************************************************/
voidL1602_string(ucharhang,ucharlie,uchar*p)
{
uchara;
if(hang==1)a=0x80;
if(hang==2)a=0xc0;
a=a+lie-1;
enable(a);
while
(1)
{
if(*p=='\0')break;
write(*p);
p++;
}
}
//显示整型的温湿度数据用,共占用4位,其中一位符号位
voidL1602_int(ucharhang,ucharlie,intnum)
{
uinttemp;
uintgewei,shiwei,baiwei,sign;
if(num>=0)
{
sign=0;
}
else
{
sign=1;
}
temp=abs(num);
baiwei=temp/100;
temp=temp-baiwei*100;
shiwei=temp/10;
gewei=temp-shiwei*10;
num=abs(num);
if(num>=100)
{
if(sign==1)//负数
{
L1602_char(hang,lie,'-');
}
L1602_char(hang,lie+1,baiwei+48);
L1602_char(hang,lie+2,shiwei+48);
L1602_char(hang,lie+3,gewei+48);
}
elseif(num>=10)
{
if(sign==1)
{
L1602_char(hang,lie+1,'-');
}
L1602_char(hang,lie+2,shiwei+48);
L1602_char(hang,lie+3,gewei+48);
}
else
{
if(sign==1)
{
L1602_char(hang,lie+2,'-');
}
L1602_char(hang,lie+3,gewei+48);
}
}
#include
#defineucharunsignedchar
#defineuintunsignedint
//这三个引脚参考资料
sbitE=P2^5;//1602使能引脚
sbitRW=P2^6;//1602读写引脚
sbitRS=P2^7;//1602数据/命令选择引脚
voiddelay();
ucharConvert(uchar);
voidenable(uchar);
voidwrite(uchar);
voidL1602_init(void);
voidL1602_char(uchar,uchar,char);
voidL1602_string(uchar,uchar,uchar*);
voidL1602_int(uchar,uchar,int);
#include"2402.h"
/*********************************
BASEDRIVE
**********************************/
voidDELAY(unsignedintt)
{
while(t!
=0)
t--;
}
/******************************
IICDRIVE
******************************/
voidIICStart(void)
{
SCL=0;
DELAY
(1);
SDA=1;SCL=1;DELAY
(1);
SDA=0;DELAY
(1);
SCL=0;
}
voidIICStop(void)
{
SDA=0;SCL=1;DELAY
(1);
SDA=1;DELAY
(1);
SCL=0;
}
voidSEND0(void)
{
SDA=0;
SCL=1;
DELAY
(1);
SCL=0;
}
voidSEND1(void)
{
SDA=1;
DELAY
(1);
SCL=1;
DELAY
(1);
SCL=0;
}
bitCheck_Ack(void)
{
unsignedcharerrtime=250;
DELAY
(1);
SCL=1;
DELAY
(1);
CY=SDA;
while(CY)
{
errtime--;
CY=SDA;
if(!
errtime)
{
IICStop();
return1;
}
}
DELAY
(1);
SCL=0;
return0;
}
voidWrite_byte(unsignedchardat)
{
unsignedchari;
for(i=0;i<8;i++)
{
if((dat<
SEND1();
else
SEND0();
}
}
unsignedcharRead_byte(void)
{
unsignedchari,temp=0;
for(i=0;i<8;i++)
{
SDA=1;
SCL=1;
DELAY
(1);
if(SDA==1)
{
temp=temp<<1;
temp=temp|0x01;
}
else
temp=temp<<1;
SCL=0;
}
returntemp;
}
/************************************
EEPROMDRIVE
Addr:
from0x00-->
*************************************/
unsignedcharrdeeprom(unsignedcharaddr)
{
unsignedchartemp=0;
bitflag=0;
IICStart();
Write_byte(0xa0);
Check_Ack();
Write_byte(addr);
Check_Ack();
IICStart();
Write_byte(0xa1);
Check_Ack();
temp=Read_byte();
SEND1();
IICStop();
returntemp;
}
voidwrteeprom(unsignedcharaddr,unsignedchardat)
{
IICStart();
Write_byte(0xa0);
Che
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 粮仓 温度 控制系统 完整 文档