历史上的今天
返回首页

历史上的今天

今天是:2024年10月17日(星期四)

正在发生

2019年10月17日 | 单片机自动浇花系统

2019-10-17 来源:51hei

自己做的基于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!='')&&i<16)

        {

                 write_data(*dat);

                dat++;

                i++;

                if(i==15) i=0;

        }

}

/*****************************************/


/****************主函数*******************/

void main()

{

        EA=1;                                                          //开总中断

        EX0=1;                                                          //开外部中断0

        EX1=1;                                                          //开外部中断1

        IT0=0;                                                          //外部中断0触发方式为低电平

        IT1=0;                                                          //外部中断1触发方式为低电平

        

        init_lcd1602();        

        

        display_string(0,"Hum:  %");      //实时显示当前的湿度

        display_string(11,"H:  %");       //显示设置的湿度最大值


        display_string(0x40,"Mode:");          //显示工作模式

        display_string(0x40+11,"L:  %");  //显示设置的湿度最小值



    while(1)

        {        

                uchar i;

                

                i=100-read_ad(0)*0.39;

                display_shu(4,i);

                display_shu(13,Hum_H);

                display_shu(0x40+13,Hum_L);

                if(key1==0)        

                        {

                                delay_50us(100);

                                if(key1==0)

                                {

                                        while(!key1);

                                        num++;

                                        if(num>2) num=0;

                                }        

                            

                                switch (num)                                         //选择工作模式和调整湿度设置最大、最小值

                            {

                                case 0:flag=~flag;

                                           flag_jia=0;

推荐阅读

史海拾趣

Hantronix公司的发展小趣事

面对电子行业的快速变化,HANBIT Electronics始终保持敏锐的市场洞察力。2025年,公司宣布与一家领先的物联网技术公司达成战略合作,共同开发智能家居解决方案。这一跨界合作不仅为HANBIT Electronics带来了新的增长点,也使其能够借助物联网技术的力量,进一步拓展在智能家居、智慧城市等新兴领域的应用。通过不断探索和尝试,HANBIT Electronics在保持传统业务优势的同时,也为公司的未来发展开辟了新的道路。

Equator Technologies公司的发展小趣事

在XX年代中期,Equator迎来了一个重要的转折点——被Pixelworks公司收购。Pixelworks是一家在显示图像处理领域具有领先地位的公司,其产品线广泛,包括用于各种显示设备的图像处理芯片和软件。与Pixelworks的合并使Equator获得了更广阔的市场和资源支持,加速了其技术和产品的发展。合并后,Equator继续专注于视频处理技术的研发,并与Pixelworks共同推出了多款创新产品。

BELDEN公司的发展小趣事

在20世纪初,BELDEN公司在技术创新方面取得了显著突破。公司不仅将塑料绝缘材料应用于电线和电缆制造,还着眼于精密和高质量产品的需求,致力于高附加值的绝缘材料、电缆、防护和护套材料的生产。这些技术创新使得BELDEN的产品在性能和质量上都有了显著提升,进一步巩固了公司在市场中的地位。同时,公司还不断扩大产品线,增加了橡胶绝缘材料等多种新产品,满足了不同客户的需求。

思瑞浦微电子科技(3PEAK INCORPORATED)公司的发展小趣事

BELDEN公司的故事始于1902年,当Joseph C. Belden在美国芝加哥创立这家公司时,他怀揣着对电线电缆制造的深厚热情与独特见解。初创时期,公司致力于研发和生产高品质的电线电缆产品,很快便在市场中赢得了良好的声誉。经过多次试验,公司成功发明了“Beldenamel”绝缘材料,这种柔韧的珐琅绝缘材料为公司的成功奠定了坚实的基础。随着产品的不断优化和市场的逐步拓展,BELDEN逐渐在电子行业中崭露头角。

ETC公司的发展小趣事

速通科技始终将用户体验放在首位。公司不断完善ETC系统的服务功能,提高了系统的稳定性和易用性。同时,速通科技还建立了完善的客户服务体系,为用户提供24小时不间断的在线客服支持。这些举措大大提高了用户对ETC系统的满意度和信任度。

C-MEDIA公司的发展小趣事

随着公司业务的不断扩展,C-MEDIA开始实施全球化战略,积极寻求与国际知名企业的合作。通过与全球领先的电子企业、内容提供商和媒体平台建立战略合作关系,C-MEDIA成功地将自己的技术和产品推向了更广阔的市场。这些合作不仅提升了公司的品牌知名度和市场份额,也为公司的长期发展奠定了坚实的基础。

以上只是C-MEDIA公司在电子行业中的一些重要发展节点和故事的概括性描述。实际上,公司的发展过程中还涉及到许多其他的细节和因素,包括市场竞争、技术创新、人才引进等等。这些故事共同构成了C-MEDIA在电子行业中的发展轨迹,展示了其不断进取、追求卓越的精神风貌。

问答坊 | AI 解惑

P87LPC762单片机的应用讨论

最近正在应用这款单片机进行程序开发,不幸的是,这款芯片是OTP的,也就是只能烧写一次,而且也没有购买仿真器的计划,所以就买了20片进行试验,由于以前没用过飞利浦的芯片,所以对设置方面不是很有把握,所以,想请有经验的单片机设计者介绍一下 ...…

查看全部问答>

ADS 1.2安装后有问题

我近来安装了一个ADS1.2的破解版,可是点击 CodeWarror for ARM Develop Suite就会出现 The unexpected failure of a COM opertion suggests that MWComHelpers may be missing这个错误提示呢。 我的license已经按照安装方法来装的了,可是就是 ...…

查看全部问答>

关于wince hive-based registry的疑问

我的wince5.0和4.2,\"Start DevMgr\"=0都是一样,5.0的hive可以永久保存,4.2却不行,5.0和4.2的 PB doc都说要把\"Start   DevMgr\"=1才能永久保存,但我的5.0设为0也能永久保存,感觉很奇怪。 还有一个问题,很严重,我邻居家的两条大 ...…

查看全部问答>

DM9000网卡不能接收数据包

最近在做NIOS+uClinux+DM9000驱动出错如下: 为什麽会: RX packets:0 errors:0 dropped:0 overruns:0 frame:0 以下为启动时的信息,网卡已经找到了,但是就是不能接受发送包 Linux version 2.6.11-uc0 (Administrator@zhang) (gcc version 3 ...…

查看全部问答>

关于USB VirtualCom的问题

我现在用lpc2478芯片,需要评估一下USB VirtualCom的功能,我下载了一个lpc214x的VirtualCom例程。 (usb功能上,两款芯片应该是一样的) 我把keil的例程导到iar后,可以运行,pc机通过usb跟开发板连接,用soft_connect2, 然后用串口调试助手打 ...…

查看全部问答>

怎样在uCLinux中计算用串口接收的两个字符之间的时间间隔

各位大虾:     小弟是个初学者,现在在smart2200开发板上做一个modbus的master,在接收slave的回应时,需要不断的监控两个通过串口接收到的字符之间的时间间隔,如果小于1.5个字符时间继续接收,如果大于1.5个字符就要将接收到的帧抛弃 ...…

查看全部问答>

CC2500 有效距离的大约测试

       今天晚上测试了一下CC2500的传输距离,发现我上次说的5米的距离是完全错误的,为什么大家一致认为传输的距离是5米呢,可能是那个TI的eZ430-RF2500 Sensor Monitor给大家的误导,首先说的是eZ430-RF2500 Senso ...…

查看全部问答>

一般的黑色锰软磁锌铁氧体磁环是什么材质??

一般的黑色锰软磁锌铁氧体磁环是什么材质??具体材质,锰锌铁氧体好像也有很多牌号,但是卖铁氧体磁芯的地方就只知道是锰锌,就是普通的,不知道这个普通的磁导率到底多少?饱和磁通多少?…

查看全部问答>

推荐开辟一个32bit MCU的版块, 毕竟除了arm之外还有其它价廉质优的片子

推荐开辟一个32bit MCU的版块, 毕竟除了arm之外还有其它价廉质优的片子, 而且只关注arm并不是件好事.…

查看全部问答>