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

📄 sms_controller.asm

📁 SMS for T28 or T10 by Atmel AT90S2313 Circuit and source code in C.
💻 ASM
字号:

;	
;	
;	REMOTE CONTROL WITH SMS, FOR ERICSSON T10 GSM MOBILE PHONES
;
;	This circuit can handle 8 devices by sending SMS message with a mobile phone. 
;	30-oct-2002	v1.0	
;	04.10.2003  v1.01 --- I have change some routines to be more workable
;	writed with AVR studio 4.2
; 
;
;	by Serasidis Vasilis 
;
;	Home: http://www.serasidis.gr
;	email: info@serasidis.gr 
;	
;
;	Target: AT90S2313 with 8 MHz crystal
;	PD0= RxD
;	PD1= TxD
;	PB0-PB7= 8 bit output. You can drive with this port, 8 relays, 1 to eatch pin.
;	Send SMS message to T10, like this format: 11100101
;	That its mean, arm the relays No 1,3,6,7,8 and disarm the relays 2,4 and 5.
;	
;	
;	


.nolist				;Suppress listing of include file
.include "2313def.inc"		;Define chip particulars
.list

.equ	BAUD	=51 		;9600 bps at 8.00 MHz.

.def	temp	=R16		;temporary storage register
.def	EEard	=R17		;EEPROM address to read from
.def	Txbyte	=R18		;Data to be transmitted
.def	Rxbyte	=R19		;Received data
.def	temp2	=R20
.def	temp3	=R21
.def	temp4	=R25
.def	temp5	=R29
.def	temp6	=R30
.def	ramtemp	=r24 		;temporary storage register
.def	ramsize	=r22		;size of block to be copied
.def	EEard	=R23		;EEPROM address to read from
.def	RamAdr	=R26
.def	delay1	=R27
.def	delay2	=R28
.def	delay3	=R31

.cseg

.org	0
;========================================================================
reset:

;	Setup buffers and pointers


	ldi		temp,RAMEND
	out		SPL,temp	;Init Stack Pointer


	ldi		temp,0b11111111
	out		DDRB,temp

	ldi		temp,BAUD
	out		UBRR,temp	;Set baud rate generator


;===========   Set UART, as Transmiter   =====================

	ldi		temp,0b00011000
	out		UCR,temp	;Enable UART Tx w/o interrupts
;==============================================================

	rcall	long_delay

	ldi		EEard,0x17
load:
	rcall	eeread
	tst		Txbyte		;see if at end of message
	breq	br1			;if zero found, start over
	rcall	b_transmit	;sent out char
	rjmp	load

	

br1:ldi		ramadr,96	;Its the first byte of RAM
	ldi		temp2,16	;16 bytes ram

uart2ram:
	rcall	receive		;call getchar
	mov		YL,ramadr	;init Z-pointer
	st		Y+,rxbyte	;store data to RAM
	inc		ramadr		;
	dec		temp2
	brne	uart2ram	;if not done, loop more

	ldi		ramadr,96	;
;--------------------------------------------------------

	ldi		ramadr,102	;Memory potition for letter 'G' in ram 
	mov		YL,ramadr	;Send the ram address
	ld		txbyte,Y+	;load the contain of selected potition
	cpi		txbyte,'G'	;Look if its 'G' letter
	breq	aa			;If yes, go to read all message from the phone

;--------------------------------------------------------
	ldi		EEard,37
	rcall	delay
	rcall	delay
	rcall	delay
	rcall	delay
	rjmp	load

;===================================================================

aa:	ldi		EEard,37 
load2:
	rcall	eeread
	rcall	b_transmit	;sent out char
	tst		Txbyte		;see if at end of message
	brne	load2		;if zero found, start over

	ldi		ramadr,96	;Its the first byte of RAM
	ldi		temp2,87	;87 bytes ram

uart2ram2:
	rcall	receive		;call getchar
	mov		YL,ramadr	;init Z-pointer
	st		Y+,rxbyte	;store data to RAM
	inc		ramadr		;
	dec		temp2
	brne	uart2ram2	;if not done, loop more

;===================================================================

	rcall	nextline	;\
	ldi		txbyte,'+'	; \
	rcall	b_transmit	;  \
	ldi		temp2,117 	;  / Print the service center number
	ldi		temp3,6		; /
	rcall	read		;/

	rcall	nextline	;\
	ldi		txbyte,'+'	; \
	rcall	b_transmit	;  \
	ldi		temp2,135 	;  / Print the sender`s number 
	ldi		temp3,6		; /
	rcall	read		;/

	rcall	nextline	;\
	ldi		temp2,151 	; \
	ldi		temp3,1		;  \
	rcall	read		;   \	
	ldi		txbyte,'-'	;    \ 	
	rcall	b_transmit	;     \	
	ldi		temp3,1		;      \ 
	rcall	read		;		|
	ldi		txbyte,'-'	;		|
	rcall	b_transmit	;		|
	ldi		temp3,1		;		|
	rcall	read		;		\
	ldi		txbyte,' '	;		/ Print the date and the time of the received message.
	rcall	b_transmit	;		|
	ldi		temp3,1		;		|
	rcall	read		;		|
	ldi		txbyte,':'	;		|
	rcall	b_transmit	;      /
	ldi		temp3,1		;     / 
	rcall	read		;    /
	ldi		txbyte,':'	;   /
	rcall	b_transmit	;  /
	ldi		temp3,1		; /
	rcall	read		;/

;=================================================================================
; Here its the routine for convert the ASCII to HEX and stored to RAM address 185
;=================================================================================


	ldi		temp2,185	; 
	ldi		temp3,8		;8 bytes message
	ldi		ramadr,167 	;First byte of the message in the RAM (message like this 11001101)

septet:	
   
	mov		YL,ramadr	;     
	ld		txbyte,Y+	;
	subi	txbyte,0x30
	mov		eeard,txbyte
	rcall	eeread
	swap	txbyte
	mov		temp4,txbyte

	inc		ramadr
	mov		YL,ramadr	;     
	ld		txbyte,Y+	;
	subi	txbyte,0x30
	mov		eeard,txbyte
	rcall	eeread

	add		temp4,txbyte
	mov		txbyte,temp4
	inc		ramadr

	mov		YL,temp2	;init Z-pointer
	st		Y+,txbyte	;store data to RAM
	inc		temp2	

	dec		temp3	
	brne	septet		   


;==============================================================
;		convert the HEX values to septets
;==============================================================

	clr		Rxbyte
	rcall	nextline	;
	ldi		temp3,7		; Number of septets (characters).
	ldi		ramadr,185	;Load the 9 hex bytes from...
	ldi		temp5,7	
	ldi		temp6,1
	mov		temp,temp6
	mov		delay1,temp5

	mov		YL,ramadr	;\     
	ld		txbyte,Y+	; \ print the 1st septet
	cbr		txbyte,0x80 ; /
	rcall	b_transmit	;/

	cpi		txbyte,0x31	;Check if txbyte is 0x31
	brne	more		;If not...
	sbr		Rxbyte,1 	;	

more:

	lsl		Rxbyte	
	mov		YL,ramadr	;    
	ld		temp2,Y+	;
	inc		ramadr		;
	mov		YL,ramadr	;
	ld		txbyte,Y+	;
dec6:
	lsl		txbyte		;
	dec		temp	
	brne	dec6	

dect:
	lsr		temp2		;rotate n times
	dec		delay1		;
	brne	dect		;
	add		txbyte,temp2	;
	cbr		txbyte,0x80	;

	cpi		txbyte,0x31	;Check 
	brne	aaa			;If not go to 	
	sbr		Rxbyte,1


aaa:	
	rcall	b_transmit
	inc		temp6
	mov		temp,temp6
	dec		temp5
	mov		delay1,temp5

	dec		temp3
	brne	more

	out		portB,Rxbyte	;output the message from GSM to PortB

	rcall	long_delay

	ldi		EEard,49	;Set the eeprom address to "Delete SMS" command
load3:
	rcall	eeread

	tst		Txbyte		;see if at end of message
	breq	br2			;if zero found, start over
	rcall	b_transmit	;sent out char
	rjmp	load3

	;rcall	nextline	;
br2:ldi		EEard,37
	rjmp	load

;=====================================================

read:
	inc		temp2
	mov		ramadr,temp2
	mov		YL,ramadr
	ld		txbyte,Y+
	rcall	b_transmit
	dec		ramadr
	mov		YL,ramadr
	ld		txbyte,Y+
	rcall	b_transmit
	inc		temp2
	dec		temp3
	brne	read

	ret	
;=============================================================
;=============================================================


EERead:

	sbic	EECR,EEWE	;if EEWE not clear
	rjmp	EERead		;    wait more
	out		EEAR,EEard	;output address
;***** Issue EEPROM read strobe twice due to a bug in AVR!

	sbi		EECR,EERE	;set EEPROM Read strobe 2nd time
				;This instruction takes 4 clock cycles since
				;it halts the CPU for two clock cycles
	in		Txbyte,EEDR	;get data

	rcall	delay

	inc		EEard		;point to next EE address
	ret
	rjmp	EERead
	ret
;=============================================>

	

nextline:
	ldi		txbyte,0x0d
	rcall	b_transmit
	ldi		txbyte,0x0a
	rcall	b_transmit

	ret




;========================================================================	


;***************************************************************************
; Transmiting routine (The data from the eeprom through the AVR are going to
; the PC computer)         
;***************************************************************************
b_transmit:	
	sbis	USR,UDRE	;is UART transmitter ready?
	rjmp	b_transmit
	out		UDR,txbyte	;sent out char
	ret

;*************************************************************************
; Receiving routine (The data from PC computer through to the AVR are going
; to the eeprom)  
;*************************************************************************
receive:

	sbis	USR,RXC
	rjmp	receive
	in		Rxbyte,UDR

	ret

;*******************************************************************
;                   Stop and Delay routines
;*******************************************************************
long_delay:
	ldi		delay3,32
waitmore2:
	rcall	delay
	dec		delay3
	brne	waitmore2
	ret	
delay:
	ldi		delay2,0xff
waitsome:
	ldi		delay1,0xff

waitmore:
	dec		delay1
	brne	waitmore
	dec		delay2
	brne	waitsome
	
	ret
.eseg
msg:	.db	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,"-------"
	.db	0x0A,0x0B,0x0C,0x0D,0x0E,0x0F
msg2:	.db	"AT+CPMS=",'"',"ME",'"' ,0x0d,0x0a	;Select the phone memory ("ME")
	.db	"AT+CMGR=1" ,0x0d,0x0a, 0 				;read the received message(Memory possition 1)
	.db	"AT+CMGD=1" ,0x0d,0x0a, 0				;delete the received message (Memory possition 1)



⌨️ 快捷键说明

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