李園喜 劉 志 楊家成
(91550部隊3分隊 遼寧 大連 116023)
基于音頻信道無線傳輸定位數(shù)據(jù)的軟件設(shè)計
李園喜 劉 志 楊家成
(91550部隊3分隊 遼寧 大連 116023)
采用單片機(jī)為主控核心,以圖像傳輸微波機(jī)的音頻傳輸通道為通信手段,對海上圖像傳輸微波機(jī)進(jìn)行實(shí)時定位。本文介紹了實(shí)現(xiàn)該方案各功能電路的單片機(jī)驅(qū)動軟件設(shè)計思想。
功能電路; 驅(qū)動軟件; 實(shí)時定位
海上圖像傳輸微波機(jī)沒有實(shí)時定位功能,在試驗(yàn)中給天線調(diào)整和圖像接收帶來諸多不便,在歷次海上圖像傳輸保障中問題暴露最為明顯。為了解決此問題,二三O所三室提出了通過雙音多頻(DTMF)信號調(diào)制GPS定位數(shù)據(jù)的方法,通過圖像微波機(jī)傳輸設(shè)備的冗余伴音信道,實(shí)現(xiàn)圖像微波機(jī)所在點(diǎn)位進(jìn)行實(shí)時傳輸?shù)乃枷?,并且設(shè)計了一整套的實(shí)現(xiàn)硬件方案。本文根據(jù)該硬件方案設(shè)計了對各功能硬件進(jìn)行控制的單片機(jī)驅(qū)動軟件。
1.1總體組成
本軟件的硬件平臺由海上GPS定位數(shù)據(jù)發(fā)送端和陸上GPS定位數(shù)據(jù)顯示端組成。
海上GPS定位數(shù)據(jù)發(fā)送端需要編寫大容量FLASH存儲器的驅(qū)動軟件、DTMF編解碼電路的驅(qū)動軟件、GPS OEM板驅(qū)動軟件。
陸上GPS定位數(shù)據(jù)顯示端需要編寫LCD顯示器的驅(qū)動軟件、觸摸屏控制器的驅(qū)動軟件和DTMF編解碼電路的驅(qū)動軟件。
驅(qū)動軟件的內(nèi)容如圖1所示。
1.2海上端硬件驅(qū)動軟件設(shè)計
1.2.1 GPS OEM板驅(qū)動軟件設(shè)計
GPS OEM板上電工作后,按照一定的波特率輸出NMEA0183語句。方案采用GARMINGPS25LP GPS OEM板,該板出廠時默認(rèn)波特率為4800bps,輸出語句為$GPGGA 、$ GPGSA 、 $GPGSV 、$GPRMC 和 $PGRMT語句,因此GPS OEM板上電工作后就會以4800bps每秒分別輸出一幀$GPGGA 、$ GPGSA 、 $GPGSV 、$GPRMC和 $PGRMT語句??梢酝ㄟ^ $PGRMO 語句屏蔽它們。$PGRMO語句格式為:$PGRMO,<1>,<2>,*hh<CR><LF>
根據(jù)單片機(jī)測量需要,只保留輸出$GPRMC語句,通過單片機(jī)串口向GPS OEM板輸入:
$PGRMO,,2 (屏蔽所有輸出語句)
$PGRMO, GPRMC,1 (激活GPRMC語句)
通過以上設(shè)置后,GARMINGPS25LP將連續(xù)輸出$GPRMC數(shù)據(jù),波特率為4800bps。
單片機(jī)讀取$GPRMC語句的程序設(shè)計方法如下:
對于圖像傳輸微波機(jī)定位來說,只關(guān)心GPS OEM板輸出的的經(jīng)緯度和時間。因此在設(shè)計讀取$GPRMC語句的單片機(jī)軟件時,只關(guān)心四組數(shù)據(jù),即:UTC當(dāng)?shù)貢r間的時分秒(hhmmss),UTC當(dāng)?shù)貢r間,日月年(ddmmyy);緯度ddmm.mmmm,經(jīng)度dddmm.mmmm。對GARMIN GPS25LP進(jìn)行設(shè)置后,每隔一秒GARMIN GPS25LP將發(fā)送一幀$GPRMC數(shù)據(jù)。$GPRMC語句格式為:
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<1 0>,<11>,<12>,*hh<CR><LF>
·<1> : UTC 當(dāng)?shù)貢r間,hhmmss格式。
·<2> :工作狀態(tài), A =可用; V =接收器警報,不可用。
·<3> :緯度, ddmm.mmmm格式(前面的 0 也會傳送)。
·<4> :緯度半球, N 或者 S。
·<5> :經(jīng)度,dddmm.mmmm格式(前面的 0 也會傳送)。
·<6> :經(jīng)度半球, E 或者 W 。
·<7> :對地速度,000.0 ~9999.9 節(jié)(前面的 0也會傳送)。
·<8> :對地航向,000.0o~ 359.9o(前面的 O也會傳送)。
·<9> :UTC當(dāng)?shù)貢r間, ddmmyy 格式。
·<10>:磁變,磁偏角地球磁場在不同時間、不同地點(diǎn)的偏差,000.0 ~180.0度。
·<11>:磁變方向,E & W 。
·<12>:工作模式,A=自主,D=差分,E=評估,N=數(shù)據(jù)無效。
從$GPRMC數(shù)據(jù)格式,可以知道第一個逗號之后的字符屬于時間的時、分、秒數(shù)據(jù);第三個逗號之后的字符屬于緯度數(shù)據(jù);第五個逗號之后的字符屬于經(jīng)度數(shù)據(jù);第九個逗號之后的字符屬于時間的日、月、年數(shù)據(jù)。因此,從收到第一個字符"$"后,通過判斷逗號就可以尋找到設(shè)計所關(guān)心的數(shù)據(jù),具體程序如下:
serial () interrupt 4 using 1 //輔單片機(jī)串行口中斷程序
{RI=0; //軟件清除中斷標(biāo)志位
if (SBUF==0x24) //判斷是否收到GPRMC格式語句的第一個字符"$",
{record=1; //其數(shù)值為0x24,收到后開始記錄數(shù)據(jù),并設(shè)置記錄標(biāo)志
igps=0; // 記錄緯度數(shù)據(jù)字符數(shù)量的變量
numbercoma=0; // 記錄逗號數(shù)量的變量
}
if (record==1) // 開始處理GPRMC中的數(shù)據(jù)信息
{ if(SBUF==0x2c) //利用GPRMC數(shù)據(jù)中的逗號間隔, {numbercoma++; igps=0; //區(qū)分接收到的字符處于何種數(shù)據(jù)中。
}
if (numbercoma==1) // 第一個逗號之后的字符屬于時間的
{stringtime1[igps]=SBUF; //時、分、秒數(shù)據(jù)
igps++;
}
if (numbercoma==3) // 第三個逗號之后的字符屬于緯度數(shù)據(jù)
{stringlat[igps]=SBUF;
igps++;
}
if (numbercoma==5) // 第五個逗號之后的字符屬于經(jīng)度數(shù)據(jù)
{stringlon[igps]=SBUF;
igps++;
}
if (numbercoma==9) // 第九個逗號之后的字符屬于時間的日、月、年數(shù)據(jù)
{stringtime2[igps]=SBUF;
igps++;
}
if (SBUF=='*') //判斷是否收到GPRMC格式語句的字符"*",如果收到, {numbercoma=0; //則結(jié)束記錄,
record=0;
igps=0;
}
}
}
以上程序?qū)PS時間的時、分、秒數(shù)據(jù)存放在stringtime1[] 數(shù)組中,共占6個字節(jié);將日、月、年數(shù)據(jù)存放在stringtime2[]數(shù)組中,共占6個字節(jié);將緯度數(shù)據(jù)存放在stringlat[]數(shù)組中,共占10個字節(jié);將經(jīng)度數(shù)據(jù)存放在stringlon []數(shù)組中,共占10個字節(jié)。
1.2.2 FLASH存儲器驅(qū)動軟件設(shè)計
FLASH存儲器選用三星K9F2808UC0C。該芯片容量為132Mbits,由1024塊組成,每塊又由32頁組成,一頁有528字節(jié)(512+16)×8bit。對K9F2808UC0C進(jìn)行讀寫操作時,必須以頁為單位進(jìn)行操作。對K9F2808UC0C進(jìn)行擦除操作,必須以塊為單位進(jìn)行操作。從設(shè)計方案可知,單片機(jī)的P25、P26用于控制74LS245的數(shù)據(jù)方向。K9F2808UC0C的驅(qū)動程序由讀數(shù)據(jù)程序、寫數(shù)據(jù)程序、擦除程序和寫命令程序三部分組成。具體程序如下:
//************讀FLASH MEMORY 程序*************
void FlashRead(unsigned int pg)
{
unsigned int l; //每個扇區(qū)有528個字節(jié)
P24=0; //CS=0;選中k9f2808;
WriteCommand(0); //寫讀命令
P25=0; //74LS245處于輸入狀態(tài)
while(!RB);
P25=1; //74LS245處于輸出狀態(tài)
WriteAddress(0,pg); //確定讀地址
P26=0;
for(l=0;l<512;l++) //連續(xù)讀取一頁的數(shù)據(jù)
{ 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); //將數(shù)據(jù)寫入flash 0x10
P25=0; //74LS245處于輸入狀態(tài)
while(!RB);//等待數(shù)據(jù)寫入結(jié)束
P25=1; //74LS245處于輸出狀態(tài)
WriteCommand(112); //讀狀態(tài)量
P25=0;while(!RB);
P25=1; //等待數(shù)據(jù)寫入結(jié)束
P26=0;
P0=0xff;
RD=0; //準(zhǔn)備好讀入
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; //等待數(shù)據(jù)寫入結(jié)束
WriteAddress(FlashAdrCount,FlashPagCount); //寫地址
P25=0;while(!RB);P25=1; //等待數(shù)據(jù)寫入結(jié)束
}
//*************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);//塊擦除預(yù)命令0x60
WriteAdrpage(32*blockcount);
WriteCommand(208);//塊擦除確認(rèn)命令0xD0
P25=0;
while(!RB);P25=1;
WriteCommand(112);//讀擦除狀態(tài)命令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編解碼電路驅(qū)動軟件設(shè)計
GPS定位數(shù)據(jù)經(jīng)過DTMF MT8880編碼后,通過圖像微波機(jī)傳輸設(shè)備的伴音信道傳送到陸上的圖像微波機(jī)端。陸上的圖像微波機(jī)端接收到DTMF信號的GPS定位數(shù)據(jù)后,經(jīng)過DTMF MT8880解碼轉(zhuǎn)換成數(shù)字信號,由CPU 的INT0中斷接收。對MT8880的操作由初始化程序,數(shù)據(jù)發(fā)送程序,數(shù)據(jù)接收程序組成。具體實(shí)現(xiàn)程序如下:
void initialize8880(void) // MT8880初始化
{CS=0;CK=0;
RS=1;RW=1;/*讀狀態(tài)寄存器*/
CK=1; _nop_();//重復(fù)賦值起延時作用
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;/*讀狀態(tài)寄存器*/
CK=1; _nop_();
CK=0;
}
//****************************************
void int1(void) interrupt 3 // 89C51中斷方式接收MT8880數(shù)據(jù)
{ uchar abc,A;
Delay(3000);
CS=0; CK=0;
RW=1;RS=1;/*讀狀態(tài)寄存器*/
CK=1; _nop_();
CK=0; _nop_();
CK=1;
P10=1;P11=1;P12=1;P13=1;/*讀數(shù)據(jù)前單片機(jī)總線賦F*/
RW=1;RS=0;/*讀接收數(shù)據(jù)寄存器*/
Delay(30);
abc=P1&0x0f; //讀入數(shù)據(jù)
CK=1; _nop_();
CK=0; _nop_();
}
//******************************************* ***************
void mt8880_WriteData(uchar SendData) // mt8880發(fā)送數(shù)據(jù)
{ 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陸上端硬件驅(qū)動軟件設(shè)計
1.3.1 觸摸屏控制器驅(qū)動軟件設(shè)計
本設(shè)計中采用觸摸屏專用控制芯片ADS7843實(shí)現(xiàn)對觸摸屏的控制。它是一款具有同步串行接口的12位取樣模數(shù)轉(zhuǎn)換器。由于89C51沒有專門的同步串行接口,因此采用I/O口模擬同步串行接口(SPI)的方式進(jìn)行設(shè)計,觸摸屏被按下時產(chǎn)生INT1中斷,單片機(jī)通過INT1中斷服務(wù)程序?qū)崿F(xiàn)觸摸點(diǎn)位置的讀取。具體驅(qū)動程序如下:
//************I/O定義***************************
// DCLK-------P24
// CS7843-----P234
// DIN ---------P22
// BUSY ------P21
// DOUT-------P20
//*********寫ads7843**********************
void ads7843_wr(unsigned char num) //SPI寫數(shù)據(jù)
{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 讀數(shù)據(jù)
{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中斷服務(wù)程序****************************
ext_1() interrupt 2
{delay(10000); //中斷后延時以消除抖動,使得采樣數(shù)據(jù)更準(zhǔn)確
DCLK=0;
DIN=1;
DCLK=1;
CS7843=0;
while(BUSY); //如果BUSY信號不好使可以刪除不用
delay(2);
ads7843_wr(0x90); //送控制字 10010000 即用差分方式讀X坐標(biāo) 詳細(xì)請見有關(guān)資料
while(BUSY); //如果BUSY信號不好使可以刪除不用
delay(2);
DCLK=1; delay(0);
DCLK=0; delay(0);
X=ads7843_rd();
ads7843_wr(0xD0); //送控制字 11010000 即用差分方式讀Y坐標(biāo) 詳細(xì)請見有關(guān)資料
DCLK=1;delay(0);
DCLK=0;delay(0);
Y=ads7843_rd();
CS7843=0;
}
1.3.2 LCD顯示電路驅(qū)動軟件設(shè)計設(shè)計
本設(shè)計采用臺灣晶采光電科技股份有限公司生產(chǎn)的AG320240A4STCW-T51液晶顯示屏,該液晶顯示屏內(nèi)置SED1335 LCD控制器,具有320列240行的顯示能力。LCD顯示屏與單片機(jī)之間通過一片74ls245進(jìn)行連接。LCD顯示屏主要有兩個程序,一個是寫命令程序,一個是寫數(shù)據(jù)程序,程序如下:
//******************************************* ****
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參數(shù)和顯示字符數(shù)據(jù)
{
P26=0; //選中LCD顯示屏
P34=0;
P35=0;
P0=ref;
A0=0;
delay(5);
WD=0;
WD=1;
A0=1;
}
本設(shè)計中的USB接口電路不需要特意編寫驅(qū)動程序,PC機(jī)端的驅(qū)動程序Silicon公司免費(fèi)提供,單片機(jī)端的驅(qū)動程序其實(shí)就是UART的收發(fā)程序。
本文根據(jù)海上圖像傳輸微波機(jī)實(shí)時定位所設(shè)計的的硬件實(shí)現(xiàn)方案,設(shè)計了相應(yīng)的驅(qū)動軟件。論文中所涉及的軟件作者工作中都曾經(jīng)配合相應(yīng)電路使用過。年初在驗(yàn)證DTMF信號進(jìn)行數(shù)字通信的PCB板上,使用本文所設(shè)計的軟件成功實(shí)現(xiàn)了數(shù)字信號的發(fā)送和接收。因此可以說,本文所設(shè)計的軟件是可行的。
[1] 馬忠梅等,《單片機(jī)的C語言應(yīng)用程序設(shè)計》,北京航空航天大學(xué)出版社,2003.
[2] 徐愛鈞 彭秀華.單片機(jī)高級語言C51 Windows環(huán)境編程與應(yīng)用.電子工業(yè)出版社.
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