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

📄 410b.asm

📁 51单片机工程应用实例
💻 ASM
字号:
;TEA5767 FM RADIO 
;6MHz 4 digitals display
;2008/5/16 V3.0 PASSED!

RF 	BIT 08H;READY FLAG
BLF 	BIT 09H;BAND LIMIT FLAG
STEREO  BIT 0AH;STEREO FLAG

READ	EQU 0C1H;TEA5767READ ADD
WRIT	EQU 0C0H;TEA5767WRITE ADD


S1	EQU P1.4;search 
UP 	EQU P1.3;向上
DOWN 	EQU P1.2;向下

SDA 	EQU P1.1;数据传送
SCL 	EQU P1.0;时钟控制状态

LEDG    BIT P3.7;green LED:STREREO
LEDR    BIT P3.5;red LED:LIMIT
DOT	BIT P3.4

ST1H 	DATA 30H;收到电台高位
ST1L 	DATA 31H;收到电台低位
ST2H 	DATA 32H;READ3
ST2L 	DATA 33H;READ4
ST3H 	DATA 34H;READ5
ST3L 	DATA 35H;READ5

WTH 	DATA 36H;PLLH
WTL 	DATA 37H;PLLL

SLA 	DATA 38H;37H为被控器的地址
NUMBYT 	DATA 39H;38H为数据字节计数器
DISBUF	DATA 3AH;显示缓冲区
MRD 	DATA 40H;接收数据缓冲区首地址
MTD 	DATA 50H;发送数据缓冲区首地址

EXTRN CODE (_calc)	

;HIGH side LO injection BYTE3.4=1
;0x2A,0xB0,0xF1,0x9E,0x40
;88MHz->29DAH
;93100KHz->2C49H XIAN MUSIC

;主程序
MAIN: 		MOV SP,#5FH
      		MOV SCON,#0 

		LCALL DEL240
		CLR RF
		CLR BLF
		CLR STEREO
		LCALL SET896
		LCALL DEL240
		LCALL MRDINI
		LCALL FM_RD
		LCALL PLLDIS
		JNB STEREO, BEGIN; 
		CLR LEDG	;STEREO LEDG ON
;88MHz=29DA HILO=0 
;search up word 0xE9,0xDA,0xC8,0x17,0x00,
BEGIN:		
		MOV MTD,  #0E9H	;BIT7=1BIT6=1+29H	
		MOV MTD+1,#0DAH	;88MHz
		MOV MTD+2,#0C8H	;search up
		MOV MTD+3,#17H	;
		MOV MTD+4,#00H
SERCH:		JB S1,SERCH
		LCALL DEL12
		JB S1,SERCH
		SETB LEDG
		SETB LEDR
		LCALL FM_WT
		LCALL DEL240
		LCALL DEL240
		LCALL MRDINI
AGAIN:		LCALL FM_RD
		JNB RF,AGAIN
		
		JNB STEREO,MONO
		MOV MTD+2,#00H	;STEREO
		CLR LEDG	;GREEN LED ON
		AJMP LIST
MONO:		MOV MTD+2,#08H
LIST:		MOV MTD+1,ST1L
		MOV MTD,ST1H
		LCALL FM_WT 
		LCALL PLLDIS

		JB BLF,BACK	;LIMIT?
		MOV MTD+2,#0C8H	;search up
		MOV A,MRD+1
		ADD A,#0CH	;当前频率+100KHz
		MOV MTD+1,A
		MOV A,MRD
		ADDC A,#0C0H	;BIT7=1,BIT6=1搜索
		MOV MTD,A
		
		LJMP SERCH
;字节3: 0xC8向上低本振,0x58向下高本振					
;108MHz=3364H 
;search down word 0xF3,0x64,0x48,0x17,0x00,
BACK:		MOV ST1H,#33H
		MOV ST1L,#64H
		LCALL PLLDIS
		CLR LEDR
		MOV MTD,  #0F3H	;BIT7=1BIT6=1+33H	
		MOV MTD+1,#64H	;108MHz
		MOV MTD+2,#48H	;search down
		MOV MTD+3,#17H	;
		MOV MTD+4,#00H
				

SERCH2:		JB S1,SERCH2
		LCALL DEL12
		JB S1,SERCH2
		SETB LEDG
		SETB LEDR
		LCALL FM_WT
		LCALL DEL240
		LCALL DEL240
		LCALL MRDINI
AGAIN2:		LCALL FM_RD
		JNB RF,AGAIN2

		JNB STEREO,MONO2
		MOV MTD+2,#00H	;STEREO
		CLR LEDG	;GREEN LED ON
		AJMP LIST2
