使用单片机实现GPRS通信所需的程序
发布网友
发布时间:2022-05-12 20:43
我来回答
共5个回答
热心网友
时间:2023-11-13 01:41
我刚好这段时间做这个,希望这个对你有所帮助
;RAM定义
BCOUNT DATA 07FH
TIMER DATA 07EH
TIMER1 DATA 07DH
TIMER2 DATA 07CH
HOURS DATA 07BH
HOURG DATA 07AH
MINUS DATA 079H
MINUG DATA 078H
SECOS DATA 077H
SECOG DATA 076H
SECO DATA 075H
MINU DATA 074H
HOUR DATA 073H
TEN DATA 072H
FLAG DATA 071H
DIN DATA 020H
DOUT DATA 021H
SLA DATA 070H
SUBA DATA 00H
ACK BIT 00H
; I/O定义
KEY BIT P3.2
CS BIT P1.2
CLK BIT P1.3
DAT BIT P1.4
SCL BIT P1.0
SDA BIT P1.1
MTD EQU 04AH
MRD EQU 058H
MRD1 EQU 063H
ORG 0000H
AJMP START
ORG 0003H ;外部中断0中断服务子程序入口地址
AJMP INTL
ORG 0013H ;外部中断1中断服务子程序入口地址
AJMP INTY
ORG 0100H
START: MOV SP,#30H
MOV P1,#11110011B ;initial I/O
MOV SLA,#0A0H ;FM24C16器件从地址
MOV SUBA,#00H ;器件子地址
CLR P2.1
MOV TMOD,#20H ;串行口初始化
MOV TH1,#0FDH
MOV TL1,#0FDH
MOV PCON,#00H
MOV SCON,#40H
SETB TR1
SETB IT0 ;INT0为1,边沿触发方式
SETB IT1 ;INT1为1,边沿触发方式
SETB EX0
SETB EX1
SETB PX1 ;INT1为高优先级
SETB EA ;开总中断
MAIN: …
AJMP MAIN ;主程序
INTL: …
RETI ;外部中断0中断服务子程序
INTY: …
RETI ;外部中断1中断服务子程序
END
2. HD7279键盘显示子程序
INTL: MOV DOUT,#15H ;读键盘指令
ACALL SEND
ACALL RECV ;读键盘数据
SETB CS
MOV A,DIN
MOV B,#10 ;HEX change BCD code
DIV AB
MOV DOUT,#10100001B
ACALL SEND
MOV DOUT,#11001000B
ACALL SEND
MOV DOUT,B ;send 个位 to HD7279A
ACALL SEND
SETB CS
RETI
SEND: MOV BCOUNT,#8 ;set bit counter=8
CLR CS ;CS for lv
ACALL LDELAY ;long delay
SLOOP: MOV C,DOUT.7 ;output 1 bit
MOV DAT,C
SETB CLK ;set CLK for hv
MOV A,DOUT ;the data that will send left move
RL A
MOV DOUT,A
ACALL SDELAY ;short delay
CLR CLK ;set CLK for lv
ACALL SDELAY
DJNZ BCOUNT,SLOOP ;check 8 bit send over or else
CLR DAT ;send over, return
RET
RECV: MOV BCOUNT,#8
SETB DAT ;set (DATA) hv(input state)
ACALL LDELAY
RLOOP: SETB CLK
ACALL SDELAY
MOV A,DIN
RL A
MOV DIN,A
MOV C,DAT
MOV DIN.0,C
CLR CLK
ACALL SDELAY
DJNZ BCOUNT,RLOOP
RET
LDELAY: MOV TIMER,#25 ;delay 50uS
DELOOP: DJNZ TIMER,DELOOP
RET
SDELAY: MOV TIMER,#4 ;delay 8uS
SHOTLOP:DJNZ TIMER,SHOTLOP
RET
3. FM24C16读写子程序
START: SETB SDA
NOP
SETB SCL ;起始条件建立时间大于4.7us
ACALL DELAY
CLR SDA
ACALL DELAY
CLR SCL ;钳住总线,准备发数据
NOP
RET
STOP: CLR SDA
NOP
SETB SCL ;发送结束条件的时钟信号
ACALL DELAY
SETB SDA ;结束总线
ACALL DELAY
RET
MACK: CLR SDA ;将SDA置0
NOP
NOP
SETB SCL
ACALL DELAY
CLR SCL
NOP
NOP
RET
MNACK: SETB SDA ;将SDA置1
NOP
NOP
SETB SCL
ACALL DELAY
CLR SCL
NOP
NOP
RET
CACK: SETB SDA
NOP
NOP
SETB SCL
CLR ACK
NOP
NOP
MOV C,SDA
JC CEND
SETB ACK ;判断应答位
CEND: NOP
CLR SCL
NOP
RET
WRBYTE: MOV R0,#08H
WLP: RLC A ;取数据位
JC WR1
SJMP WR0 ;判断数据位
WLP1: DJNZ R0,WLP
NOP
RET
WR1: SETB SDA ;发送1
NOP
SETB SCL
ACALL DELAY
CLR SCL
SJMP WLP1
WR0: CLR SDA ;发送0
NOP
SETB SCL
ACALL DELAY
CLR SCL
SJMP WLP1
RDBYTE: MOV R0,#08H
RLP: SETB SDA
NOP
SETB SCL ;时钟线为高,接收数据位
NOP
NOP
MOV C,SDA ;读取数据位
MOV A,R2
CLR SCL ;将SCL拉低,时间大于4.7us
RLC A ;进行数据位的处理
MOV R2,A
NOP
NOP
NOP
DJNZ R0,RLP ;未够8位,再来一次
RET
IWRNBYTE: MOV A,#11
MOV R3,A
LCALL START ;起动总线
MOV A,SLA
LCALL WRBYTE ;发送器件从地址
LCALL CACK
JNB ACK,RETWRN ;无应答则退出
MOV A,SUBA ;指定子地址
LCALL WRBYTE
LCALL CACK
MOV R1,#MTD
WRDA: MOV A,@R1
LCALL WRBYTE ;开始写入数据
LCALL CACK
JNB ACK,IWRNBYTE
INC R1
DJNZ R3,WRDA ;判断写完没有
RETWRN: LCALL STOP
RET
IRDNBYTE: MOV R3,#11
LCALL START
MOV A,SLA
LCALL WRBYTE ;发送器件从地址
LCALL CACK
JNB ACK,RETRDN
MOV A,SUBA ;指定子地址
LCALL WRBYTE
LCALL CACK
LCALL START ;重新起动总线
MOV A,SLA
INC A ;准备进行读*作
LCALL WRBYTE
LCALL CACK
JNB ACK,IRDNBYTE
MOV R1,#MRD
RDN1: LCALL RDBYTE ;读*作开始
MOV @R1,A
DJNZ R3,SACK
LCALL MNACK ;最后一字节发非应答位
RETRDN: LCALL STOP ;并结束总线
RET
SACK: LCALL MACK
INC R1
SJMP RDN1
DELAY: NOP
NOP
NOP
NOP
NOP
RET
4. DS12887应用子程序
DS12887: CLR P2.7
INTTIM:MOV DPTR,#7F0BH
MOV A,#0A2H ;选BCD码,24小时制
MOVX @DPTR,A
MOV DPTR,#7F04H ;HOUR单元地址
MOV A,#07H
MOVX @DPTR,A
inc dptr
mov a,#08h
movx @dptr,a
MOV DPTR,#7F02H ;MINUTE单元地址
MOV A,#59H
MOVX @DPTR,A
inc dptr
mov a,#00h
movx @dptr,a
MOV DPTR,#7F00H ;SEC0ND单元地址
MOV A,#58H
MOVX @DPTR,A
inc dptr
mov a,#00h
movx @dptr,a
MOV DPTR,#7F0AH ;寄存器A地址
MOV A,#20H ;############
MOVX @DPTR,A
MOV DPTR,#7F0CH ;寄存器C地址
MOVX A,@DPTR
INC DPTR
MOVX A,@DPTR ;寄存器D地址
MOV DPTR,#7F0BH ; 寄存器B地址
MOV A,#22H
MOVX @DPTR,A
MOV IE,#84H
RET
热心网友
时间:2023-11-13 01:41
BYTE GPRSDial (void) {
signed char delayCount = 80;
transmit ("ATV0"); // 要求返回数字表示的回答
if (!Waitfor ("0", 30)) { // 等待 OK 回答
return -1;
}
DTR_ON;
transmit ("ATD*99***1#"); // 拨GGSN的号码
GPRSBuffFlush (); // 清空buffer
// 等待回答
while ((!GPRSBuffNotEmpty()) && (--delayCount > 0)) {
Delay (250);
}
热心网友
时间:2023-11-13 01:42
单片机的就用模块内部的协议。 看下AT指令 TCP/IP指令那块.
热心网友
时间:2023-11-13 01:42
万方数据中有相关的论文,我下载过。
热心网友
时间:2023-11-13 01:43
你不是都写出来了吗,剩下的就是按照AT命令写程序了啊。
难道还让别人帮你写啊