|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
發(fā)兩個(gè)我2001年寫(xiě)的C51程序,用DTMF發(fā)送GPS時(shí)間來(lái)同步多個(gè)時(shí)間。 |
| 作者:syzdq 欄目:單片機(jī) |
有GPS模塊的數(shù)據(jù)讀取,MT8888和8870的讀寫(xiě),字符型LCD的讀寫(xiě),WDT,格林尼制時(shí)間轉(zhuǎn)東八區(qū)時(shí)間等,rxd中有一個(gè)軟件模擬的串口,不過(guò)只做了發(fā)沒(méi)做收。 原理圖就不發(fā)了,版權(quán)問(wèn)題。 * - 本貼最后修改時(shí)間:2005-11-15 9:33:59 修改者:syzdq |
| 2樓: | >>參與討論 |
| 作者: syzdq 于 2005/11/15 9:27:00 發(fā)布:
gpstxd.c #pragma OPTIMIZE(5,speed) /* CPU type:ATMEL AT89C51-24JC */ /* Fosc=11.0592MHZ */ #include <reg51.h> #include <absacc.h> #define uCHAR unsigned CHAR #define uint unsigned int #define MT8888D XBYTE[0x0000] /* MT8888數(shù)據(jù)端口 */ #define MT8888C XBYTE[0x0200] /* MT8888地址端口 */ sbit ok=P3^1; /* OUTPUT,當(dāng)GPS OEM板收到3顆以上的衛(wèi)星時(shí)LED亮 */ sbit lcdrs=P3^2; /* OUTPUT, LCD模塊寄存器選擇線 */ sbit lcdrw=P3^3; /* OUTPUT, LCD模塊讀寫(xiě)線 */ sbit lcden=P3^4; /* OUTPUT, LCD模塊使能線 */ sbit wdi=P3^5; /* OUTPUT,看門(mén)狗電路(IMP813LCPA)脈沖輸出兼運(yùn)行狀態(tài)指示LED輸出 */ bit disdef=0; static uCHAR data time8s=160; /* 8秒時(shí)間計(jì)數(shù) */ static uCHAR data satellitecount[2]={'0','0'};/* 連接的衛(wèi)星數(shù) */ static uCHAR data recebuf[20]; /* 20Byte GPS OEM板接收緩沖區(qū)和DTMF發(fā)送緩沖區(qū) */ static uCHAR data tempbuf[10]; /* 10Byte 臨時(shí)數(shù)據(jù)交換區(qū) */ static uCHAR data dispbuf[32]; /* 32Byte 顯示緩沖區(qū) */ uCHAR code dispinit[33]={"Initializing... Please waiting! "};/* 系統(tǒng)啟動(dòng)時(shí)LCD模塊顯示的信息 */ uCHAR code dispnsat[33]={"No GPS OEM boardfound.Searching!"};/* 連續(xù)8秒內(nèi)收不到GPS OEM板的信息時(shí)LCD模塊顯示的信息 */ uCHAR code dispsend[33]={"Sending data... Please waiting! "};/* 時(shí)間以DTMF碼發(fā)送時(shí)LCD模塊顯示的信息 */ uCHAR code dispdflt[33]={"2003-11-09 0820:40:07 DAHUA"};/* LCD模塊平時(shí)顯示日期,連接的衛(wèi)星數(shù),時(shí)間和公司名稱 */ uCHAR code dtmftrans[16]={10,1,2,3,4,5,6,7,8,9,13,14,15,0,11,12};/* 二進(jìn)制轉(zhuǎn)DTMF碼表 */ /* 0,1,2,3,4,5,6,7,8,9, A, B, C,D, *, # ,*以E代,#以F代 */ uCHAR code moumaxday[12]={31,28,31,30,31,30,31,31,30,31,30,31}; /* 每個(gè)月的最大天數(shù)(不包括潤(rùn)年) */ /* 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12 */ uCHAR code msg1[]={"GPS timer transceiver board-TXD,Ver:2.00,2001-09-20.Designer:"}; uCHAR code msg2[]={"Dongqing Zheng(鄭冬青),HANGZHOU DAHUA ELECTRON CO.LTD."}; void _nop_(void); /* 匯編中的NOP空操作,內(nèi)部函數(shù) */ void DISPLAY(void) { uCHAR data i,j; wdi=~wdi; /* 復(fù)位看門(mén)狗電路 */ lcdrs=0; /* 讀、寫(xiě)指令寄存器 */ P1=0x80; /* 設(shè)置DDRAM地址為00H */ lcden=0; /* 產(chǎn)生下降沿 */ lcden=1; for(j=0;j<10;j++) _nop_(); lcdrs=1; /* 讀、寫(xiě)數(shù)據(jù)寄存器 */ for(i=0;i<16;i++) /* 顯示第一行 */ { P1=dispbuf[i]; /* 寫(xiě)入顯示緩沖區(qū)數(shù)據(jù) */ lcden=0; /* 產(chǎn)生下降沿 */ lcden=1; for(j=0;j<10;j++) _nop_(); } lcdrs=0; /* 讀、寫(xiě)指令寄存器 */ P1=0xc0; /* 設(shè)置DDRAM地址為40H,準(zhǔn)備顯示第二行 */ lcden=0; /* 產(chǎn)生下降沿 */ lcden=1; for(j=0;j<10;j++) _nop_(); lcdrs=1; /* 讀、寫(xiě)數(shù)據(jù)寄存器 */ for(i=16;i<32;i++) /* 顯示第二行 */ { P1=dispbuf[i]; /* 寫(xiě)入顯示緩沖區(qū)數(shù)據(jù) */ lcden=0; /* 產(chǎn)生下降沿 */ lcden=1; for(j=0;j<10;j++) _nop_(); } wdi=~wdi; /* 復(fù)位看門(mén)狗電路 */ } void initialize(void) /* 系統(tǒng)初始化 */ { uCHAR i; uint x; _nop_(); wdi=~wdi; /* 復(fù)位看門(mén)狗電路 */ ok=1; lcdrs=0; /* 選擇指令寄存器 */ lcdrw=0; /* 寫(xiě) */ lcden=1; /* 拉高 */ for(x=0;x<500;x++) _nop_(); P1=0x01; /* 清屏指令 */ lcden=0; /* 產(chǎn)生下降沿 */ _nop_(); lcden=1; wdi=~wdi; /* 復(fù)位看門(mén)狗電路 */ for(x=0;x<500;x++) _nop_(); P1=0x38; /* 功能設(shè)置:2行顯示,5X7點(diǎn)陣,8位數(shù)據(jù)寬度 */ lcden=0; /* 產(chǎn)生下降沿 */ _nop_(); lcden=1; wdi=~wdi; /* 復(fù)位看門(mén)狗電路 */ for(i=0;i<10;i++) _nop_(); P1=0x06; /* 設(shè)置輸入方式:當(dāng)將一字符寫(xiě)入DDRAM時(shí),地址加1,光標(biāo)右移,整個(gè)顯示不移動(dòng) */ l |
|
| 3樓: | >>參與討論 |
| 作者: syzdq 于 2005/11/15 9:29:00 發(fā)布:
gpsrxd.c #pragma OPTIMIZE(5,speed) /* CPU type:ATMEL AT89C1051(可直接用AT89C2051代換) */ /* Fosc=11.0592MHZ */ /* 由于DOS下的C51最小只支持128字節(jié)的片內(nèi)RAM,故要手工把程序自動(dòng)生成的清零所有片內(nèi)RAM的128字節(jié)改為64字節(jié), */ /* 比如地址02B5H(實(shí)際位置可能根據(jù)編譯結(jié)果有所不同)處的787FH(MOV R0,#7FH)改為783FH(MOV R0,#3FH)。 */ #include <reg51.h> #include <absacc.h> #define uCHAR unsigned CHAR #define uint unsigned int static uCHAR data recebuf[20]; /* 20Byte DTMF接收緩沖區(qū)和232口發(fā)送緩沖區(qū) */ sbit rxd=P3^0; /* I,軟件模擬串口輸入端(軟件上未用) */ sbit txd=P3^1; /* O,軟件模擬串口輸出端 */ sbit std=P3^2; /* I,MT8870輸出更新:1—有新的數(shù)據(jù)輸出 */ sbit toe=P3^3; /* O,MT8870輸出允許:1—允許數(shù)據(jù)輸出。 */ sbit pwdn=P3^4; /* O,MT8870節(jié)電端:1—進(jìn)入節(jié)電方式(不再接收DTMF碼) */ sbit wdi=P3^5; /* O,看門(mén)狗電路(IMP813LCPA)脈沖輸出兼運(yùn)行狀態(tài)指示LED輸出 */ sbit led=P3^7; /* O,時(shí)間接收指示LED(硬件上未用) */ bit sendbit=0; /* 軟件模擬RS232口上待發(fā)送位 */ bit sendflag=0; /* 通信標(biāo)志 */ static uCHAR data bitpoint=10; /* 軟件模擬RS232口上一個(gè)字節(jié)發(fā)送時(shí)的位置指針, */ /* 數(shù)字10:插0,9:D0,8:D1,...... */ /* 2:D7,1:插1 ,0:結(jié)束本字節(jié) */ uCHAR code dtmftrans[16]={13,1,2,3,4,5,6,7,8,9,0,14,15,10,11,12};/* DTMF轉(zhuǎn)二進(jìn)制碼表 */ /* D,1,2,3,4,5,6,7,8,9,0, *, #, A, B, C ,*以E代,#以F代 */ uCHAR code msg1[]={"GPS timer transceiver board-RXD,Ver:1.00,2001-04-18.Designer:"}; uCHAR code msg2[]={"Dongqing Zheng(鄭冬青),HANGZHOU DAHUA ELECTRON CO.LTD."}; void _nop_(void); /* 匯編中的NOP空操作 */ void main(void) { uCHAR i; uint x; _nop_(); led=0; rxd=1; P1|=0xff; /* 整個(gè)P1口作為輸入口 */ wdi=~wdi; /* 復(fù)位看門(mén)狗電路 */ pwdn=0; /* 初始化MT8870 */ toe=0; IP=0x00; IE=0x00; _nop_(); for(;;) { wdi=~wdi; /* 復(fù)位看門(mén)狗電路 */ IE=0; _nop_(); if(std) /* 等待MT8870輸出狀態(tài)更新 */ { toe=1; /* 讀入一位DTMF碼 */ _nop_(); i=P1; toe=0; while(std); /* 等待MT8870輸出定時(shí)周期結(jié)束 */ wdi=~wdi; /* 復(fù)位看門(mén)狗電路 */ _nop_(); if(i==0x0f) /* 0x0c的DTMF碼 */ { /* 開(kāi)始接收 */ recebuf[0]=i; for(i=1;i<18;i++) { while(!std); /* 等待MT8870輸出狀態(tài)更新 */ /* 如果未能連續(xù)收滿18個(gè)字節(jié),便會(huì)因看門(mén)狗溢出而復(fù)位,等待下一批DTMF碼 */ toe=1; /* 讀入一位DTMF碼 */ _nop_(); recebuf[i]=P1; toe=0; while(std); /* 等待MT8870輸出定時(shí)周期結(jié)束 */ wdi=~wdi; /* 復(fù)位看門(mén)狗電路 */ } pwdn=1; /* 關(guān)閉MT8870 */ for(i=0;i<18;i++) /* DTMF轉(zhuǎn)碼為非壓縮型BCD碼 */ recebuf[i]=dtmftrans[recebuf[i]]; recebuf[1]=(recebuf[0]<<4)|recebuf[1];/* 非壓縮型BCD碼轉(zhuǎn)為壓縮型BCD碼 */ recebuf[2]=(recebuf[2]<<4)|recebuf[3]; recebuf[3]=(recebuf[4]<<4)|recebuf[5]; recebuf[4]=(recebuf[6]<<4)|recebuf[7]; recebuf[5]=(recebuf[8]<<4)|recebuf[9]; recebuf[6]=(recebuf[10]<<4)|recebuf[11]; recebuf[7]=(recebuf[12]<<4)|recebuf[13]; recebuf[8]=(recebuf[14]<<4)|recebuf[15]; recebuf[9]=(recebuf[16]<<4)|recebuf[17]; wdi=~wdi; i=recebuf[1]; /* 為發(fā)送方便,數(shù)據(jù)是倒著放的 */ recebuf[1]=recebuf[9]; recebuf[9]=i; &nbs |
|
| 4樓: | >>參與討論 |
| 作者: javie 于 2005/11/15 9:36:00 發(fā)布:
最好是說(shuō)明再詳細(xì)一點(diǎn),呵呵 好,很好 |
|
| 5樓: | >>參與討論 |
| 作者: syzdq 于 2005/11/15 10:06:00 發(fā)布:
還要怎么詳細(xì)。 粘到論壇里后括號(hào)對(duì)得不是很齊,大家將就一下吧。 我那時(shí)都是先用Keil C51編譯看有無(wú)語(yǔ)法等錯(cuò)誤,通過(guò)后用FRANKLIN C51不得WIN版調(diào)試(調(diào)試比當(dāng)時(shí)的Keil強(qiáng)很多),最后用FRANKLIN C51 DOS版編譯成目標(biāo)代碼(代碼最。 |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |