新聞中心

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

        ATMEGA8A 單片機(jī)I/O口模擬串口

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

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

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

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

          //修改時(shí)間:2010.10.20

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

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

          //修改時(shí)間:2010.10.21

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

          #include

          #include //延時(shí)程序

          #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); //按鍵測(cè)試程序

          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) //按鍵測(cè)試程序

          {

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

          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信號(hào)

          _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); //開(kāi)機(jī)延時(shí)

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

          _delay_ms(100);//開(kāi)機(jī)延時(shí)

          IO_UART_Sent(0x55); //發(fā)送0x55測(cè)試

          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機(jī)

          }

          }



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

        評(píng)論


        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 洪洞县| 徐州市| 巨鹿县| 名山县| 常山县| 罗平县| 平舆县| 敦煌市| 公主岭市| 洪雅县| 凯里市| 桃园县| 沧源| 盐亭县| 调兵山市| 界首市| 南昌市| 涡阳县| 大余县| 东台市| 靖州| 墨脱县| 仙游县| 鞍山市| 翼城县| 板桥市| 曲阜市| 武冈市| 化隆| 崇左市| 平泉县| 襄樊市| 垣曲县| 麻城市| 尼玛县| 农安县| 句容市| 抚州市| 临高县| 龙山县| 腾冲县|