T2(1602显示湿度).zip

  • JIKEE
    了解作者
  • C/C++
    开发工具
  • 32KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 2
    下载次数
  • 2020-04-26 20:12
    上传日期
土壤湿度AD转换为LCD1602显示,支持51单片机
T2(1602显示湿度).zip
  • T2(1602显示湿度)
  • main.c
    11.4KB
  • T2_Opt.Bak
    1KB
  • T2_Uv2.Bak
    2.1KB
  • T2.Opt
    1KB
  • T2.build_log.htm
    1.2KB
  • T2
    17.2KB
  • T2.hex
    3.1KB
  • T2.lnp
    38B
  • main.LST
    19.6KB
  • main.OBJ
    19.5KB
  • T2.Uv2
    2.1KB
  • T2.plg
    1.5KB
  • T2.M51
    23.1KB
内容介绍
#include<reg52.h> //包含单片机寄存器的头文件 #include <intrins.h> #define AddWr 0x90 //PCF8591 地址 // 变量定义 unsigned char AD_CHANNEL; sbit RST=P2^4; //时钟 加上后可以关掉DS1302芯片输出 sbit scl=P2^1; //I2C 时钟 sbit sda=P2^0; //I2C 数据 bit ack; /*应答标志位*/ sbit ben=P1^2; // 接 J12 IN4 //水泵两条线接 J11 VCC和OUT4 sbit RS = P1^0;//Pin4 sbit RW = P1^1; //Pin5 sbit EN = P2^5;//Pin6 //XXXXXXX #define RS_CLR RS=0 #define RS_SET RS=1 #define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0 #define EN_SET EN=1 #define DataPort P0 /*#define Data P0 //数据端口 */ unsigned char TempData[8]; unsigned char SecondLine[]=" "; unsigned char FirstLine[] =" "; void DelayUs2x(unsigned char t) { while(--t); } void DelayMs(unsigned char t) { while(t--) { //大致延时1mS DelayUs2x(245); DelayUs2x(245); } } /******************************************************************* 起动总线函数 函数原型: void Start_I2c(); 功能: 启动I2C总线,即发送I2C起始条件. ********************************************************************/ void Start_I2c() { sda=1; /*发送起始条件的数据信号*/ _nop_(); scl=1; _nop_(); /*起始条件建立时间大于4.7us,延时*/ _nop_(); _nop_(); _nop_(); _nop_(); sda=0; /*发送起始信号*/ _nop_(); /* 起始条件锁定时间大于4μs*/ _nop_(); _nop_(); _nop_(); _nop_(); scl=0; /*钳住I2C总线,准备发送或接收数据 */ _nop_(); _nop_(); } /******************************************************************* 结束总线函数 函数原型: void Stop_I2c(); 功能: 结束I2C总线,即发送I2C结束条件. ********************************************************************/ void Stop_I2c() { sda=0; /*发送结束条件的数据信号*/ _nop_(); /*发送结束条件的时钟信号*/ scl=1; /*结束条件建立时间大于4μs*/ _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); sda=1; /*发送I2C总线结束信号*/ _nop_(); _nop_(); _nop_(); _nop_(); } /******************************************************************* 字节数据发送函数 函数原型: void I2C_SendByte(UCHAR c); 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对 此状态位进行操作.(不应答或非应答都使ack=0) 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。 ********************************************************************/ void I2C_SendByte(unsigned char c) { unsigned char i; for(i=0;i<8;i++) /*要传送的数据长度为8位*/ { if((c<<i)&0x80)sda=1; /*判断发送位*/ else sda=0; _nop_(); scl=1; /*置时钟线为高,通知被控器开始接收数据位*/ _nop_(); _nop_(); /*保证时钟高电平周期大于4μs*/ _nop_(); _nop_(); _nop_(); scl=0; } _nop_(); _nop_(); sda=1; /*8位发送完后释放数据线,准备接收应答位*/ _nop_(); _nop_(); scl=1; _nop_(); _nop_(); _nop_(); if(sda==1)ack=0; else ack=1; /*判断是否接收到应答信号*/ scl=0; _nop_(); _nop_(); } /******************************************************************* 字节数据接收函数 函数原型: UCHAR I2C_RcvByte(); 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号), 发完后请用应答函数应答从机。 ********************************************************************/ unsigned char I2C_RcvByte() { unsigned char retc=0,i; //接收到的数据 sda=1; /*置数据线为输入方式*/ for(i=0;i<8;i++) { _nop_(); scl=0; /*置时钟线为低,准备接收数据位*/ _nop_(); _nop_(); /*时钟低电平周期大于4.7μs*/ _nop_(); _nop_(); _nop_(); scl=1; /*置时钟线为高使数据线上数据有效*/ _nop_(); _nop_(); retc=retc<<1; if(sda==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */ _nop_(); _nop_(); } scl=0; _nop_(); _nop_(); return(retc); } /******************************************************************** 应答子函数 函数原型: void Ack_I2c(bit a); 功能: 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定) ********************************************************************/ void Ack_I2c(bit a) { if(a==0)sda=0; /*在此发出应答或非应答信号 */ else sda=1; /*0为发出应答,1为非应答信号 */ _nop_(); _nop_(); _nop_(); scl=1; _nop_(); _nop_(); /*时钟低电平周期大于4μs*/ _nop_(); _nop_(); _nop_(); scl=0; /*清时钟线,住I2C总线以便继续接收*/ _nop_(); _nop_(); } /************************************************************ * 函数名 : Pcf8591_SendByte * 函数功能 : 写入一个控制命令 * 输入 : addr(器件地址),channel(转换通道) * 输出 : 无 ************************************************************/ bit PCF8591_SendByte(unsigned char addr,unsigned char channel) { Start_I2c(); //启动总线 I2C_SendByte(addr); //发送器件地址 //读 0x91 写 0x90 if(ack==0)return(0); I2C_SendByte(0x40|channel); //通道号 //发送控制字节 if(ack==0)return(0); Stop_I2c(); //结束总线 return(1); } /************************************************************ * 函数名 : PCF8591_RcvByte * 函数功能 : 读取一个转换值 * 输入 : * 输出 : dat ************************************************************/ unsigned char PCF8591_RcvByte(unsigned char addr) { unsigned char dat; Start_I2c(); //启动总线 I2C_SendByte(addr+1); //发送器件地址 if(ack==0)return(0); dat=I2C_RcvByte(); //读取数据0 Ack_I2c(1); //发送非应答信号 Stop_I2c(); //结束总线 return(dat); } /*------------------------------------------------ 判忙函数 显示程序 ------------------------------------------------*/ bit LCD_Check_Busy(void) { DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; return (bit)(DataPort & 0x80); } /*------------------------------------------------ 写入命令函数 ------------------------------------------------*/ void LCD_Write_Com(unsigned char com) { while(LCD_Check_Busy()); //忙则等待 RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR; } /*------------------------------------------------ 写入数据函数 ------------------------------------------------*/ void LCD_Write_Data(unsigned char Data) { while(LCD_Check_Busy()); //忙则等待 RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_(); EN_CLR; } /*------------------------------------------------ 清屏函数 ------------------------------------------------*/ void LCD_Clear(void) { LCD_Write_Com(0x01); DelayMs(5); } /*------------------------------------------------ 写入字符串函数 ------------------------------------------------*/ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) { if (y == 0) { LCD_Write_Com(0x80 + x); //表示第一行 } else { LCD_Write_Com(0xC0 + x); //表示第二行 } while (*s) { LCD_Write_Data( *s); s ++; } } /*------------------------------------------------ 写入字符函数 ------------------------------------------
评论
    相关推荐
    • YL-69.zip
      利用YL-69和单片机实现土壤湿度的检测
    • 5A32S2-AD-12864.zip
      土壤湿度ad采样和12864液晶显示源程序
    • 程序.rar
      基于C51单片机自动浇花跟土壤湿度检测用1602LCD
    • kr51浇花程序.rar
      单片机根据土壤湿度控制浇花,SCM controls watering according to soil humidity单片机根据土壤湿度控制浇花
    • 土壤湿度检测电路的设计,打造智能浇花系统-电路方案
      选用湿度传感器和AD转换,电路内部包含有湿度采集、AD转换、单片机译码显示等功能。单片机需要采集数据时,发出指令启动A/D转换器工作,ADC0832根据送来的地址信号选通IN1通道,然后对输入的模拟信号进行转换,转换...
    • 改良版51单片机的浇花系统,有效避免临界值抖动-电路方案
      这是一个改良版的51单片机的浇花系统,带有DHT11温湿度检测模块,以及土壤湿度检测模块,可以设置触发浇花的临界值,并且改进了浇水判断程序,避免在临界值抖动达不到浇水效果。 这个1602显示、带DHT11的浇花系统的...
    • 基于SHT11湿度传感器的小型花园灌溉系统.zip
      1.主体功能:利用51单片机对电机,光敏电阻,湿度传感器及LCD显示屏等多个模块进行控制,从而达到自动灌溉无人花园的功能。 2.传感器功能:定时采样土壤湿度,并与标准湿度范围作对比,若当前湿度达标,则继续保持;...
    • 自动浇花控制系统设计(内含原理图、源代码、实物照片)
      土壤湿度采集于显示电路可将检测到的土壤湿度模拟量放大转换成数字量通过单片机内程序控制精确的将温度与湿度分别显示在LCD显示屏上,同时把程序发给另外一块单片机,通过单片机内的中断服务程序判断是否要给...
    • 32.zip
      此程序包含大量32程序,比如温湿度测量,DHT,土壤湿度测量,大量传感器程序,欢迎大家下载!
    • GaussDB_100_1.0.1-DATABASE-REDHAT-64bit.tar.gz
      guassdb100在redhat上安装包,单机部署的包,安装步骤请看我的文中介绍,经过大量实验搭建总结出来的文档