单片机光敏电阻控制蜂鸣器_走进单片机|第七期:湿度检测
上篇推文介紹了以51單片機為控制核心來實現對傳感器的控制。本期推文將以電光學院“星火杯”中的優秀作品——基于51單片機的智能晾衣架為例,介紹51單片機在濕度檢測方面的應用。
(圖片來源:“星火杯”參賽隊伍湯玥? 李可欣? 曹宗青組)
基于51單片機的智能晾衣架設計原理
智能晾衣架設計思路:本設計采用單片機STC89C51作為自動晾衣架的檢測及控制核心,通過發光二極管顯示晾衣架的工作狀態,通過濕度傳感器與光敏電阻自動根據環境濕度和光線強度升降晾衣架,在此基礎上增加無線控制功能,提供更加方便的操作。
特點
1采用無線遙控控制方式。
2利用光敏電阻來智能識別光線,對衣架智能控制,天黑時自動收衣,天亮后自動晾衣。
3利用濕度傳感器,陰雨時自動收衣,天晴后自動晾衣。
4利用限位開關來控制晾衣架停止,防止超限,阻力過大,燒壞電機或者損壞機械。
(文字來源:“星火杯”參賽隊伍湯玥? 李可欣? 曹宗青組)
(圖片來源:“星火杯”參賽隊伍湯玥? 李可欣? 曹宗青組)
程序示例:
#include?? ? ? ? ? ? ? ? //調用單片機頭文件
#define uchar unsigned char ?//無符號字符型 宏定義 ? ? ? ?變量范圍0~255
#define uint ?unsigned int ? ? ? ? //無符號整型 宏定義 ? ? ? ?變量范圍0~65535
sbit beep = P1^4; ? //蜂鳴器
int flag_300ms ;
// ?按鍵的IO變量的定義
uchar key_can; ? ? ? ? ? ? ? ? //按鍵值的變量
sbit wh_led = P2^2; ?//溫度報警指示燈IO口定義
sbit wl_led = P2^3; ?//溫度報警指示燈IO口定義
sbit sh_led = P2^1; ?//濕度報警指示燈IO口定義
sbit sl_led = P2^0; ?//濕度報警指示燈IO口定義
uchar flag_en = 1;
uchar menu_1; ? ? ? ?//菜單設計的變量
uint t_high = 35,t_low = 10; ? ? ? ?//溫度報警參數
uint s_high = 80,s_low = 10; ? ? ? ?//濕度報警參數
/***************************************************************
* 名稱 : delay_1ms()
* 功能 : 延時1ms函數
* 輸入 : q
* 輸出 : 無
****************************************************************/
void delay_1ms(uint q)
{
? ? ? ? uint i,j;
? ? ? ? for(i=0;i
? ? ? ? ? ? ? ? for(j=0;j<120;j++);
}
sbit dht11=P1^5; ? ? ? ? //溫度傳感器IO口定義
uchar table_dht11[5]={1,2,3,4,5};
uchar code table_num[]="0123456789abcdefg";
sbit rs=P1^0; ? ? ? ? //寄存器選擇信號 H:數據寄存器 ? ? ? ? ?L:指令寄存器
sbit rw=P1^1; ? ? ? ? //寄存器選擇信號 H:數據寄存器 ? ? ? ? ?L:指令寄存器
sbit e =P1^2; ? ? ? ? //片選信號 ? 下降沿觸發
/********************************************************************
* 名稱 : delay_uint()
* 功能 : 小延時。
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void delay_uint(uint q)
{
? ? ? ? while(q--);
}
/********************************************************************
* 名稱 : write_com(uchar com)
* 功能 : 1602命令函數
* 輸入 : 輸入的命令值
* 輸出 : 無
***********************************************************************/
void write_com(uchar com)
{
? ? ? ? e=0;
? ? ? ? rs=0;
? ? ? ? rw=0;
? ? ? ? P0=com;
? ? ? ? delay_uint(25);
? ? ? ? e=1;
? ? ? ? delay_uint(100);
? ? ? ? e=0;
}
/********************************************************************
* 名稱 : write_data(uchar dat)
* 功能 : 1602寫數據函數
* 輸入 : 需要寫入1602的數據
* 輸出 : 無
***********************************************************************/
void write_data(uchar dat)
{
? ? ? ? e=0;
? ? ? ? rs=1;
? ? ? ? rw=0;
? ? ? ? P0=dat;
? ? ? ? delay_uint(25);
? ? ? ? e=1;
? ? ? ? delay_uint(100);
? ? ? ? e=0; ? ? ? ?
}
/***********************lcd1602上顯示特定的字符****0XDF 度********************/
void write_zifu(uchar hang,uchar add,uchar date)
{
? ? ? ? if(hang==1) ??
? ? ? ? ? ? ? ? write_com(0x80+add);
? ? ? ? else
? ? ? ? ? ? ? ? write_com(0x80+0x40+add);
? ? ? ? write_data(date); ? ? ? ?
}
/***********************lcd1602上顯示兩位十進制數************************/
void write_sfm2(uchar hang,uchar add,uint date)
{
? ? ? ? if(hang==1) ??
? ? ? ? ? ? ? ? write_com(0x80+add);
? ? ? ? else
? ? ? ? ? ? ? ? write_com(0x80+0x40+add);
? ? ? ? write_data(0x30+date/10%10);
? ? ? ? write_data(0x30+date%10); ? ? ? ?
}
/***********************lcd1602上顯示這字符函數************************/
void write_string(uchar hang,uchar add,uchar *p)
{
? ? ? ? if(hang==1) ??
? ? ? ? ? ? ? ? write_com(0x80+add);
? ? ? ? else
? ? ? ? ? ? ? ? write_com(0x80+0x40+add);
? ? ? ? ? ? ? ? while(1) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? if(*p == '') ?break;
? ? ? ? ? ? ? ? ? ? ? ? write_data(*p);
? ? ? ? ? ? ? ? ? ? ? ? p++;
? ? ? ? ? ? ? ? } ? ? ? ?
}
/***********************lcd1602初始化設置************************/
void init_1602() ? ? ? ?//lcd1602初始化
{
? ? ? ? write_com(0x38); ? ? ? ?
? ? ? ? write_com(0x0c);
? ? ? ? write_com(0x06);
? ? ? ? delay_uint(1000);
? ? ? ? write_string(1,0,"Wd:00 ?H00 ?L00 ? "); ? ? ? ?
? ? ? ? write_string(2,0,"Sd:00% H00% L00% "); ? ? ? ?
? ? ? ? write_zifu(1,5,0xdf); ? ? ? ?//顯示度 ? ? ? ? ? ? ? ?
? ? ? ? write_zifu(1,10,0xdf); ? ? ? ?//顯示度 ? ? ? ?
? ? ? ? write_zifu(1,15,0xdf); ? ? ? ?//顯示度 ? ? ? ?
? ? ? ? write_sfm2(1,3,table_dht11[2]); ? ? ? ? ? //顯示溫度
? ? ? ? write_sfm2(2,3,table_dht11[0]); ? //顯示濕度 ? ? ? ?
? ? ? ? write_sfm2(1,7,t_high); ? ? ? ? ?//顯示溫度
? ? ? ? write_sfm2(2,7,s_high); ? //顯示濕度 ? ? ? ? ? ? ? ?
? ? ? ? write_sfm2(1,10,t_low); ? ? ? ? ?//顯示溫度
? ? ? ? write_sfm2(2,10,s_low); ? //顯示濕度 ? ? ? ? ? ? ? ?
}
/********************獨立按鍵程序*****************/
uchar key_can; ? ? ? ? //按鍵值
void key() ? ? ? ? ? ? //獨立按鍵程序
{
? ? ? ? static uchar key_new;
? ? ? ? key_can = 20; ? ? ? ? ? ? ? //按鍵值還原
? ? ? ? P3 |= 0xf0;
? ? ? ? if((P3 & 0xf0) != 0xf0) ? ? ? ? ? ? ? ?//按鍵按下
? ? ? ? {
? ? ? ? ? ? ? ? delay_1ms(1); ? ? ? ? ? ? ? ? ? ? //按鍵消抖動
? ? ? ? ?? ? ? if(((P3 & 0xf0) != 0xf0) && (key_new == 1))
? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//確認是按鍵按下? ? ? ? ? ? ? ? ? ? ? ? key_new = 0;
switch(
switch(P3 & 0xf0)
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case 0xd0: key_can = 1; break; ? ? ? ? ? //得到k1鍵值
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case 0xb0: key_can = 2; break; ? ? ? ? ? //得到K2鍵值
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case 0x70: key_can = 3; break; ? ? ? ? ? //得到k3鍵值
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? }
? ? ? ? else?
? ? ? ? ? ? ? ? key_new = 1; ? ? ? ?
}
(代碼來源: http://news.eeworld.com.cn/mcu/ic480289.html)
(代碼來源: http://news.eeworld.com.cn/mcu/ic480289.html)
本次推文簡要介紹了單片機應用于智能晾衣架的實例與原理,同學們可以自己嘗試進性編程學習,后續的推文還將繼續介紹51單片機其他模塊的使用。
總結
以上是生活随笔為你收集整理的单片机光敏电阻控制蜂鸣器_走进单片机|第七期:湿度检测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019年最后的一天_2019最后一天的
- 下一篇: 拖链电缆 机器人电缆_洞头高柔性拖链网线