MONO2:		MOV MTD+2,#08H
LIST2:		MOV MTD+1,ST1L
		MOV MTD,ST1H
		LCALL FM_WT 
		LCALL PLLDIS

		JB BLF,RETUR
		MOV MTD+2,#48H	;search down
		MOV A,MRD+1
		SUBB A,#0CH	;当前频率-100KHz
		MOV MTD+1,A
		MOV A,MRD
		SUBB A,#00H
		ADD A,#0C0H	;BIT7=1,BIT6=1搜索
		MOV MTD,A
		
		LJMP SERCH2
RETUR:		MOV ST1H,#29H
		MOV ST1L,#0DAH
		LCALL PLLDIS
		CLR LEDR
		LJMP BEGIN

;===========================================================
;Given station frequency is 92900KHz=Hex2C67
;89600KHz:0x2A,0x9E,0x91,0x9F,0x40
;0x2A,0x9E,0x00,0x17,0x00
SET896:		MOV MTD,  #2AH	;设定89600KHz	
		MOV MTD+1,#9EH	;2A9E
		MOV MTD+2,#00H	;
		MOV MTD+3,#17H	;
		MOV MTD+4,#00H
		LCALL FM_WT
		RET
;---------------------------------------------------
MRDINI:		CLR A
		MOV MRD,  A	;CLR MRD	
		MOV MRD+1,A	;
		MOV MRD+2,A	;
		MOV MRD+3,A	;
		MOV MRD+4,A
		MOV ST1H,A
		MOV ST1L,A
		RET
;-----------------------------------------------------------
;TEA5767HN写入
FM_WT:		MOV SLA,#0C0H	;取写器件地址
		MOV NUMBYT,#5	;写字节数
		LCALL WRNBYT	;5个字节写入TEA5767
		RET
;-------------------------------------------------------
;TEA5767HN读出
FM_RD:		
		MOV SLA,#0C1H	;取读器件地址
		MOV NUMBYT,#5	;读出5个字节
		LCALL RDNBYT	;
		MOV A,MRD	;接收数据缓冲区首地址
		ANL A,#3FH	;屏蔽无效位
		MOV ST1H,A	;存电台高位
		MOV A,MRD
		RLC A
		MOV RF,C	;READY FLAG
		RLC A
		MOV BLF,C	;BAND LIMIT FLAG
		MOV A,MRD+1	;
		MOV ST1L,A	;存电台低位
		MOV A,MRD+2
		RLC A
		MOV STEREO,C	;STEREO FLAG
		RET


;==================================================
;F=PLL×8192+225000/1000000
;8192=2000H
;PLL->F,频率显示
PLLDIS:		MOV R7,ST1L;电台低位
		MOV R6,ST1H;电台高位
		MOV R5,#00H
		MOV R4,#00H
		LCALL _calc
		MOV ST2L,R7;频率最低位
		MOV ST2H,R6;频率高位
		MOV R6,ST2H
		MOV R7,ST2L
		LCALL HB2
      		MOV R0,#DISBUF
		MOV A,R5	;个位
                ANL A,#0FH
                MOV @R0,A
                MOV A,R5	;十位
                SWAP A
                ANL A,#0FH
                INC R0
                MOV @R0,A
                MOV A,R4	;百位
                ANL A,#0FH                
                INC R0
                MOV @R0,A
                MOV A,R4	;千位
                SWAP A
                ANL A,#0FH
                INC R0
                MOV @R0,A
		ORL DISBUF+1,#80H;加小数点
		LCALL DISP
		RET
;--------------------------------------------------
;双字节十六进制整数转换成双字节BCD码整数
;入口条件:待转换的双字节十六进制整数在R6、R7中。高位在R6
;出口信息:转换后的三字节BCD码整数在R3、R4、R5中。R3是最高位
;影响资源:PSW、A、R2~R7 堆栈需求: 2字节
HB2:            CLR A 
                MOV R3,A
                MOV R4,A
                MOV R5,A
                MOV R2,#10H
HB3:            MOV A,R7 
                RLC A
                MOV R7,A
                MOV A,R6
                RLC A
                MOV R6,A
                MOV A,R5 
                ADDC A,R5
                DA A
                MOV R5,A
                MOV A,R4
                ADDC A,R4
                DA A
                MOV R4,A
                MOV A,R3
                ADDC A,R3
                MOV R3,A
                DJNZ R2,HB3
                RET              

;-------------------------------------------
;显示先送低位
DISP: 
      	MOV R0,#DISBUF		;先个位
	MOV A,#04H
      	MOV R2,A  
