找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2532|回复: 1
打印 上一主题 下一主题
收起左侧

各种测压差的传感器通用代码_实现的土壤湿度传感器

[复制链接]
跳转到指定楼层
楼主
我所说的土壤湿度传感器主流的是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)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:582452 发表于 2020-1-30 21:49 | 只看该作者
你这个板子是普中科技开发板?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表