我所說的土壤濕度傳感器主流的是yl-69型號的,但是我用的是fc-28型號;
型號看不懂的就別管了只管接線就行
傳感器接線:AO口接AIN0~3(自己選,自己設置通道0~3),DO口不接,(AO,DO二選一);
GND接GND VCC接VCC ----------四線制
主要在單片機上使用I2C和AD轉換模塊
main函數(shù)代碼:
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傳輸數(shù)據(jù);
若傳上位機可以調(diào)用uart.c里面的configUart(9600); //配置波特率9600
value =GetADCValue(1);
ValueToString(str,value);
send_string(str);
delay();
串口發(fā)送到上位機
*/
#include <reg52.h>
bit flag300ms = 1; //300ms定時標志
unsigned char T0RH = 0; //T0重載值的高字節(jié)
unsigned char T0RL = 0; //T0重載值的低字節(jié)
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); //寫入控制字節(jié),選擇轉換通道
I2CStart();
I2CWrite((0x48<<1)|0x01); //尋址PCF8591,指定后續(xù)為讀操作
I2CReadACK(); //先空讀一個字節(jié),提供采樣轉換時間
val = I2CReadNAK(); //讀取剛剛轉換完的值
I2CStop();
return val;
}
/* ADC轉換值轉為實際電壓值的字符串形式,str-字符串指針,val-AD轉換值 */
void ValueToString(unsigned char *str, unsigned char val)
{
//電壓值=轉換結果*2.5V/255,式中的25隱含了一位十進制小數(shù)
val = (val*50)/255; //故意先乘10方便后面計算取余數(shù) *10 //小數(shù)是不能存在unsigned char數(shù)據(jù)中的。
str[0] = (val/10) + '0'; //整數(shù)位字符 //unsigned char是用來存字符的,本質(zhì)是ascii碼值,也就是整數(shù)。
str[1] = '.'; //小數(shù)點
str[2] = (val%10) + '0'; //小數(shù)位字符
str[3] = 'V'; //電壓單位
str[4] = '\0'; //結束符
}
/* 配置并啟動T0,ms-T0定時時間 */
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp; //臨時變量
tmp = 11059200 / 12; //定時器計數(shù)頻率
tmp = (tmp * ms) / 1000; //計算所需的計數(shù)值
tmp = 65536 - tmp; //計算定時器重載值
tmp = tmp + 12; //補償中斷響應延時造成的誤差
T0RH = (unsigned char)(tmp>>8); //定時器重載值拆分為高低字節(jié)
T0RL = (unsigned char)tmp;
TMOD &= 0xF0; //清零T0的控制位
TMOD |= 0x01; //配置T0為模式1
TH0 = T0RH; //加載T0重載值
TL0 = T0RL;
ET0 = 1; //使能T0中斷
TR0 = 1; //啟動T0
}
/* T0中斷服務函數(shù),執(zhí)行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") ;
}*/
}
-----------------------------------------
本人很懶有黑幣的可以下載下面的包,貢獻點積分啥的 感謝
模數(shù)轉換_適用壓差傳感器.zip
(52.94 KB, 下載次數(shù): 50)
2019-12-8 19:49 上傳
點擊文件名下載附件
所有壓差傳感器通用
|