我所说的土壤湿度传感器主流的是yl-69型号的,但是我用的是fc-28型号;
型号看不懂的就别管了只管接线就行
传感器接线:AO口接AIN0~3(自己选,自己设置通道0~3),DO口不接,(AO,DO二选一);
GND接GND VCC接VCC ----------四线制
主要在单片机上使用I2C和AD转换模块
main函数代码:
void main()
{
unsigned char val;
unsigned char str[10];
EA = 1; //开总中断
ConfigTimer0(10); //配置T0定时10ms
InitLcd1602(); //初始化液晶
LcdShowStr(0, 0, "Humidity:"); //显示通道指示
LcdShowStr(13,0,"%");
while (1)
{
if (flag300ms)
{
flag300ms = 0;
//显示通道0的电压
/* val = GetADCValue(0); //获取ADC通道0的转换值
ValueToString(str, val); //转为字符串格式的电压值
LcdShowStr(0, 1, str); //显示到液晶上 */
//显示通道1的电压
val = GetADCValue(1);
ValueToString(str, val);
disp_persent(str);
LcdShowStr(6, 1, str);
//显示通道3的电压
/* val = GetADCValue(3);
ValueToString(str, val);
LcdShowStr(12, 1, str); */
}
}
}
1602显示部分代码:
void disp_persent(unsigned char *str){ //百分比显示
if(str[0]== 0x35) // 00% 5v
{
LcdShowStr(11,0,"00") ;
}
else if(str[0] == 0x34) // 25% 4v
{
LcdShowStr(11,0,"25") ;
}
else if(str[0] == 0x33) // 50% 3v
{
LcdShowStr(11,0,"50") ;
}
else if(str[0] == 0x32) // 75% 2v
{
LcdShowStr(11,0,"75") ;
}
else if(str[0] == 0x31) // 99% 1v
{
LcdShowStr(11,0,"99") ;
}
/*else{
LcdShowStr(11,0,"xx") ;
}*/
}---------------------------------------------------------------------------------------------------------------------------------------------------
想了下
第一篇文章免费全部代码贴上:
模块是51单片机书的模块代码
3个.c文件
另外两个自己书上复制粘贴进去
我贴main.c的代码
/**各种电压差传感器都可以使用 单片机上使用的I2C传输数据;
若传上位机可以调用uart.c里面的configUart(9600); //配置波特率9600
value =GetADCValue(1);
ValueToString(str,value);
send_string(str);
delay();
串口发送到上位机
*/
#include <reg52.h>
bit flag300ms = 1; //300ms定时标志
unsigned char T0RH = 0; //T0重载值的高字节
unsigned char T0RL = 0; //T0重载值的低字节
void ConfigTimer0(unsigned int ms);
unsigned char GetADCValue(unsigned char chn);
void ValueToString(unsigned char *str, unsigned char val);
extern void I2CStart();
extern void I2CStop();
extern unsigned char I2CReadACK();
extern unsigned char I2CReadNAK();
extern bit I2CWrite(unsigned char dat);
extern void InitLcd1602();
extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
void disp_persent(unsigned char *str);
void main()
{
unsigned char val;
unsigned char str[10];
EA = 1; //开总中断
ConfigTimer0(10); //配置T0定时10ms
InitLcd1602(); //初始化液晶
LcdShowStr(0, 0, "Humidity:"); //显示通道指示
LcdShowStr(13,0,"%");
while (1)
{
if (flag300ms)
{
flag300ms = 0;
//显示通道0的电压
/* val = GetADCValue(0); //获取ADC通道0的转换值
ValueToString(str, val); //转为字符串格式的电压值
LcdShowStr(0, 1, str); //显示到液晶上 */
//显示通道1的电压
val = GetADCValue(1);
ValueToString(str, val);
disp_persent(str);
LcdShowStr(6, 1, str);
//显示通道3的电压
/* val = GetADCValue(3);
ValueToString(str, val);
LcdShowStr(12, 1, str); */
}
}
}
/* 读取当前的ADC转换值,chn-ADC通道号0~3 */
unsigned char GetADCValue(unsigned char chn)
{
unsigned char val;
I2CStart();
if (!I2CWrite(0x48<<1)) //寻址PCF8591,如未应答,则停止操作并返回0
{
I2CStop();
return 0;
}
I2CWrite(0x40|chn); //写入控制字节,选择转换通道
I2CStart();
I2CWrite((0x48<<1)|0x01); //寻址PCF8591,指定后续为读操作
I2CReadACK(); //先空读一个字节,提供采样转换时间
val = I2CReadNAK(); //读取刚刚转换完的值
I2CStop();
return val;
}
/* ADC转换值转为实际电压值的字符串形式,str-字符串指针,val-AD转换值 */
void ValueToString(unsigned char *str, unsigned char val)
{
//电压值=转换结果*2.5V/255,式中的25隐含了一位十进制小数
val = (val*50)/255; //故意先乘10方便后面计算取余数 *10 //小数是不能存在unsigned char数据中的。
str[0] = (val/10) + '0'; //整数位字符 //unsigned char是用来存字符的,本质是ascii码值,也就是整数。
str[1] = '.'; //小数点
str[2] = (val%10) + '0'; //小数位字符
str[3] = 'V'; //电压单位
str[4] = '\0'; //结束符
}
/* 配置并启动T0,ms-T0定时时间 */
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp; //临时变量
tmp = 11059200 / 12; //定时器计数频率
tmp = (tmp * ms) / 1000; //计算所需的计数值
tmp = 65536 - tmp; //计算定时器重载值
tmp = tmp + 12; //补偿中断响应延时造成的误差
T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
T0RL = (unsigned char)tmp;
TMOD &= 0xF0; //清零T0的控制位
TMOD |= 0x01; //配置T0为模式1
TH0 = T0RH; //加载T0重载值
TL0 = T0RL;
ET0 = 1; //使能T0中断
TR0 = 1; //启动T0
}
/* T0中断服务函数,执行300ms定时 */
void InterruptTimer0() interrupt 1
{
static unsigned char tmr300ms = 0;
TH0 = T0RH; //重新加载重载值
TL0 = T0RL;
tmr300ms++;
if (tmr300ms >= 30) //定时300ms
{
tmr300ms = 0;
flag300ms = 1;
}
}
void disp_persent(unsigned char *str){
if(str[0]== 0x35) // 00% 5v
{
LcdShowStr(11,0,"00") ;
}
else if(str[0] == 0x34) // 25% 4v
{
LcdShowStr(11,0,"25") ;
}
else if(str[0] == 0x33) // 50% 3v
{
LcdShowStr(11,0,"50") ;
}
else if(str[0] == 0x32) // 75% 2v
{
LcdShowStr(11,0,"75") ;
}
else if(str[0] == 0x31) // 99% 1v
{
LcdShowStr(11,0,"99") ;
}
/*else{
LcdShowStr(11,0,"xx") ;
}*/
}
-----------------------------------------
本人很懒有黑币的可以下载下面的包,贡献点积分啥的 感谢
模数转换_适用压差传感器.zip
(52.94 KB, 下载次数: 50)
|