自己做的设计,能够手动开关窗帘,根据光照与温度自动开关窗帘,有温控和光控模式,每个模式都有一个按钮进行控制。窗帘的开关是根据电机的状态来判断的,比如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)
|