本次設計利用Keil軟件對程序進行編譯仿真并成功實現衣物自動出室晾曬和收回室內的功能。系統的實物硬件核心是51單片機,檢測器件是溫濕度傳感器和光強傳感器,執行器件是步進電機。系統功能實現的過程是:溫濕度傳感器和光敏元件采集外界環境的物理量并將信息傳送給單片機,單片機對信號分析處理后控制步進電機旋轉,步進電機帶動晾衣架的伸縮。當天氣狀況是有雨或傍晚時,晾衣桿主動收回衣物;當天氣狀況是晴朗且無雨時,晾衣桿自動伸出室外。
設計包含電路設計原理圖、C程序代碼以及相關照片。請大家多指教。
0.png (104.73 KB, 下載次數: 50)
下載附件
2019-2-23 15:58 上傳
單片機源程序如下:
- #include <reg52.h> //調用單片機頭文件
- #define uchar unsigned char //無符號字符型 宏定義 變量范圍0~255
- #define uint unsigned int //無符號整型 宏定義 變量范圍0~65535
- #include <intrins.h>
- //數碼管段選定義 0 1 2 3 4 5 6 7 8 9
- uchar smg_du[]={0xFC,0x30,0xD4,0xB5,0x79,0xAD,0xE8,0x34,0xF1,0xBD
- }; //斷碼
- uchar dis_smg[8] ={0};
- sbit smg_we1 = P2^7; //數碼管位選定義
- sbit smg_we2 = P2^6;
- unsigned char code zheng[4]={0xf8,0xf4,0xf2,0xf1};//正轉表格
- unsigned char code fan[4]={0xf1,0xf2,0xf4,0xf8};//反轉表格
- uchar flag_z_f; //正反標志位 0為順時鐘 1為逆時史上轉
- bit flag_300ms;
- sbit GX=P2^2; //光敏
- sbit dht11=P2^4; //溫度傳感器IO口定義
- uchar table_dht11[5]={1,2,3,4,5};
- uchar menu_1 ;
- sbit red = P2^5; //紅色發光二極管定義
- sbit green = P2^3; //綠色發光二極管定義
- sbit yellow = P2^0; //黃色發光二極管定義
- bit flag_moshi = 0;
- uint quanshu; //圈數
- uchar s_high = 80; //濕度報警參數
- uchar a_a;
- long bjdj_value; //步進電機的量
- /***************************************************************
- * 名稱 : delay_1ms()
- * 功能 : 延時1ms函數
- * 輸入 : q
- * 輸出 : 無
- ****************************************************************/
- void delay_1ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<120;j++);
- }
- /********************************************************************
- * 名稱 : delay_uint()
- * 功能 : 小延時。
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void delay_uint(uint q)
- {
- while(q--);
- }
- /***********************數碼位選函數*****************************/
- void smg_we_switch(uchar i)
- {
- switch(i)
- {
- case 0: smg_we1 = 0; smg_we2 = 1; break;
- case 1: smg_we1 = 1; smg_we2 = 0; break;
- }
- }
- /***********************數碼顯示函數*****************************/
- void display()
- {
- static uchar i;
- i++;
- if(i >= 2)
- i = 0;
- P0 = 0x00; //段選
- smg_we_switch(i); //位選
- P0 = dis_smg[i]; //段選
-
- }
- /*****************讀溫濕度傳感器程序****************/
- void dst11()
- {
- uchar i,j; //讀溫濕度時不能打開中斷
- dht11 = 0;
- delay_1ms(10);
- dht11 = 1;
- delay_uint(2);
- if(dht11 == 0) //判斷是否響應 0 為響應
- {
- while(dht11 == 0);
- while(dht11 == 1); //等待響應時間過完
- for(i=0;i<5;i++)
- {
- for(j=0;j<8;j++)
- {
- table_dht11[i] <<= 1;
- while(dht11 == 0);
- if(dht11 == 1)
- {
- table_dht11[i] |= 0x01;
- while(dht11 == 1); //等待響應時間過完
- }
- }
- }
- }
- dht11 = 1;
- }
- /********************獨立按鍵程序*****************/
- uchar key_can; //按鍵值
- void key() //獨立按鍵程序
- {
- static uchar key_new;
- P1 |= 0xf0;
- if((P1 & 0xf0) != 0xf0) //按鍵按下
- {
- delay_1ms(1); //按鍵消抖動
- if(((P1 & 0xf0) != 0xf0) && (key_new == 1))
- { //確認是按鍵按下
- key_new = 0;
- switch(P1 & 0xf0)
- {
- case 0xe0: key_can = 4; break; //得到k1鍵值
- case 0xd0: key_can = 3; break; //得到k2鍵值
- case 0xb0: key_can = 2; break; //得到k3鍵值
- case 0x70: key_can = 1; break; //得到k4鍵值
- }
- }
- }
- else //按鍵松開
- key_new = 1;
- }
- /****************按鍵處理數碼管顯示函數***************/
- void key_with()
- {
- if(key_can == 1) //設置鍵
- {
- menu_1 ++;
- if(menu_1 >= 3)
- {
- menu_1 = 0;
- }
- }
- if(menu_1 == 0)
- {
- if(key_can == 4) //手動 自動模式的切換
- {
- flag_moshi = ~flag_moshi;
- red = ~red;
- }
- if(flag_moshi == 1)
- {
- if(key_can == 2)
- {
- flag_z_f = 1; //開
- }
- if(key_can == 3)
- {
- flag_z_f = 2; //關
- }
- }
-
- }
- if(menu_1 == 1) //設置濕度上限
- {
- if(key_can == 2)
- {
- s_high ++ ; //濕度上限值加1
- if(s_high > 99)
- s_high = 99;
- }
- if(key_can == 3)
- {
- s_high -- ; //濕度上限值減1
- if(s_high <= 1)
- s_high = 1 ;
- }
- dis_smg[0] = smg_du[s_high % 10] | 0x02; //取個位顯示
- dis_smg[1] = smg_du[s_high / 10 % 10]; //取十位顯示
- }
- if(menu_1 == 2) //設置
- {
- if(key_can == 2)
- {
- quanshu ++ ; //電機轉的圈數 加1
- if(quanshu > 99)
- quanshu = 99;
- }
- if(key_can == 3)
- {
- quanshu -- ; //電機轉的圈數 減1
- if(quanshu <= 1)
- quanshu = 1 ;
- }
- dis_smg[0] = smg_du[quanshu % 10] ; //取個位顯示
- dis_smg[1] = smg_du[quanshu / 10 % 10] | 0x02; //取十位顯示
- }
- key_can = 0;
- }
- void bujindj() //步進電機函數
- {
- static uchar i;
- if(flag_z_f != 0)
- {
- if(flag_z_f == 1) //開
- {
- if(bjdj_value >= 512*4*quanshu)
- {
- flag_z_f = 0;
- }else
- bjdj_value ++;
- green = 1; yellow = 0;
- }
- if(flag_z_f == 2) //關
- {
- if(bjdj_value <= 1)
- {
- flag_z_f = 0;
- bjdj_value = 1;
- }else
- {
- bjdj_value --;
- }
- green = 0; yellow = 1;
- }
- i++;
- if(i >= 4)
- i = 0;
- {
- if(flag_z_f == 1) //開
- P1=zheng[i];//
- else if(flag_z_f == 2)//關
- P1=fan[i];//
- }
- }
- }
- static uint v1alue;
- /***************主函數*****************/
- void main()
- {
- while(1)
- {
- key(); //獨立按鍵程序
- key_with(); //按鍵按下要執行的程序
- v1alue ++;
- if(v1alue >= 200)
- {
- v1alue = 0;
- dst11(); //濕度采集
- if(flag_moshi == 0) //自動模式
- {
- if((GX == 0) || (table_dht11[0] >= s_high))
- {
- flag_z_f = 2; //自動收
- }
- else
- flag_z_f = 1; //自動曬
- red = 0; //紅色發光二極管
- }else
- red = 1;
- }
- dis_smg[0] = smg_du[table_dht11[0] % 10]; //取濕度的個位顯示
- dis_smg[1] = smg_du[table_dht11[0] / 10 % 10] ; //取濕度的十位顯示
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
Auto_yijia_C代碼.rar
(31.36 KB, 下載次數: 79)
2019-2-23 15:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
PDF格式 晾衣架設計.pdf
(94.1 KB, 下載次數: 76)
2019-2-23 15:08 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|