自己做的設計,能夠手動開關窗簾,根據光照與溫度自動開關窗簾,有溫控和光控模式,每個模式都有一個按鈕進行控制。窗簾的開關是根據電機的狀態來判斷的,比如0是打開,130左右是關閉。
本人大二,設計上可能還有改善的空間,但給師傅看時是非常完善,沒有錯誤的,歡迎交流,請多指教~
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- #include<reg52.h> //頭文件
- #include"LCD1602.h"
- #include"ADC0832.h"
- #include"28BYJ48.h"
- #include"DS18B20.h"
- #define uchar unsigned char
- sbit k1 = P1^0;
- sbit k2 = P1^1;
- sbit k3 = P1^2;
- sbit k4 = P1^3;
- //全局變量
- uchar light=0,temp=0;
- int flag=0,z=0,f=0;
- int q=0;
- int j=0,k=0;
- int count=0,flag1=0;
- int Time;
- int mode=0;
- void delay(int x)
- {
- int i;
- while(x--)
- for(i=10;i>0;i--);
- }
- void auto_control_motor(uchar dat)
- {
- if(Time < dat)
- {
- Time++;
- motor_z();
- }
- else if(Time == dat) motor_s();
- else
- {
- Time--;
- motor_f();
- }
- }
- void light_state_control()
- {
- if(light<0) flag = -1;
- if(light>=0 && light<35) flag = 0;
- else if(light>35 && light<75) flag = 1;
- else flag = 2;
- switch(flag){
- case -1: auto_control_motor(0);
- break;
- case 0: auto_control_motor(0);
- break;
- case 1: auto_control_motor(10);
- break;
- case 2: auto_control_motor(30);
- break;
- }
- }
- void temp_state_control()
- {
- if(current<0) flag = 0;
- if(current>15 && current<=25) flag = 0;
- else if(current == 15) motor_s(); //特殊情況
- else if(current>25 && current<35) flag = 1;
- else flag = 2;
- switch(flag){
- case -1:delay(10000);
- break;
- case 0: auto_control_motor(0);
- break;
- case 1: auto_control_motor(14);
- break;
- case 2: auto_control_motor(14);
- break;
- }
- }
- void curtain_state_control()
- {
- if((light>=0 && light<35)) flag = 0;
- else if((light>35 && light<75)) flag = 1;
- else flag = 2;
-
- switch(flag){
- case 0:
- lcd1602_write_character(12, 3, "on ");
- lcd1602_write_character(12, 4, "low ");
- break;
- case 1:
- lcd1602_write_character(12, 3, "half");
- lcd1602_write_character(12, 4, "mid ");
- break;
- case 2:
- lcd1602_write_character(12, 3, "off ");
- lcd1602_write_character(12, 4, "high");
- break;
- }
- }
- void main(void)
- {
- delay(100);
- ReadTemperature();
- delay(100);
- LCD_init();
- ADC0832_read(0);
- ADC0832_read(0);
- lcd1602_write_character(0, 1, "Light :");
- lcd1602_write_character(0, 2, "Temp :");
- lcd1602_write_character(0, 3, "Cutain :");
- lcd1602_write_character(0, 4, "Level :");
- while(1)
- {
- if(k1 == 0) mode = 1;
- if(k2 == 0) mode = 2;
- if(k3 == 0) mode = 3;
- if(k4 == 0) mode = 4;
- if(mode==1)
- {
- light=ADC0832_read(0); //讀取AD值
- light=light*100/255; //轉換為光強
-
- LCD_disp_char(12, 1, ASCII[light/100]);
- LCD_disp_char(13,1,ASCII[light%100/10]);
- LCD_disp_char(14,1,ASCII[light%10]);
- //窗簾狀態管理
- light_state_control();
- curtain_state_control();
- }
- //-------------------------------溫控模式--------------------------------------
- if(mode==2)
- {
- DS_read_temperature();
- display_temperature();
- temp_state_control();
- if(current>15 && current<=25) lcd1602_write_character(12, 3, "on ");
- else lcd1602_write_character(12, 3, "off ");
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
智能窗簾.zip
(84.95 KB, 下載次數: 365)
2020-6-1 17:17 上傳
點擊文件名下載附件
|