找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2130|回复: 4
收起左侧

求教,关于STC12C5A60S2的单片机AD转换问题

[复制链接]
ID:492510 发表于 2020-5-26 22:58 | 显示全部楼层 |阅读模式
写了个程序,本想用STC12C5A60S2的P1.4引脚接受湿度传感器输出的模拟信号,然后判断是否达到阈值,达到阈值后通过P2.0引脚输出高电平使水泵继电器开关打开,可是不知道哪里出了问题实物调试一直不成功,请大神指教一下。湿度传感器用的YL-69,比较器用的LM-393,程序如下:
#include "STC12C5A60S2.h"
#include "intrins.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define ADC_POWER 0x80
#define ADC_FLAG 0x10
#define ADC_START 0x08
#define ADC_SPEEDLL 0x00
#define ADC_SPEEDL 0x20
#define ADC_SPEEDH 0x40
#define ADC_SPEEDHH 0x60
void InitADC();
BYTE GetADCResult(BYTE ch);
void Delay(WORD n);
void main()
{
InitADC();
P2=0x00;
if(GetADCResult(4)>=0.001)                        //0.001为阈值
  P2=0x01;
}
BYTE GetADCResult(BYTE ch)                       //AD转换结果
{
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;
_nop_();
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR&ADC_FLAG));
ADC_CONTR&=~ADC_FLAG;
return ADC_RES;
}
void InitADC()                      //AD寄存器初始化
{
P1ASF=0xff;
ADC_RES=0;
ADC_CONTR=ADC_POWER|ADC_SPEEDLL;
Delay(2);
}
void Delay(WORD n)                  //延时函数
{
WORD x;
while(n--)
{
  x=5000;
  while(x--);
}
}

回复

使用道具 举报

ID:213173 发表于 2020-5-27 07:25 | 显示全部楼层
用比较器判断是否达到阈值其本身已经达到模数转换的作用,只是不能数字控制。如果湿度传感器输出的模拟信号不符合单片机ADC采样范围应使用LM358之类的运放调整到合适范围。控制湿度不是控制在某一个点而是控制在一定范围。也就是设定上限和下限。楼主的main函数没有用while(1)限制会发生无法预料的结果。

void main()
{
        BYTE Temp;
        InitADC();
        while(1)
        {
                Temp=GetADCResult(4);//采样
                if(Temp>=0x80)//上限
                        P2=0x00;
            //上下限之间保持原态不变
                if(Temp<=0x64)//下限
                        P2=0x01;
                Delay(1000);//控制采样周期
        }
}
回复

使用道具 举报

ID:492510 发表于 2020-5-27 11:38 | 显示全部楼层
wulin 发表于 2020-5-27 07:25
用比较器判断是否达到阈值其本身已经达到模数转换的作用,只是不能数字控制。如果湿度传感器输出的模拟信号 ...

非常感谢您的帮助!
遗憾的是在修改主函数并尝试不同上下限后还是没能成功使P2.0引脚输出高电平,第一次使用AD功能,可能是对相关寄存器用法不正确。
回复

使用道具 举报

ID:213173 发表于 2020-5-27 13:59 | 显示全部楼层
li155 发表于 2020-5-27 11:38
非常感谢您的帮助!
遗憾的是在修改主函数并尝试不同上下限后还是没能成功使P2.0引脚输出高电平,第一次 ...

楼主这个程序基本是STC官方示例的应用,除了main函数有点上述的问题外其它基本正确。不能正常工作可能是硬件电路还有问题。P1.4输入电压范围0~VCC,获取ADC结果数据范围0~255。
回复

使用道具 举报

ID:492510 发表于 2020-5-27 14:52 | 显示全部楼层
wulin 发表于 2020-5-27 13:59
楼主这个程序基本是STC官方示例的应用,除了main函数有点上述的问题外其它基本正确。不能正常工作可能是 ...

被您发现了哈哈,本来是一个小系统的程序,其他功能模块基本调试正常了,只有AD这里还有些问题,就给单独摘了出来调试。我会再琢磨琢磨的,谢谢您的指点。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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