#include <reg51.h> #include <intrins.h> #define uchar unsigned char // 0~255 #define uint unsigned int // 0~65535 sfr ADCR = 0xc5; // 控制寄存器 sfr ADDR = 0xc6; // 结果寄存器 sfr P1M0 = 0x91; // 这两个寄存器用来设置 P1口四种状态 sfr P1M1 = 0x92; void delayms(uchar k); int AdcVal(uchar n); // 进行软件滤波后的ADC的值 int AdcValPro(uchar n); // 取出单次ADC的值 int speed; // 存放红外线感应器值的变化率 int adc; // 存放红外线感应器的值 int adcComp; // 存放比较电阻器的值 void main(void) { int curAdc, curSpeed, ssss; SP = 0X5F; adc = AdcVal(0); //红外线感应器电压 adcComp = AdcVal(1); //比较电压 speed = 0; delayms(10); while(1) { curAdc = AdcVal(0); AdcComp = AdcVal(1); curSpeed = curAdc - adc; ssss = curSpeed - speed; if(-25 < ssss && ssss < 25) // 25是判断电压变化过快的依据, 我随便写的, 应该根据实际值确定; { if(curAdc < curAdcComp && P1_0) P1_0 = 0; // P1_0 为输出连接继电器 else if(curAdc > curAdcComp && P1_0 == 0) P1_0 = 1; adc = curAdc; } speed = curSpeed; delayms(10); } } //----------------------------------------- //ADC相关程序 int AdcVal(uchar n) { uchar i; int val = 0; for(i = 0; i < 8; i++) // 进行8次测量取平均值 val += AdcValPro(n); return val >> 3; } int AdcValPro(uchar n) { //返回第N个ADC的值从0到7 int val; P1M0 = 0x03; P1M1 = 0x03; ADCR = 0x88 + n; while((ADCR & 0x10) == 0) ; // 等待转换完成 val = ADDR; ADCR = 0x00; return val; } void delayms(uchar k) { uint i,j; for(i = 0; i < k; i++) for(j = 0; j < 100; j++) ; } |