⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gsm1.asm

📁 这个程序是单片机控制GSM的初步实现
💻 ASM
字号:
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP PT_T0
ORG 0023H
 KD   BIT 04H 	 ;
 KE   BIT 05H    ;
 KBUF EQU 3FH    ;
LJMP RTXD_INT
MAIN:
     MOV SP,#67H
	 MOV R7,#20H
	 MOV R0,#30H
	 CLR A
L1:	 MOV @R0,A
	 DJNZ R7,L1
	 MOV SCON,#50H
	 MOV TMOD,#01H
	 MOV TH0,#0E4H
     MOV TL0,#10H
	 MOV 0C8H,#34H															                                         
	 MOV 0CBH,#0FFH
	 MOV 0CAH,#0D9H														     
	 CLR P1.3
	 MOV DPTR,#500				   ;以50到5BH的12个单元为发短信内容单元
	 LCALL DEL_1S
	 SETB P1.3
	 MOV 50H,#41H
	 MOV 51H,#42H
	 MOV 53H,#42H
	 MOV 54H,#43H
	 MOV 56H,#43H
	 MOV 57H,#44H
	 MOV 59H,#44H
	 MOV 5AH,#45H
	 CLR 00H
	 CLR 01H
	 CLR KD
	 CLR KE
	 SETB ET0
	 SETB ES
	 SETB PS
     CLR  EA
	 LCALL INI_MODEN			   ;调用MODEN初始化
	 CPL P1.0
	 MOV KBUF,#0FFH
	 SETB EA
	 SETB TR0
MA:	 CLR A						   ;主程序循环
     MOV A,KBUF
	 CJNE A,#0FFH,S_7
	 SJMP L0
S_7: CJNE A,#02H,S_4
	 CPL P1.0
	 SJMP L0
S_4: CJNE A,#03H,S_5
	 CPL P1.1
	 SJMP L0
S_5: CJNE A,#13H,S_6
	 CPL P1.2
	 SJMP L0
S_6: CJNE A,#12H,L0
	 CPL P1.3
L0:	 JNB 00H,L3	 				   ;40H存放受到的字节
	 MOV A,40H
	 CJNE A,#52H,L4				   ;判断是读指令R
	 LCALL ST_P
     MOV R0,#50H
     CLR EA				           ;发送P1口状态给手机
	 LCALL SEND_MS
	 MOV R7,#20H
	 DJNZ R7,$
	 ACALL FS_AT				   ;发送AT测试指令
	 SETB EA
	 SETB EA
	 SJMP L3
L4:  MOV R5,#00H
     MOV R7,#10H
     MOV R1,#40H					;计算接收到的信息中空格的数目
L5:  MOV A,@R1
	 CJNE A,#20H,L2		
	 INC R5
L2:  INC R1
     DJNZ R7,L5
     MOV R0,#40H					 ;根据空格的数目来控制灯
	 ACALL ST_C
	 DJNZ R5,KT_0
	 SJMP L3
KT_0:MOV R0,#44H
	 ACALL ST_C
	 DJNZ R5,KT_1
	 SJMP L3
KT_1:MOV R0,#48H
     ACALL ST_C
	 DJNZ R5,KT_2
	 SJMP L3
KT_2:MOV R0,#4CH
     ACALL ST_C
L3:	 CLR 00H
	 SJMP MA
RTXD_INT:
      CLR EA
	  PUSH ACC
	  PUSH PSW
	  MOV PSW,#08H
	  CLR A
	  MOV A,SBUF
	  CLR RI
	  CJNE A,#0DH,RT00			    ;接收0D
	  ACALL REC_CHAR
	  CJNE A,#0AH,RT00			    ;接收0A
	  ACALL REC_CHAR
	  CJNE A,#2BH,RT00			    ;接收+
	  ACALL REC_CHAR
	  CJNE A,#43H,RT00			    ;接收C
	  ACALL REC_CHAR
	  CJNE A,#4DH,RT00			    ;接收M
	  ACALL REC_CHAR
	  CJNE A,#54H,RT00			    ;接收T
RT_1: ACALL REC_CHAR
      CJNE A,#0DH,RT_1			    ;等待0D,0A出现后接收数据
	  ACALL REC_CHAR
	  CJNE A,#0AH,RT_1
	  MOV R1,#40H
L9:   ACALL REC_CHAR				 ;接收数据放在40H为首的地址单元中
	  MOV @R1,A
	  INC R1
	  CJNE A,#0DH,L9
	  ACALL REC_CHAR			     ;接收最后两位0D,0A
	  SETB 00H
