GPIO 发表于 2022-6-25 20:20:44

STC15 单片机 使用片内ADC模数转换器 两个I/O口连接 水滴,水位,雨滴传感器并检测


晶振频率:12Mhz 单片机型号:STC15W408AS (图文无关)
硬件连接:LED:P5.5与VCC连接,P1.0,P1.1引出两根导线放到水里,LED点亮,否则熄灭。
#include "STC15.h"
#include "intrins.h"
#define T1ms 0xFC18
sbit water_led = P5 ^ 5;                //检测到有水点亮 否则熄灭 (低电平点亮)
sbit water_a = P1 ^ 0;                        //接导线与水接触 ADC输入 (高阻)
sbit water_b = P1 ^ 1;                        //接导线与水接触 500Hz方波输出 (强推挽)
#define u8 unsigned char
#define u16 unsigned int

void Delay(u16 n) {                //软件延时
        u16 x;
        while (n--) {
                x = 5000;
                while (x--);
        }
}
void InitTimer0(){
        TMOD = 0x01;
        TH0 = T1ms >> 8;
        TL0 = T1ms;
        EA = 1;
        ET0 = 1;
        TR0 = 1;
}

void InitADC() {                //初始化ADC
        P1ASF = 0x01;                //P1.0作ADC输入口
        ADC_CONTR |= 0x80;        //ADC开启
        ADC_RES = 0;                  //清除结果寄存器
        Delay(2);
}

u16 ReadADC(u8 ch) {                //读ADC结果 参数:通道0~7 返回:0~1023
        ADC_CONTR = 0x80 | 0 | ch | 0x08;
        _nop_();_nop_();
        _nop_();_nop_();
        while (!(ADC_CONTR & 0x10));                //等待ADC_FLAG硬件置1
        ADC_CONTR &= ~0x10;                //ADC_FLAG软件清0
        return (ADC_RES << 2) | ADC_RESL;

}

void main() {
        WDT_CONTR = 0x27;
        P1M0 = 0x02; P1M1 = 0x01;                //P1.0高阻输入 P1.1强推挽
        InitADC();
        InitTimer0();
        while (1) {
                WDT_CONTR |= 0x10;                        //看门狗喂狗
        }
}
int abs_int(int i) {                //取绝对值
        if (i < 0) i = 0 - i;
        return i;
}
void Timer0Interrupt() interrupt 1 {                //1ms定时器中断
        static int adc, oadc = 1024, i;
        static u8 z = 0;
        TH0 = T1ms >> 8;
        TL0 = T1ms;
        water_b = !water_b;        //输出500Hz方波
        adc = ReadADC(0);        //取ADC值
        i = (oadc == 1024) ? 0 : abs_int(adc - oadc);
        oadc = adc;                        //上次的ADC值
        if (i >= 800) {                        //灵敏度800
                if(z != 0xFF) z++;        //消抖去干扰
        } else {
                z = 0;
        }
        if (z >= 25) {
                water_led = 0;
        } else {
                water_led = 1;
        }


}
页: [1]
查看完整版本: STC15 单片机 使用片内ADC模数转换器 两个I/O口连接 水滴,水位,雨滴传感器并检测