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

📄 lpc932_ring.asm

📁 LPC900单片机设计方案--自动响铃实验系统
💻 ASM
字号:
/***********************************************************
*文件名:LPC932_Ring.ASM
*开发: www.zlgmcu.com
*功能: 自动响铃系统控制程序
*日期: 13:01 04-2-28
***********************************************************/
$NOMOD51
$INCLUDE(REG932.INC)

#define	MINUTE	PCF8563_ReadBuff+3	;定义MINUTE宏
#define	HOUR	PCF8563_ReadBuff+4	;定义HOUR宏

PCF8563_WriteBuff	EQU	0x30	;定义8563写缓冲区
PCF8563_ReadBuff	EQU	0x40	;定义8563读缓冲区
EEprom_DataBuff		EQU	0x50	;定义EEPROM数据缓冲区

PCF8563	EQU	0xA2			;定义8563地址
KEY	BIT	P1.7			;定义启动键
RUN	BIT	P2.7			;定义运行端口

SDA	BIT	P1.3			;
SCL	BIT	P1.2
ACK	BIT	10H

MTD	DATA	2BH			;IIC发动缓冲区
MRD	DATA	2CH			;IIC接收缓冲区
SLA	DATA	2DH			;器件从地址	
SUBA	DATA	2EH			;子地址
NUMBYTE	DATA	2FH			;读/写字节数

	ORG	0000H
	AJMP	MAIN
	ORG	0013H
	AJMP	INT1_ISR		;INT1中断服务程序
	ORG	0023H
	AJMP	UART_ISR		;串口中断接收程序
	
	ORG	0080H
MAIN:
	MOV	P1M1,#0x00		;初始化端口
	MOV	P1M2,#0x00
	MOV	P2M1,#0xC0
	MOV	P2M2,#0xC0

	SETB	SDA			;拉高SDA/SCL
	SETB	SCL
	
	SETB	IT1			;下降沿触发
	SETB	EX1			;开启外部中断1
	
	ACALL	Uart_Init		;调用串口初始化程序
	ACALL	WatchDog_Init		;调用开门狗初始化程序
	ACALL	ReadChart		;调用ReadChart,将内部EEprom的值读入到RAM
	
LOOP1:
	JB	KEY,SKIP1		;等待启动键按下
	
	ACALL	PCF8563_Init		;8563初始化

SKIP1:	
	ACALL	Delay			;延时
	ACALL	Clear_WatchDog		;喂狗
	SJMP	LOOP1

	RET

;------------------------------------------------------------
;功能:串口初始化
;------------------------------------------------------------
Uart_Init:
	MOV	SCON,#0x50		;选择BRG作为波特率发生器,8位UART模式
	MOV	SSTAT,#0x60		;设置停止位结束产生中断,设置独立的Rx/Tx中断

	MOV	BRGR0,#0xF0		;设置内部晶振时的波特率 9600
	MOV	BRGR1,#0x02
	MOV	BRGCON,#0x03		;使能波特率发生器
	
	SETB	ES			;使能串行中断
	
	RET
;------------------------------------------------------------
;功能:PCF8563初始化
;------------------------------------------------------------
PCF8563_Init:
	
	MOV	R7,#0x10		;从缓冲区中读入PCF8563的配置值到PCF8563_WriteBuff缓冲区
LOOP_PCF8563INIT:
	MOV	R0,#EEprom_DataBuff
	MOV	R1,#PCF8563_WriteBuff
	MOV	A,@R0
	MOV	@R1,A
	INC	R0
	INC	R1
	DJNZ	R7,LOOP_PCF8563INIT

	MOV	SLA,#PCF8563		;器件从地址
	MOV	SUBA,#0x00		;子地址
	MOV	MTD,#PCF8563_WriteBuff	;发送缓冲区
	MOV	NUMBYTE,#0x10		;写0x10字节
	LCALL	IWRNBYTE		;将PCF8563_WriteBuff的值写入到PCF8563中

	RET
;------------------------------------------------------------
WatchDog_Init:
	
	MOV	A,WDCON			;从WDCON读取值
	ORL	A,#0xE4			;选择看门狗分频
	MOV	WDL,#0xFF		;装入8位倒计数器的新值
	
	CLR	EA			;关中断
	MOV	WDCON,A			
	MOV	WFEED1,#0xA5		;清0 序列1
	MOV	WFEED2,#0x5A		;清0序列2
	SETB	EA			;开中断

	RET
;------------------------------------------------------------
;功能:从内部EEPROM读一字节
;参数:R6 地址 ,A读出数据
;------------------------------------------------------------
ReadEEprom:
	
	MOV	DEECON,#0x00		;控制字
	MOV	DEEADR,R6		;发送读地址,并开始读

