新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ATMEGA8A 單片機I/O口模擬串口

        ATMEGA8A 單片機I/O口模擬串口

        作者: 時間:2016-09-07 來源:網絡 收藏

          最近調試GPS的一個模塊,需要把數據從GPS讀取,再通過串口發送給PC機等一些功能。要用到2個串口,我使用了AMTEGA8A單片機,所以用普通IO模擬做了一個串口。花了我兩個晚上的時間,才調試好模擬串口程序,也遇到不少的問題,今天終于搞定了。但是還只是波特率1200,校驗位N 數據8 停止1 ,以后再慢慢完善。

        本文引用地址:http://www.104case.com/article/201609/296666.htm

          模擬串口主要是先要考慮到波特率和數據格式。我采用的1200的波特率,所以一個位的時間是:1s/1200=833.3333333us .這里我沒用定時器,我是用延時來實現定時的,一個位的延時時間定為833us,AVR里面的延時程序還是比較精確的,我用示波器觀察波形,也是正確的。一般串口協議(校驗位N 數據8 停止1 )以我現在調試這個來說,比較簡單,一個起始位,8位數據,一個停止位,每一位時間都是833us

          以下是我調試的電路板子:

          

         

          

         

          源程序:

          /*******************_GPS****************************************/

          /*****File Function : 模擬串口調試 *****/

          /*****Program Author : ZhengWen(ClimberWin) *****/

          /*****MCU : 內部4M RC/外部4M 晶振 *****/

          /*****Compile Date : 2010/10/19 *****/

          /*****Edition Info : V1.0 *****/

          /****************************************************************************/

          //按鍵LED顯示測試OK

          //修改時間:2010.10.20

          //編寫模擬串口程序 define:PC3=RXD PC2=TXD

          //串口發送OK,波特率設置為1200 校驗位N 數據8 停止1

          //修改時間:2010.10.21

          //串口接收數據OK,+1后 返回發送給電腦

          #include

          #include //延時程序

          #define uchar unsigned char

          #define uint unsigned int

          //引腳定義

          #define IO_RXD 3 //PC3 模擬RXD

          #define IO_TXD 2 //PC2 模擬TXD

          #define LED1 4 //PD4 LED1

          #define LED2 3 //PD3 LED2

          #define KEY1 0 //PB0 按鍵1

          #define KEY2 1 //PB1 按鍵2

          /*位移宏定義*/

          #define Set_Bit(val, bitn) (val |=(1<<(bitn))) //位置高

          #define Clr_Bit(val, bitn) (val&=~(1<<(bitn))) //位置低

          #define Get_Bit(val, bitn) (val &(1<<(bitn)) ) //取某一位的值

          void keytest(void); //按鍵測試程序

          void IO_int(void); //端口初始化配置

          void IO_UART_Sent(uchar TXD_data);//模擬串口發送程序

          uchar IO_UART_Receive(void); //模擬串口接收程序

          void IO_int(void)

          {

          DDRD=0xff;//定義PORTD端口為輸出

          DDRB=0xFC;//

          DDRC=0xF7;//配置模擬串口輸入輸出

          PORTD=0xFF;

          PORTB=0xFF;

          PORTC=0xFF;

          }

          void keytest(void) //按鍵測試程序

          {

          /*********************************************/

          if(Get_Bit(PINB,KEY1)==0)

          {

          Clr_Bit(PORTD,LED1);

          IO_UART_Sent(0xaa);

          //////////////////

          while(Get_Bit(PINB,KEY1)==0) //按鍵去抖

          { _delay_ms(1000);}

          }

          /**********************************************/

          if(Get_Bit(PINB,KEY2)==0)

          {

          Clr_Bit(PORTD,LED2);

          IO_UART_Sent(0x74);

          //////////////////

          while(Get_Bit(PINB,KEY2)==0) //按鍵去抖

          { _delay_ms(1000);}

          }

          /******************************************/

          Set_Bit(PORTD,LED1);

          Set_Bit(PORTD,LED2);

          }

          ///////////////////////模擬串口發射程序//////////////////

          void IO_UART_Sent(uchar TXD_data) //波特率1200

          {

          uchar i;

          uchar Sent_SBUF;

          Sent_SBUF=TXD_data;

          Clr_Bit(PORTC,IO_TXD);//發送起始位START

          _delay_us(833);

          while(i<8) //發送8位數據

          {

          Clr_Bit(PORTD,LED1);

          if(Sent_SBUF & 0x01)

          {Set_Bit(PORTC,IO_TXD);}

          else

          {Clr_Bit(PORTC,IO_TXD);}

          Sent_SBUF>>=1;

          _delay_us(833);

          i++;

          Set_Bit(PORTD,LED1);

          }

          Set_Bit(PORTC,IO_TXD);//發送STOP信號

          _delay_us(833);

          }

          ///////////////////////模擬串口接收程序//////////////////

          uchar IO_UART_Receive(void) //波特率1200

          {

          uchar i;

          uchar Recieve_SBUF=0x00;

          i=0x00;

          while(Get_Bit(PINC,IO_RXD));

          _delay_us(833);

          while(i<8)

          {

          Clr_Bit(PORTD,LED2);

          Recieve_SBUF>>=1;

          if(Get_Bit(PINC,IO_RXD))

          {Recieve_SBUF|=0x80;}

          i++;

          _delay_us(833);

          Set_Bit(PORTD,LED2);

          }

          while(!Get_Bit(PINC,IO_RXD));

          return Recieve_SBUF;

          }

          //////////////////主程序///////////////////////

          int main()

          {

          uchar i;

          _delay_ms(100); //開機延時

          IO_int(); //IO初始化配置

          _delay_ms(100);//開機延時

          IO_UART_Sent(0x55); //發送0x55測試

          while(1)

          {

          i=IO_UART_Receive();

          _delay_ms(20);

          IO_UART_Sent(0xaa);

          _delay_ms(20);

          IO_UART_Sent(i+1); //如果接收到串口數據后 ,+1 發送回給PC機

          }

          }



        關鍵詞: ATMEGA8A I/O

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 辽源市| 南康市| 通化县| 吉林市| 高尔夫| 玉环县| 曲水县| 长岛县| 叶城县| 十堰市| 施甸县| 革吉县| 武清区| 阜南县| 洪雅县| 织金县| 密云县| 肇东市| 松江区| 阜平县| 西青区| 广平县| 沧州市| 天柱县| 浠水县| 中阳县| 班戈县| 珲春市| 东辽县| 琼海市| 武平县| 景泰县| 盐边县| 海淀区| 清丰县| 红桥区| 新津县| 山丹县| 麻阳| 麻城市| 巫溪县|