本次设计利用Keil软件对程序进行编译仿真并成功实现衣物自动出室晾晒和收回室内的功能。系统的实物硬件核心是51单片机,检测器件是温湿度传感器和光强传感器,执行器件是步进电机。系统功能实现的过程是:温湿度传感器和光敏元件采集外界环境的物理量并将信息传送给单片机,单片机对信号分析处理后控制步进电机旋转,步进电机带动晾衣架的伸缩。当天气状况是有雨或傍晚时,晾衣杆主动收回衣物;当天气状况是晴朗且无雨时,晾衣杆自动伸出室外。
设计包含电路设计原理图、C程序代码以及相关照片。请大家多指教。
单片机源程序如下:
- #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)
|