【基于单片机的牧草喷灌控制系统的硬件和软件设计案例7000字】_第1页
【基于单片机的牧草喷灌控制系统的硬件和软件设计案例7000字】_第2页
【基于单片机的牧草喷灌控制系统的硬件和软件设计案例7000字】_第3页
【基于单片机的牧草喷灌控制系统的硬件和软件设计案例7000字】_第4页
【基于单片机的牧草喷灌控制系统的硬件和软件设计案例7000字】_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

附录二主程序#include<reg52.h> //头文件#include<intrins.h>#include"eeprom52.h"#defineucharunsignedchar //宏定义#defineuintunsignedint#defineLCD1602_datP0 //液晶数据口定义sbitLCD1602_rs=P2^5;//IO定义sbitLCD1602_rw=P2^6;sbitLCD1602_e=P2^7;sbitbeep=P1^3; //蜂鸣器sbitled_1=P1^4; //指示灯sbitled_2=P1^6;sbitkey_1=P3^0; //按键sbitkey_2=P3^1;sbitkey_3=P3^2;sbitalarm_1=P2^0; //继电器sbitADC0832_CS=P1^2;sbitADC0832_CLK=P1^0;sbitADC0832_DIO=P1^1; //adc0832引脚uintsum;ucharRH,RH_H=60,RH_L=20,state,ms,time_num,cs;bitbeep1,zt,s1;unsignedintA_D(){ unsignedchari; unsignedchardat; ADC0832_CS=1;//一个转换周期开始 ADC0832_CLK=0;//为第一个脉冲作准备 ADC0832_CS=0;//CS置0,片选有效 ADC0832_DIO=1;//DIO置1,规定的起始信号 ADC0832_CLK=1;//第一个脉冲 ADC0832_CLK=0;//第一个脉冲的下降沿,此前DIO必须是高电平 ADC0832_DIO=1;//DIO置1,通道选择信号 ADC0832_CLK=1;//第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道RH0 ADC0832_CLK=0;//第二个脉冲下降沿 ADC0832_DIO=0;//DI置0,选择通道0 ADC0832_CLK=1;//第三个脉冲 ADC0832_CLK=0;//第三个脉冲下降沿 ADC0832_DIO=1;//第三个脉冲下沉之后,输入端DIO失去作用,应置1 ADC0832_CLK=1;//第四个脉冲 for(i=0;i<8;i++)//高位在前 { ADC0832_CLK=1;//第四个脉冲 ADC0832_CLK=0; dat<<=1;//将下面储存的低位数据向右移 dat|=(unsignedchar)ADC0832_DIO; //将输出数据DIO通过或运算储存在dat最低位 } ADC0832_CS=1;//片选无效 returndat; //将读书的数据返回}voiddelay(uintT) //延时函数{ while(T--);}voidLCD1602_write(ucharorder,dat) //1602一个字节处理{LCD1602_e=0;LCD1602_rs=order;LCD1602_dat=dat;LCD1602_rw=0;LCD1602_e=1;delay(1);LCD1602_e=0; }voidLCD1602_writebyte(uchar*prointer) //1602字符串处理{while(*prointer!='\0'){LCD1602_write(1,*prointer);prointer++;}}voidLCD1602_cls() //1602初始化{ LCD1602_write(0,0x01);//1602清屏指令 delay(1500); LCD1602_write(0,0x38);//功能设置8位、5*7点阵 delay(1500); LCD1602_write(0,0x0c);//设置光标不显示开关、不显示光标、字符不闪烁 LCD1602_write(0,0x06); LCD1602_write(0,0xd0); delay(1500);}voidshow() //显示子函数{ if(state==0)//如果非设置状态 { LCD1602_write(0,0x80); //第一行 LCD1602_writebyte("Humidity:");//显示湿度 LCD1602_write(0,0x80+9); if(RH>99)LCD1602_write(1,0x30+RH/100%10); //如果数据大于99显示百位数 elseLCD1602_writebyte(""); //否则显示空白 LCD1602_write(0,0x80+10); if(RH>9)LCD1602_write(1,0x30+RH/10%10); elseLCD1602_writebyte(""); LCD1602_write(0,0x80+11); LCD1602_write(1,0x30+RH%10); LCD1602_write(0,0x80+12); LCD1602_writebyte("%"); //显示%号 LCD1602_write(0,0xC0); //第二行,显示当前模式 LCD1602_writebyte("State:"); LCD1602_write(0,0xC0+6); if(zt==1) { LCD1602_writebyte("Auto");//自动 }else { LCD1602_writebyte("Manul");//手动 } }else { LCD1602_write(0,0x80); //第一行显示上限 LCD1602_writebyte("RH_H:"); LCD1602_write(0,0x80+5); if(state==1&&s1==1) //当设置上限时,state=1,这时候会根据s1的状态去显示空白或者上限数据,而s1在定时器里是连续取反的 { LCD1602_writebyte(""); }else { if(RH_H>99)LCD1602_write(1,0x30+RH_H/100%10); elseLCD1602_writebyte(""); LCD1602_write(0,0x80+6); if(RH_H>9)LCD1602_write(1,0x30+RH_H/10%10); elseLCD1602_writebyte(""); LCD1602_write(0,0x80+7); LCD1602_write(1,0x30+RH_H%10); } LCD1602_write(0,0x80+8); LCD1602_writebyte("%"); LCD1602_write(0,0xC0); //第二行显示下限 LCD1602_writebyte("RH_L:"); LCD1602_write(0,0xC0+5); if(state==2&&s1==1) { LCD1602_writebyte(""); }else { if(RH_L>99)LCD1602_write(1,0x30+RH_L/100%10); elseLCD1602_writebyte(""); LCD1602_write(0,0xC0+6); if(RH_L>9)LCD1602_write(1,0x30+RH_L/10%10); elseLCD1602_writebyte(""); LCD1602_write(0,0xC0+7); LCD1602_write(1,0x30+RH_L%10); } LCD1602_write(0,0xC0+8); LCD1602_writebyte("%"); }}voidkey() //按键扫描{ if(!key_1) //如果按键1按下 { delay(888); //延时消抖 if(!key_1) //如果按键1按下 { while(!key_1)show(); //松手检测 state=(state+1)%3; //设置变量自加,state的值不同设置的数据不同 } } if(!key_2) { delay(888);//按键去抖 if(!key_2) { while(!key_2)show(); if(state==1) //state=1的时候设置上限 { if(RH_H<100)RH_H++; SectorErase(0x2000); //保存上限值 byte_write(0x2000,RH_H); }elseif(state==2) //state=2的时候设置下限 { if(RH_L<RH_H-1)RH_L++; SectorErase(0x2200); //保存上限值 byte_write(0x2200,RH_L); }else { zt=!zt; } } } if(!key_3) { delay(888); if(!key_3) { while(!key_3)show(); if(state==1) { if(RH_H>RH_L+1)RH_H--; SectorErase(0x2000); //保存上限值 byte_write(0x2000,RH_H); }elseif(state==2) { if(RH_L>0)RH_L--; SectorErase(0x2200); //保存上限值 byte_write(0x2200,RH_L); }else { if(zt==0) { alarm_1=!alarm_1; } } } } }voidproc() //报警函数{ if(zt==1)//自动状态 { if(RH>=RH_H) //湿度大于上限 { alarm_1=1; //继电器断开 led_1=0; //上限指示灯点亮 }else { led_1=1; //否则上限指示灯熄灭 } if(RH<=RH_L) //如果小于下限 { alarm_1=0; //继电器闭合 led_2=0; //下限指示灯点亮 }else { led_2=1; //否则下限指示灯熄灭 } if(RH>=RH_H||RH<=RH_L) //如果不在上下限区间内 { beep1=1; //报警标志位置1 }else { beep1=0; //否则置0 } }else //手动状态 { beep1=0; //不报警 led_1=led_2=1; //指示灯不亮 }}voidmain() //主循环{ floatAd_dat=0; TMOD=0x01; //配置定时器0 TH0=0x3c; TL0=0xb0; //赋50ms初值 ET0=1; TR0=1; EA=1; //打开总中断 LCD1602_cls(); //液晶初始化 RH_H=byte_read(0x2000); RH_L=byte_read(0x2200); if((RH_H>99)||(RH_L>99)||(RH_L>=RH_H)){RH_H=30;RH_L=20;} while(1) { sum+=A_D(); //累加5次AD数据 cs++; if(cs==5) { cs=0; Ad_dat=(float)(sum/5); //取一个平均值,用于滤波 if(Ad_dat>250)Ad_dat=0; elseif(Ad_dat<=70)Ad_dat=100; elseAd_dat=100-((Ad_dat-70)/1.8); RH=(uint)(Ad_dat); sum=0; } show(); //调用显示

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论