900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 基于51单片机的智能自动晾衣架proteus仿真原理图程序设计

基于51单片机的智能自动晾衣架proteus仿真原理图程序设计

时间:2018-11-11 14:06:41

相关推荐

基于51单片机的智能自动晾衣架proteus仿真原理图程序设计

硬件设计

(末尾附文件)

方案

为了实现晾衣自身能够完成对外界数据的采集与分析,集成控制环节我们采用了ATMEL公司生产的AT89C52单片机,与市面上的其他嵌入式控制单元相比较在体积与功耗方面都相当出色。此次设计主要突破在于设计合理的控制电路单元,同时结合采用的主控编写高质量的源码并使系统在实际与应用中能够发挥出色的稳定性和参考价值。本次将围绕主控单元设计合理的电路,结合SHT11温湿度采集单元、感光原件单元、LCD显示单元、模式控制单元使晾衣架能够得到外界的实时数据并作出相应的调整。在设定合适的温湿度及感光度的条件下能够自动控制电机驱动滑杆实现自动量晒与回收衣物,结合光线角度进行上下左右调整。主要框架如下图所示:

仿真1:

仿真2:

程序1

#include<reg52.h>#include <intrins.h>#include <math.h> #include <stdio.h>#include <1602.h>#include <sht11.h>#include <24c02.h> #define uchar unsigned char#define uint unsigned int#define W_cmd 0xa0 //24c02写指令#define R_cmd 0xa1uint temp,humi; value humi_val,temp_val;//定义两个共同体,一个用于湿度,一个用于温度uchar error;//用于检验是否出现错误uchar checksum; //CRCuchar TEMP_data[7]; //用于记录实测的温度uchar HUMI_data[6]; //用于记录实测的湿度uchar LIGH_data[4];//用于记录实测光感度uchar show_temp[5]; //显示设定的温度uchar show_humi[4]; //显示设定的湿度uchar data temp_humi_cache[4]; //温湿度设置缓存uchar temp_set; //保存温度变量uchar humi_set; //保存湿度变量uchar presskeynum; //按键次数变量uchar nn; //用于蜂鸣器uchar code word1[]={" a product of "};uchar code word2[]={"UNITED ELECTRONS"};uchar code word3[]={" Welcome........"};sbit k1=P2^0; //选择按键sbit k2=P2^1; //增加按键sbit k3=P2^2; //减小按键sbit k4=P2^3;// 确认按键sbit led1=P1^4;//温度过低指示灯sbit led2=P1^5;//温度过高sbit led3=P1^6;//湿度低于下限值,报警,加湿。sbit led4=P1^7;//湿度过高,报警,不调湿sbit motor1=P3^4;sbit motor2=P3^5;sbit motor3=P3^6;sbit motor4=P3^7;sbit P2_6=P2^6;//********延时函数*********void delay(uint z) //z为毫秒数{int a,b;for(a=z;a>0;a--)for(b=120;b>0;b--);}void key(){uchar m;if (k1==0) //调整按键检测{delay(5);if (k1==0){presskeynum++;if(presskeynum==3)presskeynum=0;while(k1==0); //若一直按下,循环LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏}}if(presskeynum==1)//温度设置{if(k2==0) // 加{delay(300);temp_set++;if (temp_set>30)temp_set=30;while(k2==0); //加上此句必须松按键才处理}if(k3==0)//减{delay(300);temp_set--;if (temp_set<18)temp_set=18;while(k3==0); //加上此句必须松按键才处理}}if(presskeynum==2)//湿度设置{if(k2==0)// 加{delay(300);humi_set++;if (humi_set>99)humi_set=99;while(k2==0);}if(k3==0)//减{delay(300);humi_set--;if (humi_set<1)humi_set=1;//while(k3==0);//这句是调试加入的}}if(k4==0)// 退出键//设置完初始值以后通过IIC写入24c02并清屏{delay(10);if(k4==0){while(k4==0);presskeynum=0;temp_humi_cache[0]=temp_set/10;temp_humi_cache[1]=temp_set%10;temp_humi_cache[2]=humi_set/10;temp_humi_cache[3]=humi_set%10;for(m=0;m<4;m++){WriteIIC(W_cmd,0x00+m,temp_humi_cache[m]);//设定值写入24c02}LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏}}}//主函数void main(){uchar t;uchar temp_adc;k1=k2=k3=k4=1;motor1=motor2=motor3=motor4=0;P2_6=0;for (t=0;t<4;t++)temp_humi_cache[t]=ReadIIC(W_cmd,0x00+t,R_cmd);//读入24c02设定的值temp_set=temp_humi_cache[0]*10+temp_humi_cache[1];//设置温度humi_set=temp_humi_cache[2]*10+temp_humi_cache[3];//设置湿度LCD_Initial(); //液晶初始化GotoXY(0,0);Print_slow(word1);GotoXY(0,1);Print_slow(word2);LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏GotoXY(0,0);Print_slow(word3);LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏//完成系统初始化 while(1){key();P1 = 0xff; //P1口初始化temp_adc = P1;//读取光敏值,8位精度最大256if(presskeynum==0) //测量温湿度{s_connectionreset(); //启动连接复位error=0;//初始化error=0,即没有错误error+=s_measure((unsigned char*)&temp_val.i,&checksum,TEMP); //温度测量值返回到temp.val.ierror+=s_measure((unsigned char*)&humi_val.i,&checksum,HUMI); //湿度测量值返回到humi_val.iif(error!=0)s_connectionreset();//如果发生错误,系统复位else{humi_val.f=(float)humi_val.i; //转换为浮点数temp_val.f=(float)temp_val.i; //转换为浮点数calc_sth10(&humi_val.f,&temp_val.f); //修正相对湿度及温度,误差弥补temp=temp_val.f*10;humi=humi_val.f*10;GotoXY(0,0);//选择温度显示位置Print("Temp:C --- ");//5格空格GotoXY(0,1);//选择湿度显示位置Print("Humi:%");//5格空格 GotoXY(5,0);//设置温度显示位置TEMP_data[0]=temp/1000+'0';//温度百位 if (TEMP_data[0]==0x30) //ASCLL = 0TEMP_data[0]=0x20; //对应的ASCLL位空格TEMP_data[1]=temp%1000/100+'0';//温度十位if (TEMP_data[1]==0x30 && TEMP_data[0]!=0x30) TEMP_data[1]=0x20;TEMP_data[2]=temp%100/10+'0'; //温度个位TEMP_data[3]=0x2e;//小数点TEMP_data[4]=temp%10+'0'; //温度小数点后第一位 TEMP_data[5]=0xdf;//显示温度符号℃书上是第248TEMP_data[6]='\0';//实际上0xdf对应的是小圆圈Print(TEMP_data); //输出温度 GotoXY(5,1);HUMI_data[0]=humi/1000+'0'; //湿度百位 if (HUMI_data[0]==0x30)HUMI_data[0]=0x20;HUMI_data[1]=humi%1000/100+'0'; //湿度十位HUMI_data[2]=humi%100/10+'0'; //湿度个位HUMI_data[3]='.' ; //小数点HUMI_data[4]=humi%10+'0';//湿度小数点后第一位 HUMI_data[5]='\0';Print(HUMI_data); //输出湿度GotoXY(13,1);LIGH_data[0] = temp_adc%1000/100+'0';//if(LIGH_data[0] == 0x30)//LIGH_data[0] = 0x20;LIGH_data[1] = temp_adc%100/10+'0';LIGH_data[2] = temp_adc%10+'0';LIGH_data[3] = '\0';Print(LIGH_data);

.

文件仅供参考

链接:/s/1H49s8Kp7LL3U4IZNXNsjlg

提取码:vf6u

.

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。