RT00: SETB EA
      SETB EA						  
      POP PSW
	  POP ACC
	  RETI
PT_T0:
      PUSH ACC
	  PUSH PSW
      MOV TL0,#10H
	  MOV TH0,#0E4H
	  MOV PSW,#08H
	  LCALL KEY
	  JNC KY0
	  JB KD,KY1
	  SETB KD
	  SJMP KY2
KY1:  JB KE,KY3
	  LCALL GKEY
	  SETB KE
	  SJMP KY2
KY0:  CLR KD
      CLR KE
KY3:  MOV KBUF,#0FFH
KY2:  POP PSW
	  POP ACC
	  RETI
ST_P: MOV A,P1						 ;读P1状态,并写入发送单元子程序
	  JNB ACC.0,S8
	  MOV 52H,#31H		
	  SJMP S9
S8:   MOV 52H,#30H
S9:	  JNB ACC.1,S7
      MOV 55H,#31H
	  SJMP S6
S7:   MOV 55H,#30H
S6:   JNB ACC.2,S5
      MOV 58H,#31H
	  SJMP S4
S5:   MOV 58H,#30H
S4:   JNB ACC.3,S3
      MOV 5BH,#31H
	  SJMP S2
S3:	  MOV 5BH,#30H
S2:   RET
ST_C: MOV A,@R0
      CJNE A,#41H,L_0
      INC R0
      INC R0
      INC R0
      MOV A,@R0
      CJNE A,#30H,ST0 
      CLR P1.0
      RET
ST0:  SETB P1.0 
      RET 
L_0:  CJNE A,#42H,L_1
      INC R0
      INC R0
      INC R0
      MOV A,@R0
      CJNE A,#30H,ST1
      CLR P1.1
      RET
ST1:  SETB P1.1
      RET
L_1:  CJNE A,#43H,L_2
      INC R0
      INC R0
      INC R0
      MOV A,@R0
      CJNE A,#30H,ST2
      CLR P1.2
      RET
ST2:  SETB P1.2
      RET 
L_2:  CJNE A,#44H,L_3
      INC R0
      INC R0
      INC R0
      MOV A,@R0
      CJNE A,#30H,ST3
      CLR P1.3
      RET 
ST3:  SETB P1.3
L_3:  RET  
INI_MODEN:
INI_1:MOV DPTR,#TAB_ATE0		           ;关闭回显 ATE0
	  MOV R2,#05H				 
	  LCALL SEND
	  LCALL PDOK
	  JB 01H,INI_2
	  MOV DPTR,#500
	  LCALL DEL_1S
	  AJMP INI_1
INI_2:
      MOV DPTR,#500
 	  LCALL DEL_1S
	  MOV DPTR,#TAB_CMGF1		           ;设置短消息为TEXT模式
	  MOV R2,#11
	  LCALL SEND
	  CLR 01H
	  LCALL PDOK
	  JB 01H,INI_3
	  LCALL DEL_1S
	  AJMP INI_2
INI_3: MOV DPTR,#500
      LCALL DEL_1S
      MOV DPTR,#TAB_CNMI		           ;设置短消息不存储
	  MOV R2,#13H
	  LCALL SEND
	  CLR 01H
	  LCALL PDOK
	  JB 01H,INI_4
	  MOV DPTR,#500
	  ACALL DEL_1S
	  AJMP INI_3
INI_4:MOV DPTR,#500
      LCALL DEL_1S 
      RET
FS_AT:
	  MOV A,#41H
	  ACALL FS
	  MOV A,#54H
	  ACALL FS
	  MOV A,#0DH
	  ACALL FS
	  CLR 01H
	  LCALL PDOK
	  JB 01H,ST00
	  MOV DPTR,#500
	  LCALL DEL_1S
	  AJMP FS_AT
ST00:  RET
REC_CHAR:						           ;接收一字节
      CLR A
	  JNB RI,$
	  CLR RI
	  MOV A,SBUF
	  RET
DEL_1S:					                   ;延时  入口参数 DPTR
      MOV A,DPH
      MOV R7,#01
      JZ DF1 
      MOV R7,DPH
DF1:  MOV A,DPl
      MOV R6,#1
      JZ DEL1
      MOV R6,DPl
DEL1: MOV B,#0
      DJNZ B,$
      DJNZ B,$
      DJNZ R6,DEL1
      DJNZ R7,DF1
      RET
