|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2009-12-30 22:09:42
|
显示全部楼层
为表感谢。我将全部代码贴出.
main.c
#include <Init.h>
unsigned int AD_Read[AD_Counter],AD_Count=0;
enum
{
SET = 0x0a,
OK = 0x09,
POWER = 0x03,
};
INT8U Key,PWM_Flag=1,Run_State,ADC_Flag=0;
//volatile ADC_T Adc={0,0};
volatile INT32U ADC_Value;
OCR_T Ocr1;
OCR_T OCR_Set(INT8U flag);
void ADC_Init(void)
{
ADCSR = 0x00; //disable adc
ACSR = 0x80;//模拟比较器禁用
ADMUX = 0xc2;//片内2.56V,右对齐,ADC2单端输入
ADCSRA= 0xcf;//ADC使能,开始转换,单次转换,中断使能,128分频。
}
void Init(void)
{
DDRC=0x00;
PORTC=0x00;
DDRB=0x00;
PORTB=0x00;
DDRD=0xff;//灯全部亮
PORTD=0x00;
DDRC&=~(BIT(Key_Set)|BIT(Key_Ok)|BIT(Power_Key)); //输入
DDRC|= BIT(Power_Lock)|BIT(PWM_A); //输出
PORTC|=BIT(Key_Set)|BIT(Key_Ok)|BIT(Power_Key);//开上拉
PORTC|= BIT(Power_Lock); //电平锁定
PORTC&=~BIT(PWM_A); //电平锁定
delay_nms(1000);
PORTD=0xff;
DDRB|=BIT(Motor_A)|BIT(Motor_B)|BIT(PWM_B);
PORTB&=~(BIT(Motor_A)|BIT(Motor_B)|BIT(PWM_B));
ADC_Init();
SEI();
delay_nms(1000); //LED灯长亮
PORTD=0xff;
while(!(PINC&0x08)); //等待开机按键释放
}
#pragma interrupt_handler adc_isr:iv_ADC
void adc_isr(void)
{
//conversion complete, read value (int) using...
ADC_Flag=1;
ADC_Value=(unsigned int)ADCL; //Read 8 low bits first (important)
ADC_Value|=(unsigned int)ADCH<< 8; //read 2 high bits and shift into top byte
ADC_Value= ADC_Value*256/1024;
}
void main(void)
{
volatile INT32U AD_Sum=0;
unsigned int i,j;
Init();
while(1)
{
if(ADC_Flag)//转换完成
{
ADC_Flag=0;//清除转换完成标志
AD_Read[AD_Count]=ADC_Value;
AD_Count++;
if(AD_Count==50)//数据满
{
AD_Count=0;
choise(AD_Read, AD_Counter);//排序
for(i=10;i<40;i++) //取中间30个
{
AD_Sum=AD_Sum+AD_Read;
}
AD_Sum=AD_Sum/30;
if((AD_Sum*11)<=1000)//电压值小于10V
{
PWMB_Stop();
PORTD=0x00;
delay_nms(3000);
PORTC&=~BIT(Power_Lock); //关机
while(1);
}
AD_Sum=0;
}
ADCSRA|=0xC0; //开始新的转换
}
Key=Key_Scan();
if(Key==SET)//按下设定键
{
if(Run_State==0x01)
{
PWMB_Stop();
Run_State=0x02;
}
else
{
PWM_Flag++;
if(PWM_Flag==9) {PWM_Flag=1;}
Ocr1=OCR_Set(PWM_Flag);
}
}
if(Key==OK)//按下确定键
{
if(Run_State!=0x01)
{
Run_State=0x01;
PWMB_Start(Ocr1);
}
}
if(Key==POWER)
{
PORTD=0x00;
delay_nms(500);
PORTD=0xff;
delay_nms(500);
PORTD=0x00;
delay_nms(500);
PORTC&=~BIT(Power_Lock); //关机
while(1); //防止乱按键
}
LED_Train(PWM_Flag-1);
}
}
OCR_T OCR_Set(INT8U flag)
{
static OCR_T Ocr_Temp;
switch (flag)
{
case 1: // 1/1
{
Ocr_Temp.b=TOP/1;
Ocr_Temp.a=Ocr_Temp.b*1;
}break;
case 2: // 1/2
{
Ocr_Temp.b=TOP/2;
Ocr_Temp.a=Ocr_Temp.b*2;
}break;
case 3: // 1/4
{
Ocr_Temp.b=TOP/4;
Ocr_Temp.a=Ocr_Temp.b*4;
}break;
case 4: // 1/8
{
Ocr_Temp.b=TOP/8;
Ocr_Temp.a=Ocr_Temp.b*8;
}break;
case 5: // 1/10
{
Ocr_Temp.b=TOP/10;
Ocr_Temp.a=Ocr_Temp.b*10;
}break;
case 6: // 1/20
{
Ocr_Temp.b=TOP/20;
Ocr_Temp.a=Ocr_Temp.b*20;
}break;
case 7: // 1/40
{
Ocr_Temp.b=TOP/40;
Ocr_Temp.a=Ocr_Temp.b*40;
}break;
case 8: // 1/50
{
Ocr_Temp.b=TOP/50;
Ocr_Temp.a=Ocr_Temp.b*50;
}break;
default :break;
}
return Ocr_Temp;
} |
|