李園喜 劉 志 楊家成
(91550部隊3分隊 遼寧 大連 116023)
基于音頻信道無線傳輸定位數據的軟件設計
李園喜 劉 志 楊家成
(91550部隊3分隊 遼寧 大連 116023)
采用單片機為主控核心,以圖像傳輸微波機的音頻傳輸通道為通信手段,對海上圖像傳輸微波機進行實時定位。本文介紹了實現該方案各功能電路的單片機驅動軟件設計思想。
功能電路; 驅動軟件; 實時定位
海上圖像傳輸微波機沒有實時定位功能,在試驗中給天線調整和圖像接收帶來諸多不便,在歷次海上圖像傳輸保障中問題暴露最為明顯。為了解決此問題,二三O所三室提出了通過雙音多頻(DTMF)信號調制GPS定位數據的方法,通過圖像微波機傳輸設備的冗余伴音信道,實現圖像微波機所在點位進行實時傳輸的思想,并且設計了一整套的實現硬件方案。本文根據該硬件方案設計了對各功能硬件進行控制的單片機驅動軟件。

1.1總體組成
本軟件的硬件平臺由海上GPS定位數據發送端和陸上GPS定位數據顯示端組成。
海上GPS定位數據發送端需要編寫大容量FLASH存儲器的驅動軟件、DTMF編解碼電路的驅動軟件、GPS OEM板驅動軟件。
陸上GPS定位數據顯示端需要編寫LCD顯示器的驅動軟件、觸摸屏控制器的驅動軟件和DTMF編解碼電路的驅動軟件。
驅動軟件的內容如圖1所示。
1.2海上端硬件驅動軟件設計
1.2.1 GPS OEM板驅動軟件設計
GPS OEM板上電工作后,按照一定的波特率輸出NMEA0183語句。方案采用GARMINGPS25LP GPS OEM板,該板出廠時默認波特率為4800bps,輸出語句為$GPGGA 、$ GPGSA 、 $GPGSV 、$GPRMC 和 $PGRMT語句,因此GPS OEM板上電工作后就會以4800bps每秒分別輸出一幀$GPGGA 、$ GPGSA 、 $GPGSV 、$GPRMC和 $PGRMT語句。可以通過 $PGRMO 語句屏蔽它們。$PGRMO語句格式為:$PGRMO,<1>,<2>,*hh<CR><LF>
根據單片機測量需要,只保留輸出$GPRMC語句,通過單片機串口向GPS OEM板輸入:
$PGRMO,,2 (屏蔽所有輸出語句)
$PGRMO, GPRMC,1 (激活GPRMC語句)
通過以上設置后,GARMINGPS25LP將連續輸出$GPRMC數據,波特率為4800bps。
單片機讀取$GPRMC語句的程序設計方法如下:
對于圖像傳輸微波機定位來說,只關心GPS OEM板輸出的的經緯度和時間。因此在設計讀取$GPRMC語句的單片機軟件時,只關心四組數據,即:UTC當地時間的時分秒(hhmmss),UTC當地時間,日月年(ddmmyy);緯度ddmm.mmmm,經度dddmm.mmmm。對GARMIN GPS25LP進行設置后,每隔一秒GARMIN GPS25LP將發送一幀$GPRMC數據。$GPRMC語句格式為:
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<1 0>,<11>,<12>,*hh<CR><LF>
·<1> : UTC 當地時間,hhmmss格式。
·<2> :工作狀態, A =可用; V =接收器警報,不可用。
·<3> :緯度, ddmm.mmmm格式(前面的 0 也會傳送)。
·<4> :緯度半球, N 或者 S。
·<5> :經度,dddmm.mmmm格式(前面的 0 也會傳送)。
·<6> :經度半球, E 或者 W 。
·<7> :對地速度,000.0 ~9999.9 節(前面的 0也會傳送)。
·<8> :對地航向,000.0o~ 359.9o(前面的 O也會傳送)。
·<9> :UTC當地時間, ddmmyy 格式。
·<10>:磁變,磁偏角地球磁場在不同時間、不同地點的偏差,000.0 ~180.0度。
·<11>:磁變方向,E & W 。
·<12>:工作模式,A=自主,D=差分,E=評估,N=數據無效。
從$GPRMC數據格式,可以知道第一個逗號之后的字符屬于時間的時、分、秒數據;第三個逗號之后的字符屬于緯度數據;第五個逗號之后的字符屬于經度數據;第九個逗號之后的字符屬于時間的日、月、年數據。因此,從收到第一個字符"$"后,通過判斷逗號就可以尋找到設計所關心的數據,具體程序如下:
serial () interrupt 4 using 1 //輔單片機串行口中斷程序
{RI=0; //軟件清除中斷標志位
if (SBUF==0x24) //判斷是否收到GPRMC格式語句的第一個字符"$",
{record=1; //其數值為0x24,收到后開始記錄數據,并設置記錄標志
igps=0; // 記錄緯度數據字符數量的變量
numbercoma=0; // 記錄逗號數量的變量
}
if (record==1) // 開始處理GPRMC中的數據信息
{ if(SBUF==0x2c) //利用GPRMC數據中的逗號間隔, {numbercoma++; igps=0; //區分接收到的字符處于何種數據中。
}
if (numbercoma==1) // 第一個逗號之后的字符屬于時間的
{stringtime1[igps]=SBUF; //時、分、秒數據
igps++;
}
if (numbercoma==3) // 第三個逗號之后的字符屬于緯度數據
{stringlat[igps]=SBUF;
igps++;
}
if (numbercoma==5) // 第五個逗號之后的字符屬于經度數據
{stringlon[igps]=SBUF;
igps++;
}
if (numbercoma==9) // 第九個逗號之后的字符屬于時間的日、月、年數據
{stringtime2[igps]=SBUF;
igps++;
}
if (SBUF=='*') //判斷是否收到GPRMC格式語句的字符"*",如果收到, {numbercoma=0; //則結束記錄,
record=0;
igps=0;
}
}
}
以上程序將GPS時間的時、分、秒數據存放在stringtime1[] 數組中,共占6個字節;將日、月、年數據存放在stringtime2[]數組中,共占6個字節;將緯度數據存放在stringlat[]數組中,共占10個字節;將經度數據存放在stringlon []數組中,共占10個字節。
1.2.2 FLASH存儲器驅動軟件設計
FLASH存儲器選用三星K9F2808UC0C。該芯片容量為132Mbits,由1024塊組成,每塊又由32頁組成,一頁有528字節(512+16)×8bit。對K9F2808UC0C進行讀寫操作時,必須以頁為單位進行操作。對K9F2808UC0C進行擦除操作,必須以塊為單位進行操作。從設計方案可知,單片機的P25、P26用于控制74LS245的數據方向。K9F2808UC0C的驅動程序由讀數據程序、寫數據程序、擦除程序和寫命令程序三部分組成。具體程序如下:
//************讀FLASH MEMORY 程序*************
void FlashRead(unsigned int pg)
{
unsigned int l; //每個扇區有528個字節
P24=0; //CS=0;選中k9f2808;
WriteCommand(0); //寫讀命令
P25=0; //74LS245處于輸入狀態
while(!RB);
P25=1; //74LS245處于輸出狀態
WriteAddress(0,pg); //確定讀地址
P26=0;
for(l=0;l<512;l++) //連續讀取一頁的數據
{ P0=0xff;
RD=0;
Readdata[l]=P0; //不再讀入
RD=1;
}
P26=1;
P24=1; //cs=1;不再選中k9f2808;
}
//***********寫FLASH MEMORY 程序*****************************
void FlashPagWrite(void)//頁寫操作
{
WDI=0;
P24=0; //CS=0;選中k9f2808;
WriteCommand(16); //將數據寫入flash 0x10
P25=0; //74LS245處于輸入狀態
while(!RB);//等待數據寫入結束
P25=1; //74LS245處于輸出狀態
WriteCommand(112); //讀狀態量
P25=0;while(!RB);
P25=1; //等待數據寫入結束
P26=0;
P0=0xff;
RD=0; //準備好讀入
ACC=P0;
ACC=ACC&0x01;
RD=1;
P26=1;
if(ACC!=0) //若最后一位不為零FLASH損壞
{Invbadr[j]=FlashPagCount; //記錄損壞的FLASH頁碼
j++;
}
FlashPagCount+=1;//頁碼加1
FlashAdrCount=0;
WriteCommand(128); //頁寫命令0x80;
P25=0;while(!RB);P25=1; //等待數據寫入結束
WriteAddress(FlashAdrCount,FlashPagCount); //寫地址
P25=0;while(!RB);P25=1; //等待數據寫入結束
}
//*************FLASH MEMORY擦除程序***************************
void FlashErase(unsigned int a)
{
unsigned int blockcount;
P24=0; //CS=0;選中k9f2808;
for(blockcount=0;blockcount!=a;blockcount++)
{WDI=0;
WriteCommand(96);//塊擦除預命令0x60
WriteAdrpage(32*blockcount);
WriteCommand(208);//塊擦除確認命令0xD0
P25=0;
while(!RB);P25=1;
WriteCommand(112);//讀擦除狀態命令0x70
P25=0;while(!RB);P25=1;
P26=0;
RD=0;
dl_us(1);
ACC=P0;
RD=1;
P26=1;
ACC=ACC&0x01;
if(ACC!=0)//擦除失敗
{Invbadr[0]=blockcount;
j++;
}
}
P24=1; //Cs=1;不再選中k9f2808;
}
//*********寫命令程序*************************
void WriteCommand(unsigned char comd)
{
P26=P25=1;
P20=1;dl_us(1);
P0=comd;
WR=0; dl_us(1);
WR=1; dl_us(1);
P20=0;
}
1.2.3 DTMF編解碼電路驅動軟件設計
GPS定位數據經過DTMF MT8880編碼后,通過圖像微波機傳輸設備的伴音信道傳送到陸上的圖像微波機端。陸上的圖像微波機端接收到DTMF信號的GPS定位數據后,經過DTMF MT8880解碼轉換成數字信號,由CPU 的INT0中斷接收。對MT8880的操作由初始化程序,數據發送程序,數據接收程序組成。具體實現程序如下:
void initialize8880(void) // MT8880初始化
{CS=0;CK=0;
RS=1;RW=1;/*讀狀態寄存器*/
CK=1; _nop_();//重復賦值起延時作用
CK=0;
//****************
RS=1;RW=0;/*寫控制寄存器*/
P10=P11=P12=P13=0;/*控制寄存器清零*/
CK=1; _nop_();
CK=0;
//****************
RS=1;RW=0;/*寫控制寄存器*/
P10=0;P11=0;P12=1;P13=1;/*控制寄存器A值為0XD0*/
CK=1; _nop_();
CK=0;
//****************
RS=1;RW=0;/*寫控制寄存器*/
P10=1;P11=0;P12=0;P13=0;/*控制寄存器B值為0X01*/
CK=1; _nop_();
CK=0;
//****************
RS=1;RW=1;/*讀狀態寄存器*/
CK=1; _nop_();
CK=0;
}
//****************************************
void int1(void) interrupt 3 // 89C51中斷方式接收MT8880數據
{ uchar abc,A;
Delay(3000);
CS=0; CK=0;
RW=1;RS=1;/*讀狀態寄存器*/
CK=1; _nop_();
CK=0; _nop_();
CK=1;
P10=1;P11=1;P12=1;P13=1;/*讀數據前單片機總線賦F*/
RW=1;RS=0;/*讀接收數據寄存器*/
Delay(30);
abc=P1&0x0f; //讀入數據
CK=1; _nop_();
CK=0; _nop_();
}
//******************************************* ***************
void mt8880_WriteData(uchar SendData) // mt8880發送數據
{ CS=0; CK=0;
RS=0; RW=0;
CK=1;_nop_();
P1|=SendData;
_nop_();
CK=0;_nop_();
RW=1;RS=1;
CS=1;
CK=0;
}
1.3陸上端硬件驅動軟件設計
1.3.1 觸摸屏控制器驅動軟件設計
本設計中采用觸摸屏專用控制芯片ADS7843實現對觸摸屏的控制。它是一款具有同步串行接口的12位取樣模數轉換器。由于89C51沒有專門的同步串行接口,因此采用I/O口模擬同步串行接口(SPI)的方式進行設計,觸摸屏被按下時產生INT1中斷,單片機通過INT1中斷服務程序實現觸摸點位置的讀取。具體驅動程序如下:
//************I/O定義***************************
// DCLK-------P24
// CS7843-----P234
// DIN ---------P22
// BUSY ------P21
// DOUT-------P20
//*********寫ads7843**********************
void ads7843_wr(unsigned char num) //SPI寫數據
{unsigned char i=0;
DCLK=0;
for(i=0;i<8;i++)
{ num<<=1;
DIN=CY;
DCLK=0;delay(0); //上升沿有效
DCLK=1; delay(0);}
}
//********讀ads7843************************
unsigned int ads7843_rd() //SPI 讀數據
{unsigned char i=0;
unsigned int Num=0;
for(i=0;i<12;i++)
{ Num<<=1;
DCLK=1; delay(0); //下降沿有效
DCLK=0; delay(0);
if(DOUT) Num++;
}
return(Num);
}
//**********INT0中斷服務程序****************************
ext_1() interrupt 2
{delay(10000); //中斷后延時以消除抖動,使得采樣數據更準確
DCLK=0;
DIN=1;
DCLK=1;
CS7843=0;
while(BUSY); //如果BUSY信號不好使可以刪除不用
delay(2);
ads7843_wr(0x90); //送控制字 10010000 即用差分方式讀X坐標 詳細請見有關資料
while(BUSY); //如果BUSY信號不好使可以刪除不用
delay(2);
DCLK=1; delay(0);
DCLK=0; delay(0);
X=ads7843_rd();
ads7843_wr(0xD0); //送控制字 11010000 即用差分方式讀Y坐標 詳細請見有關資料
DCLK=1;delay(0);
DCLK=0;delay(0);
Y=ads7843_rd();
CS7843=0;
}
1.3.2 LCD顯示電路驅動軟件設計設計
本設計采用臺灣晶采光電科技股份有限公司生產的AG320240A4STCW-T51液晶顯示屏,該液晶顯示屏內置SED1335 LCD控制器,具有320列240行的顯示能力。LCD顯示屏與單片機之間通過一片74ls245進行連接。LCD顯示屏主要有兩個程序,一個是寫命令程序,一個是寫數據程序,程序如下:
//******************************************* ****
void WLCDCOM(uchar com ) //寫LCD控制命令
{
P26=0; //選中LCD顯示屏
P34=0;
P35=0;
P0=com;
A0=1;
WD=0;
delay(1);
WD=1;
P26=1;//不選中LCD顯示屏
}
//******************************************* *************
void WLCDDATA(uchar ref ) //寫LCD參數和顯示字符數據
{
P26=0; //選中LCD顯示屏
P34=0;
P35=0;
P0=ref;
A0=0;
delay(5);
WD=0;
WD=1;
A0=1;
}
本設計中的USB接口電路不需要特意編寫驅動程序,PC機端的驅動程序Silicon公司免費提供,單片機端的驅動程序其實就是UART的收發程序。
本文根據海上圖像傳輸微波機實時定位所設計的的硬件實現方案,設計了相應的驅動軟件。論文中所涉及的軟件作者工作中都曾經配合相應電路使用過。年初在驗證DTMF信號進行數字通信的PCB板上,使用本文所設計的軟件成功實現了數字信號的發送和接收。因此可以說,本文所設計的軟件是可行的。
[1] 馬忠梅等,《單片機的C語言應用程序設計》,北京航空航天大學出版社,2003.
[2] 徐愛鈞 彭秀華.單片機高級語言C51 Windows環境編程與應用.電子工業出版社.
The software design of wireless transmission based on audio channel positioning data
LI Yuan-xi, LIU Zhi, YANG Jia-cheng. The People's Liberation Army 91550 Troops 3 division, Liaoning Province, Dalian 116023, China
By single chip microcomputer as the master control core to microwave image transmission machine audio transmission channel for communications, microwave machine image transmission in real time positioning of sea. This paper introduces the realization of the plan each function circuit of single chip microcomputer driver software design thought.
Function circuit; Driver software; Real time positioning
TP311
A
1009-5624-(2016)03-0057-06