SEND: CLR A						           ;发送字节,个数由R2确定
      MOVC A,@A+DPTR
	  MOV SBUF,A
	  JNB TI,$
	  CLR TI
	  INC DPTR
	  DJNZ R2,SEND
	  RET
REC:  JNB RI,$							   ;接收数据块,个数为R3,放在首址为R1的连续单元中
      CLR RI
	  MOV A,SBUF
	  MOV @R1,A
	  INC R1
	  DJNZ R3,REC
	  RET
PDOK:
       LCALL PDDA
       LCALL PDRI                         
       MOV A,SBUF                     
       CJNE A,#4FH,SB                
       CLR RI                              
       LCALL PDRI                 
       MOV A,SBUF                       
       CJNE A,#4BH,SB            
       LCALL PDDA
	   SETB 01H                            ;检测到OK,对A置1
       RET	                               ;判断是不是手机回答的OK代码? 0D 0A 4F 4B 0D 0A 

                                           ;检测手机是否回答0D/0A?
PDDA:
       CLR RI                   
       LCALL PDRI                        
       MOV A,SBUF                       
       CJNE A,#0DH,SB                
       CLR RI                             
       LCALL PDRI                     
       MOV A,SBUF                       
       CJNE A,#0AH,SB               
       CLR RI                           
       RET

SB:    CLR A                               ;没有检测到OK,对A清零
       CLR RI                              ;清除有串口数据标志
       RET
 
                                           ;判断串口数据是否接收成功?超时退出
PDRI:                                      ;占用R4/R5/R1
       MOV R1,#60                          ;300毫秒超时退出!
PBZ:   MOV R4,#200
DY2:   MOV R5,#25
DY1:   JB RI,KKQ                   
       DJNZ R5,DY1                     
       JB RI,KKQ                        
       SETB C                        
       DJNZ R4,DY2         
       DJNZ R1,PBZ                      
       CLR C                            
       CLR RI                      
KKQ:   RET
FS:	   MOV SBUF,A						   ;把A的内容发送出去
	   JNB TI,$
	   CLR TI
	   RET							
SEND_MS:								   ;发送短息子程序
	   MOV DPTR,#TAB_CMGS
	   MOV R2,#08H
	   LCALL SEND
	   MOV DPTR,#TAB_CMGS2
	   MOV R2,#0EH
	   LCALL SEND
S0:	   ACALL REC_CHAR
	   CJNE A,#20H,S0
	   MOV R2,#0CH
S1:	   MOV A,@R0
	   ACALL FS
	   INC R0
	   DJNZ R2,S1
	   MOV A,#0DH
	   ACALL FS
	   MOV A,#1AH
	   ACALL FS
	   RET
GKEY:								 ;读键值子程序
       MOV R7,#03H	 
       MOV A,#0EFH
KY4:   MOV P2,A
	   MOV A,P2
	   ANL A,#0E0H
	   JB ACC.5,KY5
 	   MOV B,R7
	   CLR A
	   ORL A,B
	   MOV KBUF,A
	   SETB C
	   RET
KY5:   JB ACC.6,KY6
	   MOV B,R7
       MOV A,#10H
	   ORL A,B
  	   MOV KBUF,A
	   SETB C
	   RET
KY6:   JB ACC.7,KY7
	   MOV B,R7
       MOV A,#20H
	   ORL A,B
	   MOV KBUF,A
	   SETB C
	   RET
KY7:   SETB C
       RRC A
       DJNZ R7,KY4
	   CLR C
       RET
KEY:   MOV R7,#03H					     ;判键盘状态子程序
       MOV A,#0EFH
S_2:   MOV P2,A
	   MOV A,P2
	   ANL A,#0E0H
	   JNB ACC.5,S_1
	   JNB ACC.6,S_1
	   JNB ACC.7,S_1
	   SETB C
	   RRC A
	   DJNZ R7,S_2
  	   CLR C
	   RET
S_1:   SETB C
	   RET  	   						     
TAB_ATE0:
      DB 41H,54H,45H,30H,0DH
TAB_CMGF1:
      DB 41H,54H,2BH,43H,4DH,47H,46H,3DH,31H,0DH,0AH
TAB_CNMI:
	  DB "AT+CNMI=2,2,0,0,1",0DH,0AH
TAB_CMGR:
      DB "AT+CMGR=1",0DH,0AH
TAB_CMGS:
	  DB "AT+CMGS="
TAB_CMGS2:
      DB 22H,"15979049351",22H,0DH
	  END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -