?? main.c
字號:
/*******************************************************
"激光治療儀"程序
Designed by easyfly_step
2006.10.28
********************************************************/
#include "main.h"
volatile uchar Can_read=0,AllState=0,LevelState=1,OutState=0,ChargeState=0,
LedSec=0,Time_minu=0,mh=0,ml=0,SwitchTimes=0,AdjustTimes=0,Time_sec=0;
volatile uchar times=0,ChargeTimes=0,KeyState=0,ChargeFlag=0,LedFlag=0,
ChargeFlagTimes=0,VoltageTimes=0,WorkFlag=0,Flag=1,FlagTimes=0,FirstFlag=0,
DelayFlag=0,AdjustTimesFlag=0,KeyOld=0,Adj=1,AlarmFlag=0,AbandonFlag=0;
volatile uint mid=0,ADTimes=0,VoltageResult_AD=0,ChargeResult_AD=0;
volatile uchar Seg[4];
int main(void)
{
//cli();
Init_Device();
Init_Flag();
//Reset_Source();
//AbandonFlag=0;
DelayMs(1500);
sei();
//wdt_enable(WDTO_2S);
//wdt_reset();
while((PINB&(1<<POWER))==0)
{
//FirstFlag=0;
//wdt_reset();
DelayMs(100);
}
while(1)
{
//wdt_reset();
//AD_Shift();
AllState&=0b01000000;
AllState|=(uchar)(AdjustTimes<<3)+LevelState;
if(Can_read)
{
Can_read=0;
//if(AbandonFlag==1)
//{
Voltage_Check();
Charge_Check();
//}
}
TaskTurn ();
/*********A/D轉換測試**********
if(LevelState==0){puts("LevelState=");puts("0\n");}
else if(LevelState==1){puts("LevelState=");puts("1\n");}
else if(LevelState==2){puts("LevelState=");puts("2\n");}
else if(LevelState==3){puts("LevelState=");puts("3\n");}
else if(LevelState==4){puts("LevelState=");puts("4\n");}
if(((AllState&0b01000000)>>6)==1){puts("充電中\n");}
else if(((AllState&0b01000000)>>6)==0){puts("未充電\n");}
DelayMs(300);
****************************/
}
}
/********
SIGNAL(SIG_OVERFLOW0)
{
}
SIGNAL(SIG_OVERFLOW1)
{
}
**********/
SIGNAL(SIG_OUTPUT_COMPARE1A) //1ms中斷一次//用于精確記時
{
// sbi(PORTB,PB0);
TCNT1H=0x00;
TCNT1L=0x00;
mid++;
if(mid>=500)
{
Time_sec++;
mh=Time_sec/10;
ml=Time_sec%10;
mid=0;
LedSec++;
}
if(Time_sec>=60) //秒判斷
{
Time_sec=0;
Time_minu++;
if(Time_minu>=30) //分判斷
{
Time_minu=0;
//Beep_short(15,300);
//Close(); //關機
}
}
Show_State();
if(++FlagTimes>=10){FlagTimes=0;KeyState=KeyScan(KeyState);}//10ms掃描一次鍵盤
if(++ADTimes>=100){AD_Shift();ADTimes=0;}//100ms進行一次A/D轉換
//if(LedSec>=10){LedSec=0;PORTC&=~(1<<6);}
}
/*********
SIGNAL(SIG_OUTPUT_COMPARE1B)
{
}
*********/
/*********
SIGNAL(SIG_OUTPUT_COMPARE2)
{
static uchar BeepFlag;
if(BeepFlag)
PORTB&=~_BV(PB2);
else
PORTB|=_BV(PB2);
BeepFlag=!BeepFlag;
}
*********/
/*******
SIGNAL(SIG_ADC)
{
// ADC_data=ADCW;
}
*********/
void Reset_Source(void)
{
if (MCUCSR & PORF)
{
// Power-on Reset
MCUCSR=0;
// Place your code here
}
else if(MCUCSR & EXTRF)
{
// External Reset
MCUCSR=0;
// Place your code here
}
else if(MCUCSR & BORF)
{
// Brown-Out Reset
MCUCSR=0;
// Place your code here
}
else if(MCUCSR & WDRF)
{
// Watchdog Reset
MCUCSR=0;
// Place your code here
}
}
void Init_Flag(void) //從EEPROM中讀出當前功率狀態
{
eeprom_busy_wait();
AdjustTimes=eeprom_read_byte(0);
if(AdjustTimes==0xFF)AdjustTimes=1;
}
void Save_Flag(void) //將調整后的功率狀態存入EEPROM中
{
eeprom_busy_wait();
eeprom_write_byte(0,AdjustTimes);
}
void AD_Shift(void) //開始進行A/D轉換
{
/********
//ADCH=0;ADCL=0;
ADCSRA=0xD7;
ADMUX=0x47;//ADMUX=0x44;//DIP-M8-UART測試
ADCSRA|=(1<<ADSC);
_delay_loop_1(60);
while(ADCSRA&(1<<ADSC))
_delay_loop_1(60);
ChargeResult_AD=ADCL;
ChargeResult_AD|=(uint)(ADCH<<8);
//ADCH=0;ADCL=0;
ADCSRA=0xD7;
ADMUX=0x46;//ADMUX=0x45;//DIP-M8-UART測試
ADCSRA|=(1<<ADSC);
_delay_loop_1(60);
while(ADCSRA&(1<<ADSC))
_delay_loop_1(60);
VoltageResult_AD=ADCL;
VoltageResult_AD|=(uint)(ADCH<<8);
************/
AD_init();
VoltageResult_AD=BT_V();
ChargeResult_AD=BT_C();
Can_read=1;
}
void Voltage_Check(void) //當前工作電壓監測
{
if(VoltageResult_AD>=VREFH){LevelState=4;alarm_n_short(1);}//Beep_middle(1,200);}
else if((VoltageResult_AD>=VREFMH)&&(VoltageResult_AD<VREFH)){LevelState=4;}
else if((VoltageResult_AD>=VREFML)&&(VoltageResult_AD<VREFMH)){LevelState=3;}
else if((VoltageResult_AD>=VREFL)&&(VoltageResult_AD<VREFML)){LevelState=2;}
else if((VoltageResult_AD>=VREFC)&&(VoltageResult_AD<VREFL)){LevelState=0;}
else {LevelState=1;KeyState=0;SwitchTimes=1;alarm_n_short(1);Close();}
AllState=(AllState&0b11111000)+LevelState;
}
void Charge_Check(void) //充電狀態監測
{
//if(ChargeResult_AD>=VREFH_CHARGE){ChargeState=2;Beep_long(1,200);}
//else
if(ChargeResult_AD>=VREFL_CHARGE)//&&ChargeResult_AD<VREFH_CHARGE)
{
//if(++ChargeFlagTimes>3)
//{
//ChargeFlagTimes=0;
ChargeState=1;
AllState|=(1<<6);
LedSec=0;
PORTC|=(1<<6);//}//LED背光給電10秒
if(ChargeFlag==0){alarm_n_short(1);ChargeFlag=1;}//Beep_short(1,200);ChargeFlag=1;}
//}
}
else
{
//ChargeFlagTimes=0;
ChargeState=0;
AllState&=~(1<<6);
ChargeFlag=0;
}
}
void Close(void) //關機
{
//Beep_short(3,200); //關機前報警
//Reset_Source();//PORTC&=~(1<<6);
PORTB&=~(1<<7);//PORTB|=(1<<7); //置高,使POWER斷開,關機
wdt_enable(WDTO_1S);
wdt_reset();
/*****
DelayMs(1000);
cli();
Can_read=0;AllState=0;LevelState=1;OutState=0;ChargeState=0;Time_minu=0;mh=0;ml=0;SwitchTimes=0;AdjustTimes=0;Time_sec=0;
times=0;ChargeTimes=0;KeyState=0;ChargeFlag=0;ChargeFlagTimes=0;VoltageTimes=0;FlagTimes=0;DelayFlag=0;AdjustTimesFlag=0;KeyOld=0;Adj=1;AlarmFlag=0;
AbandonFlag=0;mid=0;ADTimes=0;VoltageResult_AD=0;ChargeResult_AD=0;
Init_Device();
Init_Flag();
//Reset_Source();
//AbandonFlag=0;
sei();
******/
}
void TaskTurn (void)
{
/**********
Flag 用于按下WORK時,ADJUST的屏蔽
SwitchTimes 用于開關機記數
DelayFlag 用于開機后待機狀態顯示穩定及揚聲器發聲及laserpower給電
AdjustTimesFlag為有按鍵進行調整的標志
*********/
switch(KeyState)
{
case 0x00: //POWER/RA5鍵-PB6//待機狀態
//AllState&=0b01000000;
//AllState|=(uchar)(AdjustTimes<<3)+LevelState;
if(DelayFlag==0)
{
//wdt_reset();
if(((AllState&0b01000000)>>6)==1)ChargePOWERState_Display(10);
else POWERState_Display(10);
alarm_n_short(1);//Beep_middle(1,200);
DelayFlag=1;
}
else
{
if(((AllState&0b01000000)>>6)==1)ChargePOWERState_Display(10);
else POWERState_Display(10);
}
if((Flag==0)&&(KeyState==0))//if((FirstFlag==1)&&(Flag==0)&&(KeyState==0))
{
//FirstFlag=0;
KeyState=0;
if(((AllState&0b01000000)>>6)==1)ChargePOWERState_Display(10);
else POWERState_Display(10);
DelayMs(1000);
SwitchTimes=1;
}//長按關機
if(SwitchTimes==1)
{
//wdt_reset();
alarm_n_short(3);//Beep_middle(3,200);
Flag=1;
SwitchTimes=0;
Close();
}
break;
case 0x01: //WORK鍵-PC4//工作狀態
PORTB&=~(1<<5);//laserpower給電 PB5置0
//AllState&=0b01000000;
//AllState|=(uchar)(AdjustTimes<<3)+LevelState;
if(WorkFlag==0){alarm_n_short(1);WorkFlag=1;}//Beep_short(1,200);WorkFlag=1;}
if(((AllState&0b01000000)>>6)==1)ChargeWORKState_Display(10,(uchar)((AllState&0b00111000)>>3),(uchar)(AllState&0b00000111));
else WORKState_Display(10,(uchar)((AllState&0b00111000)>>3),(uchar)(AllState&0b00000111));
if(AdjustTimes==1){PORTB&=~(1<<0);PORTB&=~(1<<3);PORTB&=~(1<<4);}//PB0:PB3:PB4:->000 //給激光器調整功率狀態
else if(AdjustTimes==2){PORTB&=~(1<<0);PORTB&=~(1<<3);PORTB|=(1<<4);}//PB0:PB3:PB4:->001
else if(AdjustTimes==3){PORTB&=~(1<<0);PORTB|=(1<<3);PORTB&=~(1<<4);}//PB0:PB3:PB4:->010
else if(AdjustTimes==4){PORTB|=(1<<0);PORTB&=~(1<<3);PORTB&=~(1<<4);}//PB0:PB3:PB4:->100
if((Time_minu==15)&&(AlarmFlag==0)){alarm_n_short(5);AlarmFlag=1;}//Beep_middle(5,200);AlarmFlag=1;}
else if((Time_sec>=58)&&(Time_sec<=60)&&(Time_minu==29)&&(AlarmFlag==1)){alarm_n_short(15);AlarmFlag=0;SwitchTimes=1;KeyState=0;Close(); }//Beep_middle(15,200);AlarmFlag=0;SwitchTimes=0;}
/*************
if((Flag==1)&&(KeyState==1))
{KeyState=0;//wdt_reset();
DelayMs(1000);SwitchTimes=1;}//長按關機
***********/
break;
case 0x02: //ADJUST_P鍵-PC5//功率調整狀態
//wdt_reset();
if(AdjustTimesFlag==1)
{
if(((AllState&0b01000000)>>6)==1)ChargeADJUSTState_Display(10,(uchar)((AllState&0b00111000)>>3),(uchar)(AllState&0b00000111));
else ADJUSTState_Display(10,(uchar)((AllState&0b00111000)>>3),(uchar)(AllState&0b00000111));
AdjustTimesFlag=0;
/*********
//AdjustTimes++; //AdjustTimes為功率狀態(第幾格)
//wdt_reset();
AdjustTimes=(++Adj)/2;
//AllState&=0b01000000;
//AllState|=(uchar)(AdjustTimes<<3)+LevelState;
Save_Flag();
if(Adj>8)Adj=1;
if(Adj%2)alarm_n_short(1);//Beep_short(1,200);
DelayMs(500);//延時消抖,防止AdjustTimes重復++
*********/
while((PINC&(1<<ADJUST))==0)
{
DelayMs(1);
}
AdjustTimes=(++Adj)/2;
if(Adj>8)Adj=1;
Save_Flag();
if(Adj%2)alarm_n_short(1);//Beep_short(1,200);
}
else if(AdjustTimesFlag==0)
{
if(((AllState&0b01000000)>>6)==1)ChargeADJUSTState_Display(10,(uchar)((AllState&0b00111000)>>3),(uchar)(AllState&0b00000111));
else ADJUSTState_Display(10,(uchar)((AllState&0b00111000)>>3),(uchar)(AllState&0b00000111));
}
/**********
if((Flag==1)&&(KeyState==2))
{KeyState=0;//wdt_reset();
DelayMs(1000);SwitchTimes=1;}//長按關機
************/
break;
case 0x03:
Can_read=0,AllState=0,LevelState=1,OutState=0,ChargeState=0,LedSec=0,Time_minu=0,mh=0,ml=0,SwitchTimes=0,AdjustTimes=0,Time_sec=0;
times=0,ChargeTimes=0,KeyState=0,ChargeFlag=0,LedFlag=0,ChargeFlagTimes=0,VoltageTimes=0,WorkFlag=0,Flag=1,FlagTimes=0,FirstFlag=0,DelayFlag=0,AdjustTimesFlag=0,KeyOld=0,Adj=1,AlarmFlag=0,AbandonFlag=0;
mid=0,ADTimes=0,VoltageResult_AD=0,ChargeResult_AD=0;
Init_Device();
Init_Flag();
AllState&=0b01000000;
AllState|=(uchar)(AdjustTimes<<3)+LevelState;
default:
break;
}
}
uchar KeyScan (uchar ret)
{
//puts("KeyScanT");
/****
#define POWER PB6
#define WORK PC4
#define ADJUST PC5
#define RESET PC6
***/
if((PINB&(1<<POWER))==0)
{
//DelayMs(1);
if((PINB&(1<<POWER))==0)
{
ret=0;
//AbandonFlag=1;
//break;
//puts("ret=");puts("0x00#");
// if(LedFlag==0){
LedSec=0;
Flag=0;
//FirstFlag=1;
PORTC|=(1<<6);//}//LED背光給電10秒
}
}
else if((PINC&(1<<WORK))==0)
{
//DelayMs(1);
if((Flag==1)&&(PINC&(1<<WORK))==0)
{
ret=1;
//AbandonFlag=1;
//break;
//puts("ret=");puts("0x01#");
// if(LedFlag==0){
LedSec=0;
PORTC|=(1<<6);//}//LED背光給電10秒
}
}
else if((PINC&(1<<ADJUST))==0)
{
//DelayMs(1);
if((Flag==1)&&(PINC&(1<<ADJUST))==0)
{
ret=2;
//break;
//puts("ret=");puts("0x02#");
AdjustTimesFlag=1;
//AbandonFlag=1;
// if(LedFlag==0){
LedSec=0;
PORTC|=(1<<6);//}//LED背光給電10秒
}
}
else if((PINB&(1<<RESET))==0)
{
//DelayMs(1);
if((PINB&(1<<RESET))==0)
{
ret=3;
PORTC|=(1<<6);//}//LED背光給電10秒
}
}
/******
while(((PINB&_BV(POWER))!=_BV(POWER))||((PINC&(_BV(WORK)|_BV(ADJUST)))!=(_BV(WORK)|_BV(ADJUST)))) //
{ DelayMs(1);}
********/
if(ret!=KeyOld)
{
if((PINB&(1<<POWER))==0)
{
DelayFlag=0;
Flag=0;
//FirstFlag=1;
}
else
if((PINC&(1<<WORK))==0)
{
Flag=0;
Time_minu=0;
Time_sec=0;
}
KeyOld=ret;
return KeyOld;
}
else
{
/***
if(ret=2)
{
while((PINB&_BV(ADJUST))!=_BV(ADJUST))
{asm("nop"::);}
AdjustTimesFlag=1;
}
******/
return ret;
}
}
void putc(uchar c)
{
while(!(UCSRA&(1<<UDRE)));
UDR=c;
}
uchar getc(void)
{
while(!(UCSRA&(1<<RXC)));
return UDR;
}
void puts(char *ptr)
{
while (*ptr)
putc(*ptr++);
}
void AD_init(void)
{
ADCSRA=0X00;
ACSR|=(1<<ACD);//關閉模擬比較器
ADMUX|=(1<<REFS0)|(6&0x0F); //
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS1);//ADC轉換 64分頻
}
unsigned int read_adc (uchar r,uchar m)
{
unsigned int adc_rel;
ADMUX=0;
ADMUX |=(m&0x0F);//選擇通道
ADMUX |=(r<<6);//選擇基準
ADCSRA|=(1<<ADSC);//啟動AD轉換
DelayUs(125);
adc_rel=ADC&0x3FF;
return(adc_rel);
}
unsigned int BT_V(void)
{
unsigned char i;
unsigned int a=0;
unsigned int BT_V;//電池電壓
i=read_adc(1,6);//第一次轉換,不要
for (i=0;i<16;i++)
{
a+=read_adc(1,6);//內部基準(3.3V),ADC6
}
BT_V=(a>>4);
if(BT_V>65530)
BT_V=0;
return BT_V;
}
unsigned int BT_C(void)
{
unsigned char i;
unsigned int a=0;
unsigned int BT_C;//電池電壓
i=read_adc(1,7);//第一次轉換,不要
for (i=0;i<16;i++)
{
a+=read_adc(1,7);//內部基準(3.3V),ADC7
}
BT_C=(a>>4);
if(BT_C>65530)
BT_C=0;
return BT_C;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -