=a[i+1];
a[i+1]=t;
}
}
}
for(i=3;i<12;i++) //求出中间10个的值求平均 第0 1 2 不要,3-11保留,12 13 14不要 *
sum+=a;
return(sum/9); //返回剩余9个的平均值平均值
}
//------------------------------------------------定时器0中断 8mS定时
#pragma vector ISR_tmr0 @ 0x08
void ISR_tmr0(void)
{
//--------------------------------8mS定时中断
PA6_Flash;
t_8ms_cnt ++ ;
t_8ms_LED_cnt ++;
if(t_8ms_cnt>=125)
{
t_8ms_cnt =0;
t_1s_flag=1;
}
//-----------------LED闪烁处理
switch(LED_Mode)
{
case FAST:
if(t_8ms_LED_cnt >= FAST_VALUE) //快闪
{
t_8ms_LED_cnt=0;
LED_Flash;
}
break;
case SLOW:
if(t_8ms_LED_cnt >= SLOW_VALUE) //慢闪
{
t_8ms_LED_cnt=0;
LED_Flash;
}
break;
default:
t_8ms_LED_cnt =0 ; //其他模式直接清零,防溢出
break;
}
}
//------------------------------------------------定时器1中断 软PWM
#pragma vector ISR_tmr1 @ 0x0C
void ISR_tmr1(void)
{
pwm_counter ++;
if( pwm_counter >= PWM_CYCLE )
pwm_counter = 0; //处理周期问题
if( pwm_counter < pwm_duty )
pwm_pin_hi_F;
else
pwm_pin_low_F; //处理占宽问题
}
//--------------------------------------------------时基功能处理(指定一个中断函数,否则可能复位)
#pragma vector ISR_TBS @ 0x14
void ISR_TBS(void)
{
;
}
//-------------------------------------------------LED快闪三次
void LED_FlashFast3(void )
{
uchar i;
for(i=0;i<3;i++) //执行三次
{
LED_On;
_delay(150000); //亮150mS
LED_Off;
_delay(150000); //灭150mS
}
}
//----------------------------------------------主函数
void main(void )
{
uchar i=0; //循环体变量
uchar State=1; //全局状态标志,默认为1状态
uchar SampCnt2=0; //SEG2采样计数
uint SampCnt3=0; //SEG3采样计数
ulong SampCnt4=0; //SEG4采样计数
uchar CaptureFlag=0; //进入检测电压跌降模式标志
uint AD1=0; //AD转换结果
uint MaxAD1=0; //老的AD转换结果
PWM_CYCLE = 800;
pwm_counter = 0;
pwm_duty = 0;
LED_Off;
t_1s_flag=0;
t_8ms_cnt=0;
t_8ms_LED_cnt=0;
SysInit(); //系统初始化
LED_FlashFast3(); //LED快闪三次
LED_Off;
while(1)
{
LED_Mode = FAST;
pwm_duty = 100; //应该占空比到10%
for(i=0;i<20;i++)
_delay(200000); //延时四秒,以便观察快闪的情况
LED_Mode = SLOW; //慢闪
pwm_duty = 400; //应该占空比到50%;
for(i=0;i<20;i++)
_delay(200000); //延时四秒,以便观察快闪的情况
LED_Off; //LED PWM都关闭
pwm_duty = 0;
for(i=0;i<20;i++)
_delay(200000); //延时四秒,以便观察快闪的情况
pwm_duty = 400;
LED_Off;
for(i=0;i<20;i++)
{
AD1=GetADC(); //判断20次AD是否能通过,如果AD能顺利通过不死机,应该能看到20次灯的状态变化(闪10次)
LED_Flash;
for(i=0;i<20;i++)
_delay(200); //延时四秒,以便观察快闪的情况
}
LED_Mode=SLOW; //LED慢闪
pwm_duty = 400; //固定duty值,如果PWM_CYCLE值变化,占空比和周期同时变化,以验证AD转换准确度
while(1)
{
PWM_CYCLE=GetADC(); //进行AD转换,并把AD转换结果当成PWM周期,应该是电压越大,周期越长
for(i=0;i<10;i++)
_delay(200000); //延时2秒,以便观察快闪的情况
if(GetADC() >2000)
LED_Mode = FAST;
else
LED_Mode = SLOW;
}
}
}