LOOP_ReadEEprom:		
	MOV	A,DEECON
	ANL	A,#0x80
	JZ	LOOP_ReadEEprom		;等待读完成
	
	MOV	A,DEEDAT		;将读出的数据存入A

	RET
;-----------------------------------------------------------
;R6 地址, A 写入数据
;-----------------------------------------------------------
WriteEEprom:

	;CLR	EA
	MOV	DEECON,#0x00		;控制字
	MOV	DEEDAT,A		;将要写入的值
	MOV	DEEADR,R6		;发送写的地址,并开始写
	;SETB	EA

LOOP_WriteEEprom:
	MOV	A,DEECON
	ANL	A,#0x80
	JZ	LOOP_WriteEEprom	;等待写完成
	
	RET
;------------------------------------------------------------
;功能:将内部EEprom的值读到EEprom_DataBuff中去
;------------------------------------------------------------
ReadChart:
	
	MOV	R7,#0x2C		;读字节数
	MOV	R6,#0x00		;地址首值
LOOP_ReadChart:
	ACALL	ReadEEprom		;读一字节
	
	MOV	R0,#EEprom_DataBuff	;存入EEprom_DataBuff
	MOV	@R0,A
	INC	R0
	
	INC	R6			;地址递增
	DJNZ	R7,LOOP_ReadChart	
	
	RET
;------------------------------------------------------------
;功能:喂狗
;------------------------------------------------------------
Clear_WatchDog:
	
	CLR	EA			;关中断
	MOV	WFEED1,#0xA5		;清0序列1
	MOV	WFEED2,#0x5A		;清0序列2
	SETB	EA			;开中断
	
	RET
;------------------------------------------------------------
;功能:延时
;------------------------------------------------------------
Delay:

	MOV	R4,#0x40
LOOP_Delay1:
	MOV	R3,#0xFE
LOOP_Delay2:
	MOV	R2,#0xFE
LOOP_Delay3:
	DJNZ	R2,LOOP_Delay3
	DJNZ	R3,LOOP_Delay2
	DJNZ	R4,LOOP_Delay1
	
	RET
;------------------------------------------------------------
;功能:外部中断1服务程序
;------------------------------------------------------------
INT1_ISR:

	CLR	EA				;关中断
	
	MOV	SLA,#PCF8563			;器件从地址
	MOV	SUBA,#0x00			;子地址
	MOV	MRD,#PCF8563_ReadBuff		;置读缓冲区
	MOV	NUMBYTE,#0x10			;读字节数
	LCALL	IRDNBYTE			;调用IIC读子程序

	MOV	R7,#0x10			;

LOOP_INT1:
	MOV	R0,#EEprom_DataBuff+0x10	;将时刻表的起始位置赋给R0

	MOV	A,@R0				;将8563的分钟值读出与时刻表的相应值比较
	MOV	R1,#MINUTE
	XRL	A,@R1
	JNZ	STOP
	
	MOV	A,@R0				;将8563的小时值读出与时刻表的相应值比较
	MOV	R1,#HOUR
	XRL	A,@R1
	JNZ	STOP

	INC	R7
	INC	R7

START:						
	SETB	RUN
STOP:
	CLR	RUN
	CJNE	R7,#0x2C,LOOP_INT1		;循环到EEprom_DataBuff的0x2C为止
	
	SETB	INT1				;拉高INT1
	CLR	IE1				;清0 IE1(当运行INT1_ISR,该位可由硬件自动清0)
	SETB	EA				;开中断
	
	RETI
;------------------------------------------------------------
;功能:串口中断服务程序
;------------------------------------------------------------
UART_ISR:

	CLR	EA				;关中断
	
	MOV	R7,#0x2C			;接收上位机发送过来的8563初始化配置字及时刻表值
UART_LOOP1:
	MOV	A,#RI
	JZ	UART_LOOP1			;等待RI为1
	CLR	RI				;RI清0
	MOV	A,SBUF
	
	MOV	R0,#EEprom_DataBuff		;将收到的数据存入EEprom_DataBuff
	MOV	@R0,A
	INC	R0
	DJNZ	R7,UART_LOOP1

	MOV	R7,#0x2C			;将EEprom_DataBuff中的数写入EEprom保存
	MOV	R6,#0x00			;EEprom起始地址
UART_LOOP2:
	MOV	R1,#EEprom_DataBuff		;从EEprom_DataBuff读一字节数据
	MOV	A,@R1
	ACALl	WriteEEprom			;写一字节
	INC	R1				;寻址EEprom_DataBuff下一字节

	INC	R6				;EEprom地址递增
	DJNZ	R7,UART_LOOP2			;

	SETB	EA				;开中断
	RETI

;---------------------------------------------------------------
$INCLUDE(HI2C_Asm.INC)
;---------------------------------------------------------------
	END

⌨️ 快捷键说明

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