要做一个项目,被分配到做DS18B20温度传感与YL69土壤湿度传感器在51单片机上用LCD显示屏显示出来。温度传感模块很简单,网上到处都是资料,但是YL69的资料就很少了,特别还是在51单片机上实现。
其实懂了原理也还是简单。将传感器的AO口与单片机的ADDA模块通道3相连,将会实现数字量转换为模拟量,GND接地,VCC接电源(这里我们不接DO口,不会影响)。接下来就是代码部分。
此代码实现的是,YL69获取的数据在液晶显示屏上显示出来

#include<reg52.h>
#include<intrins.h>
#include<math.h>
typedef unsigned char uchar   ;
typedef unsigned int uint      ;
#define AT24C02_ADDR  0xa0  //AT24C02地址
#define DAC_EN 0x40
#define ADC_AutoINC 0x04
#define PCF8591_ADDR  0x90  //PCF8591地址
#define MAIN_Fosc       11059200L   //定义主时钟
sbit SDA = P2^0;
sbit SCL = P2^1;
sbit LCDEN=P3^4;
sbit LCD_RS = P3^5;            //LCD写数据或命令控制IO
sbit LCD_RW = P3^6;            //LCD读写控制IO
sbit dula = P2^6;
sbit wela = P2^7;
uint strHEX[4];INT8UtostrHEX函数转换的字符串显示10进制
void delay_ms(uint z)
{uint x,y;for(x = z; x > 0; x--)for(y = 114; y > 0 ; y--);
}void delay_5us()
{_nop_();
}/*I2C初始化*/
void I2C_init()
{SDA = 1;_nop_();SCL = 1;_nop_();
}/*I2C起始信号*/
void I2C_Start()
{SCL = 1;_nop_();SDA = 1;delay_5us();SDA = 0;delay_5us();
}/*I2C终止信号*/
void I2C_Stop()
{SDA = 0;_nop_();SCL = 1;delay_5us();SDA = 1;delay_5us();
}
/*主机发送应答*/
void Master_ACK(bit i)
{SCL = 0; // 拉低时钟总线允许SDA数据总线上的数据变化_nop_(); // 让总线稳定if (i)   //如果i = 1 那么拉低数据总线 表示主机应答{SDA = 0;}else   {SDA = 1;  //发送非应答}_nop_();//让总线稳定SCL = 1;//拉高时钟总线 让从机从SDA线上读走 主机的应答信号delay_5us();SCL = 0;//拉低时钟总线, 占用总线继续通信_nop_();SDA = 1;//释放SDA数据总线。_nop_();
}/*检测从机应答*/
bit Test_ACK()
{SCL = 1;delay_5us();if (SDA){SCL = 0;_nop_();I2C_Stop();return(0);}else{SCL = 0;_nop_();return(1);}
}/*发送一个字节*/
void I2C_send_byte(uchar byte)
{uchar i;for(i = 0 ; i < 8 ; i++){SCL = 0;_nop_();if (byte & 0x80){              SDA = 1;   _nop_();                   }                else{SDA = 0;_nop_();}SCL = 1;_nop_();byte <<= 1;  // 0101 0100B }SCL = 0;_nop_();SDA = 1;_nop_();
}/*I2C 读一字节*/
uchar I2C_read_byte()
{uchar dat,i;SCL = 0;_nop_();SDA = 1;_nop_();for(i = 0 ; i < 8 ; i++){SCL = 1;_nop_();if (SDA)             {dat |= 0x01; //}else{dat &=  0xfe;   //1111 1110}_nop_();SCL = 0 ;_nop_();if(i < 7){dat = dat << 1;   }}return(dat);
}uint *INT8UtostrHEX(uint num)  //将一个字节的数据转换为字符串
{uint i = 0;switch(num/100){case 0:        strHEX[i] = '0';     i++;  break;case 1:       strHEX[i] = '1'; i++;  break;case 2:       strHEX[i] = '2'; i++;  break;case 3:       strHEX[i] = '3'; i++;  break;case 4:       strHEX[i] = '4'; i++;  break;case 5:       strHEX[i] = '5'; i++;  break;case 6:       strHEX[i] = '6'; i++;  break;case 7:       strHEX[i] = '7'; i++;  break;case 8:       strHEX[i] = '8'; i++;  break;case 9:       strHEX[i] = '9'; i++;  break;}switch(num%100/10){case 0:       strHEX[i] = '0'; i++;  break;case 1:       strHEX[i] = '1'; i++;  break;case 2:       strHEX[i] = '2'; i++;  break;case 3:       strHEX[i] = '3'; i++;  break;case 4:       strHEX[i] = '4'; i++;  break;case 5:       strHEX[i] = '5'; i++;  break;case 6:       strHEX[i] = '6'; i++;  break;case 7:       strHEX[i] = '7'; i++;  break;case 8:       strHEX[i] = '8'; i++;  break;case 9:       strHEX[i] = '9'; i++;  break;}switch(num%100%10){case 0:       strHEX[i] = '0'; i++;  break;case 1:       strHEX[i] = '1'; i++;  break;case 2:       strHEX[i] = '2'; i++;  break;case 3:       strHEX[i] = '3'; i++;  break;case 4:       strHEX[i] = '4'; i++;  break;case 5:       strHEX[i] = '5'; i++;  break;case 6:       strHEX[i] = '6'; i++;  break;case 7:       strHEX[i] = '7'; i++;  break;case 8:       strHEX[i] = '8'; i++;  break;case 9:       strHEX[i] = '9'; i++;  break;}strHEX[3] = '\0';return (strHEX);}void writeComm(uint comm)
{ //    while(LCD1602_Check_Busy()); //忙则等待LCD_RS  = 0;    P0=comm;LCDEN = 1;_nop_();LCDEN = 0;delay_ms(1);
}//写数据
void writeData(uint dat)
{//  while(LCD1602_Check_Busy()); //忙则等待LCD_RS = 1; P0 = dat;LCDEN = 1;_nop_();LCDEN = 0;delay_ms(1);}//写字符串
void LCD1602_Write_String(uint x,uint y,uint *s) //LCD1602写字符串
{     if (y == 0) {     writeComm(0x80 + x);     //表示第一行}else {      writeComm(0xC0 + x);      //表示第二行}        while (*s != '\0') {     writeData(*s++);         }
}//初始化显示屏void init(){LCD_RW = 0; dula = wela = 0;LCDEN=0;writeComm(0x38);// 16*2显示 writeComm(0x0c); //打开显示 writeComm(0x06);//显示指针加1 writeComm(0x01); //清屏 delay_ms(5);
}/*ad读数据*/
bit I2C_ADC_ReadData(uchar ADDR, uint *ADC_Value)
{I2C_Start() ;I2C_send_byte(PCF8591_ADDR + 0);if (!Test_ACK()){return(0);}I2C_send_byte(ADDR);Master_ACK(0);I2C_Start();I2C_send_byte(PCF8591_ADDR + 1);if (!Test_ACK()){return(0);}*ADC_Value = I2C_read_byte();Master_ACK(0);I2C_Stop();return(1);
}void main()
{uint ADC_Value;init(); //LCD1602初始化I2C_init();
//      LCD1602_Write_String(0, 0, "CH0:");while(1){I2C_ADC_ReadData(3, &ADC_Value);  LCD1602_Write_String(0, 0,INT8UtostrHEX(ADC_Value));delay_ms(400); }}

51单片机上连YL69土壤湿度传感器获取的数据在LCD上显示出来相关推荐

  1. 智慧农场,51单片机上实现DS18B20与YL69土壤湿度传感器,并将两个获取的数据在LCD上显示出来

    上一篇我说了我们做的是两个模块,但是介于DS18B20的资料太多,我就不再阐述,直接给最终的代码. 该代码是将温度传感器与YL69湿度传感器获取的数据在51单片机LCD上显示出来 #include & ...

  2. 51单片机驱动TCS3200颜色识别传感器

    51单片机驱动TCS3200颜色识别传感器 TCS3200 简介 输出频率与滤光器选择说明 实验说明 接线 驱动 驱动说明 主要代码 主函数 实验现象 验证: 实验注意事项: TCS3200 简介 T ...

  3. 树莓派连接yl-69土壤湿度传感器

    树莓派连接yl-69土壤湿度传感器 python代码(亲测可用) 针脚连接5v(PIN02),gnd(PIN39),GPIO21(PIN40) python代码(亲测可用) #!/usr/bin/py ...

  4. STM32连YL69土壤湿度传感器以及内部温度传感器采集数据并在LCD上显示

    终于把32好好学习了一遍,做了一次以前的项目练手,把土壤湿度与温度采集起来,数据在显示屏上显示.效果如图 首先硬件连接,就不说了,以前51的项目说过.直接附代码.需要说明的是我用的是STM32F407 ...

  5. 51单片机基础之DHT11温湿度传感器

    接线: 代码: main.c文件/* 使用DHT11模块,检测温湿度,在lcd1602上面显示,因为1602显示不是每次都能出来,所以加了串口打印,会更加直观. */ #include <reg ...

  6. 在树莓派上使用 PowerShell 调用 Azure 上的 .NET Core API 获取疫情数据

    点击上方蓝字关注"汪宇杰博客" 导语 最近因为疫情被关在家里,做了个无聊成就:我们将在树莓派上用 PowerShell 调用 Azure 上的一个 .NET Core 写的 API ...

  7. 基于51单片机的大棚环境土壤湿度光强监测系统proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.系统实时监测当前温湿度/土壤湿度/环境光强并显示 2.温湿度超过设定阈值范围,蜂鸣器响,同时开启对应控制继电器 3.土壤湿度低于设定下限,开启 ...

  8. 光敏电阻51单片机c语言程序,光敏传感器原理图 单片机程序及光敏电阻简介文档下载...

    /******************************************************************** 龙戈电子 实现功能:此版配套测试程序 使用芯片:AT89S5 ...

  9. angular文件上传php,Angular2里获取(input file)上传文件的内容的方法

    最近在用Angular2,需要有一个上传文件的功能,但是又不想用库,所以直接用原生的input file 标签. 然后想获取上传的内容,于是先想了个愚蠢的方法,先通过id获取到这个input标签,然后 ...

最新文章

  1. yum安装nginx
  2. python/pandas数据分析(十五)-聚合与分组运算实例
  3. 程序员面试题精选100题(44)-数值的整数次方[算法]
  4. docker 内部ping不通宿主机_Docker容器数据管理
  5. know about用法
  6. socket 编程:回射客户/服务程序
  7. 为什么说干实业的玩不过干金融的?
  8. 编写 android 测试单元该做的和不该做的事
  9. Hello Dojo!(翻译)
  10. Harmony OS — TabList和Tab分页栏
  11. CST学习笔记------材料边界
  12. Mybatis 中事务提交方式
  13. 11 月全国程序员平均工资出炉
  14. Word文档图标变成空白如何恢复
  15. ai怎么做波普风圆点_如何用Ps或Ai制作出波普艺术风格的海报?
  16. Binary XML file line Error inflating class解决办法以及自定义view的基本实现
  17. 【MacOS】java环境配置
  18. easyexcel使用教程-导出篇
  19. 程序员生存定律-六个程序员的故事(2) .
  20. 武林秘籍之C语言大法.第二式 语句 带你走向武林之巅

热门文章

  1. iconic 框架中的滚动条高度
  2. android底层 考试 华清,Android开发架构你真的了解吗—华清创客学院
  3. caffe-ssd细节梳理
  4. SRRC认证的产品有哪些?
  5. try的动词用法_有关try的常用短语和用法
  6. 北工商计算机学校,北京工商大学计算机学院
  7. 晚上11:45点 ,你进入睡眠状态了吗?
  8. 牛客小白月赛4 I.合唱队形
  9. 中文元宇宙游戏有哪些
  10. 【人脸表情识别】稀疏表示人脸表情识别【含GUI Matlab源码 786期】