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;
}
|