STCW408S单片机价格低,功能强大,适应电压宽,特别适合充电锂电池供电设备
以下是我开发测试成功的自动感应夜灯源程序,效果很好。
主程序:“main.c”
#include "reg51.H"
#include "ADC.H"
#define MAIN_Fosc 12000000L
void delay_ms(unsigned int ms);
unsigned char n1;
//sbit HP37 = P3^7;
sbit LED = P3^6;
void main()
{
//ADC
unsigned int i;
unsigned char channel;
channel=0;
P3M0=1;
P3M1=0;
P1ASF=0xFF;
ADC_RES=0;
ADC_CONTR=ADC_POWER|ADC_SPEEDLL | ADC_START | channel;
for(i=0;i<10000;i++);
IE=0xA0;
//LED
IT0=0; //低电平触发 IT0=1; 下降沿触发
EX0=1;
EA=1;
LED=0;
while(1)
{
//ADC
ADC(0); //查询法//读2次
if(flag==1)
{
flag=0;
}
ADC(0);
if(flag==1)
{
flag=0;
}
v0=ADCtmp;
ADC(2); //读2次
if(flag==1)
{
flag=0;
}
ADC(2);
if(flag==1)
{
flag=0;
}
v2=ADCtmp;
//LED
LED=0;
if (v0 < 512)
{
if (v2<320 || v2>680)
{
LED = 1;
for(n1=0;n1<60;n1++)
{
delay_ms(1200); //调用延时程序
ADC(2); //检查有无人体运动
if(flag==1)
{
flag=0;
}
ADC(2);
if(flag==1)
{
flag=0;
}
v2=ADCtmp;
if (v2<320 || v2>680) n1=0; //如果有人体运动,计数重新开始
}
LED = 0;
delay_ms(800);
}
LED = 0;
delay_ms(800);
}
}
}
void delay_ms(unsigned int ms)
{
unsigned int i;
do{
i = MAIN_Fosc / 14000;
while(--i) ; //14T per loop
}while(--ms);
}
头文件"ADC.H"
#include "ctype.h"
#include "intrins.h"
#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
sfr AUXR =0x8E;
sfr ADC_CONTR =0xBC;
sfr ADC_RES =0xBD;
sfr ADC_RESL =0xBE;
sfr P1ASF =0x9D;
sfr P3M1=0xB1;
sfr P3M0=0xB2;
bit flag=1;
unsigned int v0,v2,ADCtmp=0;
void ADC(unsigned char ch); //查询法
void ADC(unsigned char ch)
{
ADC_CONTR=ADC_POWER|ADC_SPEEDLL | ADC_START | ch;
_nop_(); //至少等待4个空操作指令后才开始读ADC标志位
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));
ADC_CONTR &= ~ADC_FLAG;
ADCtmp=(ADC_RES*4+ADC_RESL);
flag=1;
}
|