自己做的基于stc89c51单片机的自动浇花系统,有自动和手动两种模式,可以设置湿度的上下限,利用lcd1602显示,有一点遗憾的是设置湿度上下限时,没有光标闪动提示,希望大家给点建议,帮助改进,我把源程序附在这。
仿真原理图如下
原理图:
单片机源代码:
#include #define uchar unsigned char #define uint unsigned int sbit ad_cs=P1^3; //ADC0832的控制位 sbit ad_clk=P1^0; sbit ad_dat=P1^1; sbit lcd_rs=P2^7; //LCD1602的控制位 sbit lcd_e=P2^6; sbit key1=P1^4; //独立按键 sbit key2=P3^2; sbit key3=P3^3; sbit relay=P1^6; //继电器 bit flag=1; //工作模式标志 bit flag_motor=1; //手动模式下,抽水机开关标志 bit flag_jia=0; bit flag_jian=0; uchar Hum_H=60; //自动模式下,湿度设定最大值 uchar Hum_L=30; //自动模式下,湿度设定最小值 uchar num=0; /********************延时函数1ms***************** void delay_ms(uint a) { uint i; while(a--) for(i=0;i<125;i++); } *************************************/ /*******************延时函数50us******************/ void delay_50us(uint a) { uint i; while(a--) for(i=0;i<19;i++); } /*************************************/ /*******************ADC读取******************/ uchar read_ad(uchar channel) { uchar i; uchar dat1,dat2; ad_clk=0; ad_cs=0; ad_dat=1; ad_clk=1; ad_clk=0; //起始信号 ad_dat=1; ad_clk=1; ad_clk=0; //选择单通道模式 ad_dat=channel;//0对应通道0,1对应通道1 ad_clk=1; ad_clk=0; ad_dat=1; for(i=0;i<8;++i) { ad_clk=1; ad_clk=0; dat1=dat1<<1; if(ad_dat) dat1|=0x01; } for(i=0;i<8;i++) { dat2=dat2>>1; if(ad_dat) dat2|=0x80; ad_clk=1; ad_clk=0; } ad_cs=1; return (dat1==dat2)?dat1:0; } /*************************************/ /*******************LCD1602初始化******************/ void write_com(uchar com) //写指令 { lcd_e=0; lcd_rs=0; P0=com; delay_50us(10); lcd_e=1; delay_50us(10); lcd_e=0; } void write_data(uchar dat) //写数据 { lcd_e=0; lcd_rs=1; P0=dat; delay_50us(10); lcd_e=1; delay_50us(10); lcd_e=0; } void init_lcd1602() //lcd 初始化 { delay_50us(300); write_com(0x38); delay_50us(100); write_com(0x38); delay_50us(100); write_com(0x38); write_com(0x38); write_com(0x08); write_com(0x01); write_com(0x06); write_com(0x0c); } void display_shu(uchar add,uchar dat) //显示数字 { uchar l,m; // k=dat/100; l=dat%100/10; m=dat%10; write_com(0x80+add); // write_data(k+0x30); write_data(l+0x30); write_data(m+0x30); } void display_string(uchar add,uchar *dat) //显示字符串 { uchar i; write_com(0x80+add); while(dat!=0&&(*dat!='