#include
#include
#include
#include
#include
#define FOSC 8000000 //mcu工作時鐘頻率
typedef unsigned int uint16;
typedef unsigned char uchar8;
uchar8 DoubleIRData[25]={0x64,0x00,0x20,0x04,0x40,0x00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //雙紅外發(fā)射數(shù)據(jù) 取PD2作為驅(qū)動遠程紅外發(fā)射
//uchar8 SingleIRData[25]={0x60,0x00,0x04,0x00,0x04,0x00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} //取PD2作為驅(qū)動遠程紅外發(fā)射 //取PD3驅(qū)動紅外發(fā)射
uchar8 BitCount=0; //載波計數(shù)
uchar8 BetyCount=0; //位計數(shù)
volatile uchar8 UsartDataBuff=0;
volatile uchar8 ChargeFlag=0,LED_Count;
volatile uchar8 SYSCount=0;
volatile uint16 ADCCurrent1=0; //AD0轉(zhuǎn)換結(jié)果 電壓檢測
volatile uint16 ADCCurrent3=0; //AD3結(jié)果轉(zhuǎn)換 電流檢測
void Port_Init(void)
{
DDRA = 0b00000000; //AD采樣 PA0 PA1
PORTA = 0b00000000; //PA口:初始化0
//PB PC 沒有使用
DDRD = 0b11111110; //PD2 為遠程紅外發(fā)射 PD3 和 PD4 狀態(tài)指示燈,P3未充電 P4表示充電 PD5和PD6 雙紅外近區(qū)發(fā)射 PD7 開關(guān)充電使能
PORTD = 0b00000011; //初始化輸出為0 其中USART 接收口上拉高電平 等待接收中斷
}
void ADC_Init(void)
{
ADCSRA=0x00; //ADC控制狀態(tài)寄存器
ADMUX =0x40; //ADC 多工選擇寄存器 參考電壓為AVCC,其中AREF 引腳外加濾波電容 數(shù)據(jù)右對齊結(jié)果選擇0通道
ACSR =(1<<ACD); //模擬比較器控制和狀態(tài)寄存器 關(guān)閉模擬比較器 這里可以節(jié)約電能
ADCSRA=(1<<ADEN)|(1<<ADSC)|_BV(ADPS2)|_BV(ADPS1)|_BV(ADPS0); //AD使能,禁止自動觸發(fā),中斷標志,64分頻,AD中斷不使能,ADC轉(zhuǎn)換啟動
}
uint16 ADC_Read(unsigned char Channelx)
{
uint16 ADTempValue;
ADMUX=0xc0|(Channelx&0x0f);//ADMUX = 0xe0|Channelx; //2.56V 的片內(nèi)基準電壓源, AREF 引腳外加濾波電容 數(shù)據(jù)右對齊結(jié)果
ADCSRA|=(1<<ADSC); //啟動AD轉(zhuǎn)換
loop_until_bit_is_set(ADCSRA,ADIF); //等待AD轉(zhuǎn)換結(jié)束其實也可以采用中斷方式來讀
ADCSRA|=(1<<ADIF); //寫1清除標志位
ADTempValue=ADC&0x3ff; //ADC=0000 00ADCH ADCL 共16
return ADTempValue;
}
void Timer0_Init(void)
{
TCCR0 = 0x00; //定時器0的控制寄存器,初始化時停止定時器
TCNT0 = 0x00; //計數(shù)器的初始值
OCR0 = 210; //設(shè)置比較值 設(shè)置為210 8M時鐘 大概是38K 實現(xiàn)紅外發(fā)射
TIMSK|= 0x02; //開比較匹配中斷使能
}
void Timer2_Init(void)
{
TCCR2 = 0x00; //停止定時器
TCNT2 = 203; //初始值(1/8000000)*(255-203)=0.0000065
TIMSK |= 0x40;
}
void Timer1_Init(void)
{
TCCR1A = 0x00;
TCCR1B = 0x0b;
OCR1AH = 0xf4;
OCR1AL = 0x24;
TIMSK |= 0x10;
}
void Usart1_Init(uint16 baud)
{
UCSRB=0;
//UCSRA為默認值
UBRRL=(FOSC/16/baud-1)%6;//UBRRH = ((uchar8 *)(&baud))[1];
UBRRH=(FOSC/16/baud-1)/256;//UBRRL = ((uchar8 *)(&baud))[0];
UCSRC |=(1<<URSEL)|(3<<UCSZ0); //8位數(shù)據(jù)
UCSRC &= ~((1<<UPM1)|(1<<UPM0)|(1<<USBS))|(1<<UCPOL);//異步無校驗 1個停止位
// UCSRC |=(3<<UCSZ0);
UCSRB |= (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);//UCSRB = (1<<RXEN)|(1<<TXEN)
}
//uchar8 Usart_Read(void)
//{
// UCSRB |= (1<<RXEN);
// loop_until_bit_is_set(UCSRA,RXC);//等待Usart成功接收
// return UDR;
//}
ISR(SIG_USART_RECV)
{
UCSRB &= ~(1<<RXCIE); //關(guān)中斷
UsartDataBuff=UDR;
UCSRB |= (1<<RXCIE); //開中斷
}
ISR(TIMER0_COMP_vect)
{
PORTD=(PIND&0x9b)|DoubleIRData[BetyCount];
TCCR2 = 0x01;
}
ISR(TIMER2_OVF_vect)
{
PORTD=PIND&0x9F;
TCCR2 = 0;
TCNT2 = 203;
BitCount++;
if(BitCount>=66)//波特率=1/(0.00002625S*66)=577
{
BetyCount++;
if(BetyCount>=20)//25
{
//TCCR0=0;
//TCCR2=0;
BetyCount=0;
}
BitCount=0;
}
}
ISR(TIMER1_COMPA_vect)
{
SYSCount=1;
}
void Usart_send(uchar8 data)
{
while(!(UCSRA&(1<<UDRE)));
UDR=data;
}
int main(void)
{
MCUCR=0x00;
Port_Init();
Timer0_Init();
Timer1_Init();
Timer2_Init();
ADC_Init();
Usart1_Init(581);//581
sei(); //開全局中斷關(guān)全中斷cli()
TCCR0 = 0x09;
TCCR2 = 0x01;
while(1)
{
if(SYSCount==1)
{
Usart_send(UsartDataBuff);
SYSCount=0;
if(ChargeFlag==1)
{
PORTD|=(1<<PD4);
PORTD&=~(1<<PD3);
}
else
{
PORTD&=~(1<<PD4);
PORTD|=(1<<PD3);
}
if((PORTD&0x80)==0x80)//充電中
{
ADCCurrent1=ADC_Read(1); //電壓檢測 用
ADCCurrent3=ADC_Read(3); //選3通道 與電路不符 主要因為實驗板上0通道損壞 所以跳線3通道修正時間:2014.5.28
if(ADCCurrent3==0)//電流為0停止供電//0
{
PORTD&=~(1<<PD7);
ChargeFlag=0;
}
}
else
{
ADCCurrent1=ADC_Read(1);
if(ADCCurrent1>=200)//電壓大于開始供電//200
{
PORTD|=(1<<PD7);
ChargeFlag=1;
}
else
{
ChargeFlag=0;
}
}
//UsartDataBuff=Usart_Read();
if(UsartDataBuff)
{
}
}
//i=((uchar8 *)(&k))[0];
//j=((uchar8 *)(&k))[1];
}
}