#include "HT66F002.h"
#include "funtion.h"
/****************************初始化函数********************************/
void System_Init(void)
{
_smod = 0b10100000; //fh/8
//io设置
_pac2 = 0; //输出
_pac6 = 1; //输入
_papu6 = 1; //拉高
//定时器设置
_stm0c0 = 0b00000000; //8M/8/4 = 250K
_stm0c1 = 0b11000001; //定時,A匹配
_stm0al = 250; //250K/250=1K=1ms
_stm0ah = 0;
//看门狗设置
_wdtc = 0b01010100; //内部LIRC 128ms
//复用功能设置
_pasr = 0b11001100; //PA1-AN1微波 PA5-AN3光敏二极管
//AD设置
_sadc0 = 0b00100000; //使能ADC AN0
_sadc1 = 0b00000011; //fsys/8
_sadc2 = 0b00000000; //除能OPA 参考电压AVDD
//定时器计数清零,定时器开
_st0on = 1;
_st0on = 1;
/*
pa2 PIN 5=输出控制脚;可以根据需求定义输出延迟时间,或者是输出PWM模式。
pa1 PIN 6=微波信号检测脚
pa0 PIN 7=环境亮度检测
*/
//ADC初始化
_sadc0 = 0b00100000; //使能ADC AN0 AVDD为 参考电压
_sadc1 = 0b00000011; //fsys/8
_sadc2 = 0b00000000; //除能OPA
//中断开
_mf0e = 1; //多功能中断使能
_emi = 1;
}
/****************************ADC相关函数********************************/
//开始ADC AD采样周期和转换周期为16个ADC周期 加上半个周期时间可以开始下个AD周期
uint AD_Data_Array[10];
uint AD_Gather(uchar Channel)
{
uint m;
uchar n;
uint AD_Data_Max,AD_Data_Min;
uint temp,AD_Data;
_sadc0 = 0b00100000+Channel; //ENADC
for(m=0;m<100;m++);
if(Channel==1) //微波数据用最大值减去最小值
{
temp = start_ADC();
AD_Data_Max = AD_Data_Min = temp;
for(m=0;m<500;++m)
{
_clrwdt1();
_clrwdt2();
temp = start_ADC();
if(temp > AD_Data_Max)
AD_Data_Max = temp;
if(temp < AD_Data_Min)
AD_Data_Min = temp;
}
AD_Data = AD_Data_Max - AD_Data_Min;
}
else if(Channel==3)
{
for(m=0;m<10;++m)
{
_clrwdt1();
_clrwdt2();
AD_Data_Array[m] = start_ADC();
}
for(m=0;m<9;m++)
{
for(n=0;n<9-m;n++)
{
if(AD_Data_Array[n] > AD_Data_Array[n+1]) //从小到大,冒泡法
{
temp = AD_Data_Array[n];
AD_Data_Array[n] = AD_Data_Array[n+1];
AD_Data_Array[n+1] = temp;
}
}
}
AD_Data = AD_Data_Array[4] + AD_Data_Array[5];
AD_Data = AD_Data>>1; //除2,平均值
}
return AD_Data;
}
uint start_ADC(void)
{
uchar n;
uint AD_buffer=0;
for(n=0;n<10;n++);
_start = 0;
_start = 1;
_start = 0;
while(_adbz==1);
AD_buffer = _sadoh;
AD_buffer <<=4;
AD_buffer += (_sadol>>4);
return AD_buffer;
}
void Delay(unsigned long count)
{
volatile unsigned long i,j;
for(i=0;i<count;i++)
{
for(j=0;j<500;j++)
{
_clrwdt1();
_clrwdt2();
}
}
}