久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
基于51單片機的智能家居程序+電路設計
[打印本頁]
作者:
zssa
時間:
2020-6-8 13:35
標題:
基于51單片機的智能家居程序+電路設計
該
智能家居
基于
51
單片機
控制,
同時外接
DS1302
和
DS18B20
以及
LCD
液晶屏等,對智能家居智進行簡易的控制。
該設計運用到的芯片:
STC89C58+DS18B20+DHT11+DS1302+LCD12864+
紅外人體感應器
+
無線遙控
功能:
1.
數字可調萬年歷
2.
顯示空氣中溫度和濕度
3.
對環境溫度和濕度可以自動控制
4.
測量水的溫度
5.
無線控制
6.
防盜報警
7.
低功耗模式
8.
開機圖片
9.EEPROM
數據保存
原理圖設計:
圖片2.png
(107.57 KB, 下載次數: 29)
下載附件
2020-6-8 13:33 上傳
圖片1.png
(48.6 KB, 下載次數: 27)
下載附件
2020-6-8 13:34 上傳
單片機源程序如下:
/***************************************************************/
/* 智能家居控制系統
設計:劉東宇
2013.04
芯片:STC89C58+DS18B20+DHT11+DS1302+LCD12864+紅外人體感應器+無線遙控
功能:1.數字可調萬年歷
2.顯示空氣中溫度和濕度
3.對環境溫度和濕度可以自動控制
4.測量水的溫度
5.無線控制
6.防盜報警
7.低功耗模式
8.開機圖片
9.EEPROM數據保存 */
/***************************************************************/
#include<reg52.h>
#include<absacc.h>
#include<intrins.h>
#include"LCD12864.h"
#include"DS18B20.h"
#include"DS1302.h"
#include"delay_ms.h"
#include"key.h"
#include"DHT11.h"
#include"start_logo.h"
#include"picture.h"
#include"Flash_ROM.h"
/********************函數申明********************/
void init(); //初始化程序
void sleep_sign_init(); //睡眠(報警)模式初始化
void init_time_DHT11_DS18B20(); //初始化定時器T0和T1
void open_logo(); //開機圖片
void kay_scan(); //kay_scan 按鍵掃描程序
void display_time(); //display_time時間掃描(LCD12864顯示)
void alarm(); //溫濕度超值判斷
void sleep_sign(); //睡眠(報警)模式和正常模式切換函數
void sos_display(); //當聲光報警時LCD12864顯示“報警!”
/************位變量定義****************/
sbit lcd_lig=P2^4; //LCD12864背光控制
sbit relay1=P1^0; //繼電器1
sbit relay2=P1^1; //繼電器2
sbit voi_lig_sigo=P1^2; //聲光報警控制位
sbit key_sigo=P1^6; //睡眠(報警)模式進入按鍵
/************變量定義****************/
unsigned char code shu5[]={"0123456789"};
unsigned char code shu6[]={"年月日:"};
unsigned int k,T;
bit Interrupt_flag=1; //該標志位可以有效防止報警觸發后影響其他程序
bit sos=0; //LCD12864顯示報警標志位
void main()
{
init(); //初始化程序
lcd_lig=0; //開LCD背光
open_logo(); //開機LOGO
sleep_sign_init(); //睡眠(報警)模式初始化
init_lcd12864(); //初始化LCD12864
init_time_DHT11_DS18B20(); //初始化定時器T0和T1
DS18B20_caution(); //DS18B20溫度報警設置
while(1)
{
kay_scan(); //kay_scan 按鍵掃描程序
display_time(); //display_time 時間顯示掃描(LCD12864顯示)
alarm(); //溫濕度超值判斷
sleep_sign(); //睡眠(報警)模式和正常模式切換函數
sos_display(); //當聲光報警時LCD12864顯示“報警!”
}
}
/************************************************/
/****************程序初始化**********************/
/************************************************/
void init()
{
IAP_ReadCode(0x8000,&set_up_sd,1); //讀濕度閥值
IAP_ReadCode(0x800f,&set_up_wd,1); //讀溫度閥值
relay1=1; //繼電器1(濕度控制)
relay2=1; //繼電器2(溫度控制)
IP=0X0A; //中斷優先級設定,將定時器T0和T1設置為高級
sd_shi=0;
sd_ge=0;
wd_shi1=0;
wd_ge1=0;
dsq_0=0; //定時器T0
/***********DS1302初始化****************/
ds_io=0;
ds_rst=0;
ds_sclk=0; //DS1302初始化
ds_xieshu(0x8e,0x00); //控制
}
/*****************************************************/
/**************睡眠(報警)模式初始化*****************/
/*****************************************************/
void sleep_sign_init() //睡眠(報警)模式初始化
{
voi_lig_sigo=1; //初始化聲光報警控制位
key2=1; //初始化按鍵key2(睡眠報警模式進入鍵)
lcd_lig=0; //LCD12864背光控制位
TCON=0X55; //INT0設置為下降沿觸發,INT0設置為下降沿觸發
EX0=1; //開外部中斷INT0
EX1=0; //關外部中斷INT1
EA=1; //開總中斷
}
/**************************************/
/********初始化計時器T0和T1************/
/**************************************/
void init_time_DHT11_DS18B20() //初始化定時器T0和T1
{
TMOD=0X11; //定時器T0和T1工作于方式1
TH0=(65535-50000)/256; //給定時器T0裝初值
TL0=(65535-50000)%256;
TR0=1; //開定時器T0計數
ET0=1; //開定時器T0中斷
TH1=(65535-50000)/256; //給定時器T1裝初值
TL1=(65535-50000)%256;
TR1=1; //開定時器T1計數
ET1=1; //開定時器T1中斷
}
/************************************************/
/**************** 開機圖片 ********************/
/************************************************/
void open_logo()
{
display_bmp_logo(bmp_1); //寫入圖片1
delay(10000);
display_bmp_logo(bmp_2); //寫入圖片2
delay(10000);
display_bmp_logo(bmp_3); //寫入圖片3
delay(10000);
display_bmp_logo(bmp_4); //寫入圖片4
delay(10000);
display_bmp_logo(bmp_5); //寫入圖片5
delay(8000);
display_bmp_logo(bmp_6); //寫入圖片6
delay(8000);
display_bmp_logo(bmp_7); //寫入圖片7
delay(8000);
}
/************************************************/
/****************溫濕度報警檢測******************/
/************************************************/
void alarm() //溫濕度超值判斷
{
if(sign_sd>=set_up_sd) //濕度判斷
relay1=0; //繼電器1(降濕度控制)
else
relay1=1;
if(sign_wd>=set_up_wd) //溫度判斷
relay2=0; //繼電器2(降溫度控制)
else
relay2=1;
}
/***************************************************/
/*********************按鍵掃描程序******************/
/***************************************************/
void kay_scan() //kay_scan按鍵掃描程序
{
if(key1==0)
{
delay(20); //按鍵消抖
if(key1==0)
{
TR0=0; //關溫度和濕度掃描
TR1=0; //關水溫掃描
i=0;
i++;
miao=BCD_Decimal(ds_dushu(0x81)); //將現在顯示的數值賦給要進行調整的變量
fen=BCD_Decimal(ds_dushu(0x83)); //這樣在調時間的時候就不會出現從0開始調整
shi=BCD_Decimal(ds_dushu(0x85)); //這樣就可以在原來的數值上進行調整
xq=BCD_Decimal(ds_dushu(0x8b));
ri=BCD_Decimal(ds_dushu(0x87));
yue=BCD_Decimal(ds_dushu(0x89));
nian=BCD_Decimal(ds_dushu(0x8d));
shidu=set_up_sd; //將濕度當前值賦給要調節的值
wendu=set_up_wd; //將溫度當前值賦給要調節的值
if(i>=9) //可以直接將9改成1
i=1;
delay(20);
while(key1==0); //松手檢測
delay(20);
while(key1==0);
while(i) //當i大于0時進入按鍵掃描死循環,當i=0時跳出該循環
key(); //掃描按鍵
}
}
}
/*****************************************************/
/**************LCD12864 display時間掃描***************/
/*****************************************************/
void display_time() //display_time時間掃描(LCD12864顯示)
{
qushu_time(ds_dushu(0X81)); //秒
delay(1);
zhiling(0x88+6);
delay(1);
shuju(shu5[shi]);
delay(1);
shuju(shu5[ge]);
delay(1);
shuju(' ');
shuju(' ');
delay(1);
qushu_time(ds_dushu(0X83)); //分
delay(1);
zhiling(0x88+4);
delay(1);
shuju(shu5[shi]);
delay(1);
shuju(shu5[ge]);
delay(1);
shuju(':');
shuju(' ');
delay(1);
qushu_time(ds_dushu(0X85)); //時
delay(1);
zhiling(0x88);
delay(1);
shuju(0xca);
shuju(0xb1);
delay(1);
shuju(0xbc);
shuju(0xe4);
delay(1);
shuju(shu5[shi]);
delay(1);
shuju(shu5[ge]);
delay(1);
shuju(':');
shuju(' ');
delay(1);
qushu_time(ds_dushu(0X8b)); //星期
delay(1);
zhiling(0x90);
delay(1);
shuju(0xd0);
shuju(0xc7);
delay(1);
shuju(0xc6);
shuju(0xda);
delay(1);
shuju(shu5[ge]);
shuju(' ');
delay(1);
qushu_time(ds_dushu(0X87)); // 日
delay(1);
zhiling(0x80+5);
delay(1);
shuju(shu5[shi]);
delay(1);
shuju(shu5[ge]);
delay(1);
shuju(0xc8); //日
shuju(0xd5); //日
delay(1);
shuju(' '); //
shuju(' '); //
delay(1);
qushu_time(ds_dushu(0X89)); //月
delay(1);
zhiling(0x80+3);
delay(1);
shuju(shu5[shi]);
delay(10);
shuju(shu5[ge]);
delay(1);
shuju(0xd4); //月
shuju(0xc2); //月
delay(1);
qushu_time(ds_dushu(0X8d)); //年
delay(1);
zhiling(0x80);
delay(1);
shuju('2'); //2
shuju('0'); //0
delay(1);
shuju(shu5[shi]);
delay(1);
shuju(shu5[ge]);
delay(1);
shuju(0xc4); //年
shuju(0xea); //年
delay(1);
}
/*****************************************************/
/*******進入低功耗模式(報警模式)的按鍵檢測**********/
/*****************************************************/
void sleep_sign()
{
if(Interrupt_flag)
{
if(!key_sigo)
{
delay(5);
if(!key_sigo)
{
lcd_lig=1;
key2=1; //初始化按鍵key2(睡眠報警模式進入鍵)
voi_lig_sigo=1; //初始化聲光報警控制位
relay1=1; //繼電器1(濕度控制)
relay2=1; //繼電器2(溫度控制)
zhiling(0x08); //LCD12864進入睡眠模式
P0=0XFF; //初始化所有IO口,防止干擾出現
P1=0XFF;
P2=0XFF;
P3=0XFF;
delay(10);
EX1=1; //打開人體感應報警中斷
PCON=0X02; //51單片機進入掉電模
}
}
}
}
/************************************************/
/*******當聲光報警時LCD12864顯示“報警!”**********/
/************************************************/
void sos_display() //當聲光報警時LCD12864顯示“報警!”
{
while(sos) //判斷是否報警
{
display_bmp_logo(bmp_8); //寫入圖片8
if(!sos)
init_lcd12864(); //初始化LCD12864
}
}
/***************************************************************/
/*kay按鍵中斷,進入報警(休眠)模式和退出該模式(也是喚醒中斷)*/
/***************************************************************/
void sleep_int0() interrupt 0 //kay按鍵中斷,進入報警(休眠)模式和退出該模式(也是喚醒中斷)
{
Interrupt_flag=1;
voi_lig_sigo=1; //關閉報警
zhiling(0x0c); //將LCD12864從睡眠模式喚醒
lcd_lig=0; //打開LCD12864背光
EX1=0; //關閉人體感應報警中斷
TR0=1; //開溫度和濕度掃描
TR1=1; //開水溫掃描
sos=0; //LCD12864取消顯示“報警!”
}
/*****************************************************/
/****人體感應模式中斷(報警中斷,也是喚醒中斷)*******/
/*****************************************************/
void voi_lig_int1() interrupt 2 //人體感應模式中斷(報警中斷,也是喚醒中斷)
{
Interrupt_flag=0;
voi_lig_sigo=0; //開起報警
zhiling(0x0c); //將LCD12864從睡眠模式喚醒
lcd_lig=0;; //打開LCD12864背光
EX1=0; //關閉人體感應報警中斷
TR0=0; //開溫度和濕度掃描
TR1=0; //開水溫掃描
sos=1; //LCD12864顯示“報警!”
}
/**************************************/
/********計時器T0中斷函數DHT11*********/
/**************************************/
void time0_DHT11() interrupt 1 //定時器T0中斷,DHT11數據讀取程序
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
dsq_0++;
if(dsq_0==20)
{
TR1=0; //關定時器T1
ET1=0;
dsq_0=0;
w_s=return_wendu_shidu();
qushu_DHT11(w_s); //讀取溫度濕度
delay(1);
TR1=1; //開定時器T1
ET1=1;
}
}
/**************************************/
/********計時器T1中斷函數DS18B20*******/
/**************************************/
void time1_DS18B20() interrupt 3 //定時器T1中斷函數DS18B20,DHT11數據顯示程序
{ //T1中斷函數(中斷里面程序的運行時間要在50ms以內,此處中斷程序運行為8.753ms)
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
k++;
if(k==20)
{
TR0=0; //關定時器T0
ET0=0;
k=0;
T=return_wendu_DS18B20(); //讀取溫度
qushu_DS18B20(T); //分離溫度數值
/*****************************************/
/* display水的溫度*/
/******************************************/
delay(10);
zhiling(0x90+3);
delay(1);
shuju(0xcb); //水
shuju(0xae); //
delay(1);
shuju(0xce); //溫
shuju(0xc2); //
delay(1);
shuju(shu5[wd_shi]); //溫度十位
delay(1);
shuju(shu5[wd_ge]); //溫度個位
delay(1);
shuju('.'); //小數點
delay(1);
shuju(shu5[wd_xiao1]); //溫度小數0.1位
delay(1);
shuju(0xa1); //顯示℃(本來為溫度小數0.01位 )
shuju(0xe6); //顯示℃(本來為溫度小數0.01位 )
/*****************************************/
/* display環境的溫度和濕度,注:本來下面的
這段display應該是放在定時器T0中斷函數中
但是那樣會對顯示產生印象,所以選擇同時寫入,
也介于LCD12864屏幕的特點,第二行的地址和第
四行地址是連在一起的*/
/******************************************/
zhiling(0x98);
delay(1);
shuju(0xca); //濕
shuju(0xaa); //
delay(1);
shuju(0xb6); //度
shuju(0xc8); //
delay(1);
shuju(shu5[sd_shi]); //濕度十位
delay(1);
shuju(shu5[sd_ge]); //濕度個位
delay(1);
shuju(0xa3); //%
shuju(0xa5); //
delay(1);
shuju(0xce); //溫
shuju(0xc2); //
delay(1);
shuju(0xb6); //度
shuju(0xc8); //
delay(1);
shuju(shu5[wd_shi1]); //溫度十位
delay(1);
shuju(shu5[wd_ge1]); //溫度個位
delay(1);
shuju(0xa1); //顯示℃
shuju(0xe6); //顯示℃
TR0=1; //開定時器T0
ET0=1;
}
}
復制代碼
所有資料51hei提供下載:
原理圖.zip
(36.87 KB, 下載次數: 73)
2020-6-8 13:34 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
源程序.zip
(134.66 KB, 下載次數: 68)
2020-6-8 13:35 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
a1572323673
時間:
2020-6-11 20:00
感謝樓主分享
作者:
Realiu
時間:
2020-6-12 14:27
感謝樓主分享
作者:
穗徽
時間:
2025-4-23 19:17
感謝樓主分享
作者:
xdco
時間:
2025-5-12 09:52
好思路,謝謝分享
作者:
newforce
時間:
2025-5-18 08:43
感謝樓主分享
作者:
ly_zhy
時間:
2025-5-25 16:56
不錯,思路清新,實用性強。
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
精品欧美一区二区三区免费观看
|
av电影手机版
|
91在线观看视频
|
久久精品久久久
|
男人的天堂在线视频
|
日韩一区二区三区在线观看
|
日韩av美女电影
|
日本aa毛片a级毛片免费观看
|
午夜性色a√在线视频观看9
|
成人黄色在线
|
国产不卡一区在线观看
|
97在线观看
|
91精品国产91久久久久福利
|
久久精品视频一区二区三区
|
www.久草.com
|
国产高清在线观看
|
国产在线精品一区二区三区
|
久久黄网
|
国产精品欧美一区二区三区不卡
|
国产福利91精品
|
欧洲免费视频
|
久久激情网
|
欧美一级欧美三级在线观看
|
自拍偷拍3p
|
国产成人精品一区二区三区
|
欧美一区二区精品
|
美国黄色毛片
|
国产成人免费视频
|
国产精品一区久久久
|
久久综合狠狠综合久久
|
日韩精品一区在线
|
欧美特级黄色
|
wwwxx在线观看
|
久久av一区
|
久久亚洲精品久久国产一区二区
|
亚洲三区视频
|
日韩欧美日韩在线
|
国产亚洲精品久久久久久豆腐
|
在线中文字幕视频
|
国际精品久久
|
欧美精品一二三区
|