最近調試GPS的一個模塊,需要把數據從GPS讀取,再通過串口發送給PC機等一些功能。要用到2個串口,我使用了AMTEGA8A單片機,所以用普通IO模擬做了一個串口。花了我兩個晚上的時間,才調試好模擬串口程序,也遇到不少的問題,今天終于搞定了。但是還只是波特率1200,校驗位N 數據8 停止1 ,以后再慢慢完善。 模擬串口主要是先要考慮到波特率和數據格式。我采用的1200的波特率,所以一個位的時間是:1s/1200=833.3333333us .這里我沒用定時器,我是用延時來實現定時的,一個位的延時時間定為833us,AVR里面的延時程序還是比較精確的,我用示波器觀察波形,也是正確的。一般串口協議(校驗位N 數據8 停止1 )以我現在調試這個來說,比較簡單,一個起始位,8位數據,一個停止位,每一位時間都是833us 以下是我調試的電路板子: 源程序: /*******************ATMEGA8A_GPS****************************************/ /*****File Function : I/O模擬串口調試 *****/ /*****Program Author : ZhengWen(ClimberWin) *****/ /*****MCU : ATMEGA8A 內部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>=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>=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機 } } |