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

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

        MEGA16單片機_UART程序

        作者:佚名   來源:本站原創   點擊數:  更新時間:2014年09月01日   【字體:

         

         
         最常用的配置方式
         
        UCSRB=0x00;
        UCSRA=0x00;     //控制寄存器清零
        UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0);//選擇UCSRC,異步模式,禁止校驗,1位停止位,8位數據位
        baud=MCLK/16/baud-1    //波特率最大為65K
        UBRRL=baud;         
        UBRRH=baud>>8;    //設置波特率
        UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);//接收、發送使能,接收中斷使能
        SREG=BIT(7);                 //全局中斷開放
        DDRD|=0X02;                 //配置TX為輸出(很重要)
         
         就是編程三個寄存器與設置波特率。調通簡單,調精不容易。
        #include "uart.h"
        void main(void)
        {
           uchar *str = "Hello World!";
            SystemInit();
            UartInit(19200);
          while(1)
          {
           if(flag)
           {
            flag = 0;
            //Show(rdata,1);
            UartSendB(rdata);
            PutString(str);
            CR();
            SPACE();
           }
          } 
        }
        //////////////////////////////////////////////////////////////////////
        #include <iom16v.h>
        #include <macros.h>
        #include "uart.h"
         
        #define  mclk   8000000
        #pragma interrupt_handler UartRx:12
        volatile uchar rdata;
        uchar flag=0;
        /*void delay(uint ms)
        {
         uchar i;
         while(--ms)
         {
             for(i=1141;i>0;--i);
         }
        }*/
        //**********************************************************************
        //函 數 名:     void PutString(unsigned char  *puts)
        //功    能:   發送字符串到串口
        //說    明:     
        //參    數:     發送的字符串
        //返 回 值:
        //示    范:   putstring("\r\n")
        //***********************************************************************
            void PutString(uchar  *puts)
           {
               //for(;*puts!=0;puts++)   //遇到停止符0結束
            while(*puts!=0)
            {
               UartSendB(*puts++);
            }
           }
        void UartInit(uint baud)
        {
          UCSRA &= 0x00;
          UCSRB &= 0x00;
          UCSRC |= 0x86;//寄存器選擇、字符長度為8,
          baud = mclk/16/baud-1;
          UBRRL = baud;
          UBRRH = baud>>8;
          UCSRB = 0x98;//接收中斷使能、接收使能、發送使能
          SREG |= 0x80;
          DDRD |= 0x02;//TX為輸出(重要)
        }
        void UartSendB(uchar data)
        {
         while(!(UCSRA & 0x20));//UDRE為空時置位
         UDR  = data;
         while(!(UCSRA & 0x40));//TXC為空時置位
         UCSRA |= 0x40;
        }
        void UartRx(void)
        {
         UCSRB &= 0x7F;//接收結束中斷禁止
         rdata = UDR;  //存儲緩沖區的數據
         flag = 1;  //接收標志置位
         UCSRB |= 0X80;//接收結束中斷使能
        }
        void SystemInit(void)
        {
          DDRA |= (1<<2)|(1<<3)|(1<<4)|(1<<6);
         DDRB |= 0xFF; 
         PORTA |= (1<<2)|(1<<6);
         PORTB = 0xFF; 
         PORTA &= (~(1<<2))&(~(1<<6));
        }
        //////////////////////////////////////////////////////////////////////////
        #ifndef __UART_H__
        #define __UART_H__
        #include <iom16v.h>
        #include <macros.h>
        #define CR() PutString("\r\n")        //CR=回車換行
        #define SPACE() UartSendB(0x20)         //發送一個空格。
        #define  uchar unsigned char
        #define  uint  unsigned int
        extern volatile uchar rdata;
        extern uchar flag;
        //void delay(uint ms);
        void UartInit(uint baud);
        void UartSendB(uchar data);
        void UartRx(void);
        void SystemInit(void);
        void PutString(uchar  *puts);
        #endif
         
        關閉窗口
        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