新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > ATMEGA8A 單片機I/O口模擬串口

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

作者: 時間:2016-09-07 來源:網(wǎng)絡(luò) 收藏

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

本文引用地址:http://2s4d.com/article/201609/296666.htm

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

  以下是我調(diào)試的電路板子:

  

 

  

 

  源程序:

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

  /*****File Function : 模擬串口調(diào)試 *****/

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

  /*****MCU : 內(nèi)部4M RC/外部4M 晶振 *****/

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

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

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

  //按鍵LED顯示測試OK

  //修改時間:2010.10.20

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

  //串口發(fā)送OK,波特率設(shè)置為1200 校驗位N 數(shù)據(jù)8 停止1

  //修改時間:2010.10.21

  //串口接收數(shù)據(jù)OK,+1后 返回發(fā)送給電腦

  #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);//模擬串口發(fā)送程序

  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);

  }

  ///////////////////////模擬串口發(fā)射程序//////////////////

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

  {

  uchar i;

  uchar Sent_SBUF;

  Sent_SBUF=TXD_data;

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

  _delay_us(833);

  while(i<8) //發(fā)送8位數(shù)據(jù)

  {

  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);//發(fā)送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); //發(fā)送0x55測試

  while(1)

  {

  i=IO_UART_Receive();

  _delay_ms(20);

  IO_UART_Sent(0xaa);

  _delay_ms(20);

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

  }

  }



關(guān)鍵詞: ATMEGA8A I/O

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