DISP1:	MOV A,@R0
      	JNB ACC.7,NOPOT
      	CLR ACC.7		;有小数点
      	MOV B,#7FH		;共阴用#80H
      	AJMP ISPOT    
NOPOT:	MOV B,#0FFH		;#00H  
ISPOT:	MOV DPTR,#TABEL
      	MOVC A,@A+DPTR
      	ANL A,B			;共阴显示小数点ORL A,B
      	LCALL REVERS
      	MOV SBUF,A
      	JNB TI,$
      	CLR TI
      	INC R0
      	DJNZ R2,DISP1
      	RET    
;共阳码表低电平有效
tabel:
db  0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h	;0123456789
db  88h,83h,0c6h,0a1h,86h,8eh,8ch,89h,91h,0bfh,0FFH	;AbCdEFPHY-  

REVERS: CLR C
        RRC A
        MOV 07H,C
        RRC A
        MOV 06H,C
        RRC A
        MOV 05H,C
        RRC A
        MOV 04H,C
        RRC A
        MOV 03H,C
        RRC A
        MOV 02H,C
        RRC A
        MOV 01H,C
        RRC A
        MOV 00H,C
        MOV A,20H
        RET
;=======================================================
;IIC总线操作子程序包
STAR:		SETB SDA;启动IIC总线
		SETB SCL
		NOP
		NOP
		CLR SDA
		NOP
		NOP
		CLR SCL
		RET

STOP: 		CLR SDA ;停止IIC总线数据传送
		SETB SCL
		NOP
		NOP
		SETB SDA
		NOP
		NOP
		CLR SDA
		CLR SCL
		RET

MACK: 		CLR SDA ;发送应答位
		SETB SCL
		NOP
		NOP
		CLR SCL
		SETB SDA
		RET

MNACK: 		SETB SDA ;发送非应答位
		SETB SCL
		NOP
		NOP
		CLR SCL
		CLR SDA
		RET

CACK: 		SETB SDA ;应答位检查
		SETB SCL
		CLR F0
		MOV C,SDA
		JNC CEND
		SETB F0 
CEND: 		CLR SCL
		RET

WRBYT: 		MOV R0,#08H ;向SDA线上发送1个数据字节
WLP: 		RLC A
		JC WR1
		AJMP WR00 
WLP1: 		DJNZ R0,WLP
		RET 
WR1: 		SETB SDA
		SETB SCL
		NOP
		NOP
		CLR SCL
		CLR SDA
		AJMP WLP1 
WR00: 		CLR SDA
		SETB SCL
		NOP
		NOP
		CLR SCL
		AJMP WLP1

WRNBYT: 	MOV R3,NUMBYT 	;向IIC总线发送n个字节数据
		LCALL STAR
		MOV A,SLA	;取写器件地址
		LCALL WRBYT	;写入写器件地址
		LCALL CACK
		JB F0,WRNBYT
		MOV R1,#MTD 	;写入数据缓存首地址
WRDA: 		MOV A,@R1
		LCALL WRBYT
		LCALL CACK
		JB F0,WRNBYT
		INC R1
		DJNZ R3,WRDA
		LCALL STOP
		RET

RDBYT: 		MOV R0,#08H 	;从SDA线上读取1个数据字节
RLP: 		SETB SDA
		SETB SCL
		MOV C,SDA
		MOV A,R2
		RLC A
		MOV R2,A
		CLR SCL
		DJNZ R0,RLP
		RET

;从IIC总线接收n个字节数据
RDNBYT:		MOV R3, NUMBYT 	;读n个字节数据
		LCALL STAR
		MOV A,SLA	;取读器件地址
		LCALL WRBYT	;写入读器件地址
		LCALL CACK
		JB F0,RDNBYT
 		MOV R1,#MRD	;读数据缓存首地址 
RDN1: 		LCALL RDBYT	;读一个字节数据
		MOV @R1,A
		DJNZ R3,ACK
		LCALL MNACK
		LCALL STOP
		RET 
ACK: 		LCALL MACK
		INC R1
		SJMP RDN1

;=======================================
;12ms@6MHz延时
DEL12:	MOV R7,#25
DEL7: 	MOV R6,#120
      	DJNZ R6,$
      	DJNZ R7,DEL7
      	RET
;----------------------------------
DEL240:	MOV R5,#20
LP1:  	LCALL DEL12
      	DJNZ R5,LP1
      	RET
;=================================
BP:   	CLR DOT
      	LCALL DEL240
      	SETB DOT
      	RET

;--------------------------------
BPL:  	MOV R5,#8;长声
BB:   	LCALL BP 
      	DJNZ R5,BB
      	RET
END  

⌨️ 快捷键说明

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