<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        AVR單片機串口操作程序

        作者:善良死神   來源:互聯網   點擊數:  更新時間:2014年06月05日   【字體:

         #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}; //雙紅外發射數據 取PD2作為驅動遠程紅外發射
        //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作為驅動遠程紅外發射 //取PD3驅動紅外發射
         
         
        uchar8 BitCount=0; //載波計數
        uchar8 BetyCount=0; //位計數
        volatile uchar8 UsartDataBuff=0;
        volatile uchar8 ChargeFlag=0,LED_Count;
        volatile uchar8 SYSCount=0;
        volatile uint16 ADCCurrent1=0; //AD0轉換結果  電壓檢測
        volatile uint16 ADCCurrent3=0; //AD3結果轉換 電流檢測
         
         
        void Port_Init(void)
        {
        DDRA  = 0b00000000;     //AD采樣 PA0 PA1
        PORTA = 0b00000000;     //PA口:初始化0
        //PB PC 沒有使用
        DDRD  = 0b11111110;     //PD2 為遠程紅外發射 PD3 和 PD4 狀態指示燈,P3未充電 P4表示充電 PD5和PD6 雙紅外近區發射 PD7 開關充電使能
        PORTD = 0b00000011;     //初始化輸出為0 其中USART 接收口上拉高電平 等待接收中斷
         
         
        }
         
         
        void ADC_Init(void)
        {
        ADCSRA=0x00; //ADC控制狀態寄存器
        ADMUX =0x40; //ADC 多工選擇寄存器 參考電壓為AVCC,其中AREF 引腳外加濾波電容 數據右對齊結果選擇0通道
        ACSR  =(1<<ACD);        //模擬比較器控制和狀態寄存器 關閉模擬比較器 這里可以節約電能
        ADCSRA=(1<<ADEN)|(1<<ADSC)|_BV(ADPS2)|_BV(ADPS1)|_BV(ADPS0);  //AD使能,禁止自動觸發,中斷標志,64分頻,AD中斷不使能,ADC轉換啟動
        }
         
         
         
         
         
         
        uint16 ADC_Read(unsigned char Channelx)
        {
         
         
        uint16 ADTempValue;
        ADMUX=0xc0|(Channelx&0x0f);//ADMUX = 0xe0|Channelx; //2.56V 的片內基準電壓源, AREF 引腳外加濾波電容 數據右對齊結果
        ADCSRA|=(1<<ADSC);      //啟動AD轉換
        loop_until_bit_is_set(ADCSRA,ADIF); //等待AD轉換結束其實也可以采用中斷方式來讀
        ADCSRA|=(1<<ADIF);                                             //寫1清除標志位
        ADTempValue=ADC&0x3ff;                                           //ADC=0000 00ADCH ADCL 共16
          return ADTempValue;
        }
         
         
         
         
        void Timer0_Init(void)
        {
        TCCR0 = 0x00; //定時器0的控制寄存器,初始化時停止定時器
        TCNT0 = 0x00; //計數器的初始值
        OCR0  = 210; //設置比較值 設置為210 8M時鐘 大概是38K 實現紅外發射
        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位數據
        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); //關中斷
        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();          //開全局中斷關全中斷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];
        }
        }
         
        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