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

📄 sky1.asm

📁 基于2051的数据记录仪汇编源码
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;**************************************************************
;        LIGHTNING WATCH PROCESSING ROUTINE ON 89C2051        ;
;**************************************************************
;
;**************************************************************
;               器件地址定义
;**************************************************************
		AT24C08  EQU   0A8H	;0A8H,0AAH,0ABH,0ACH
						;各256个字节。
		PCF8563  EQU   0A2H
;**************************************************************
;               内部数据定义
;**************************************************************
;		#30H   DATA  30H      ;串口接收缓冲区
;		#38H   DATA  38H	;串口发送缓冲区
		DELAYC   DATA  3EH      ;延时计数器
		TIMCNT   DATA  3FH      ;
		MIN_MD   DATA  40H      ;分钟数据缓冲区
		HOU_MD   DATA  41H      ;小时数据缓冲区
		DAY_MD   DATA  42H      ;日数据缓冲区
		MON_MD   DATA  43H      ;月数据缓冲区
		YEA_MD   DATA  44H      ;年数据缓冲区
		AD_VA1   DATA  45H
		AD_VA2   DATA  46H
		AD_VA3   DATA  47H
		AD_CNT   DATA  48H      ;AD移位计数器
		AD_VAL   DATA  49H	;AD采样数据缓冲区
		TMPVAL   DATA  4AH
		AT2408   DATA  4BH	;0A8H,0AAH,0ACH,0AEH
		FNDREG   DATA  4CH      ;查寻状态标志
		COM_LG   DATA  4DH	;有效命令长度
		MODREG   DATA  4EH      ;编辑状态标志
		TMPCNT   DATA  4FH      ;处理过程计数器		
		LED_D0   DATA  50H	;LED0数据缓冲区
		LED_D1   DATA  51H	;LED1数据缓冲区
		LED_D2   DATA  52H	;LED2数据缓冲区
		LED_D3   DATA  53H	;LED3数据缓冲区
		LED_D4   DATA  54H	;LED4数据缓冲区
		LED_D5   DATA  55H	;LED5数据缓冲区
		LED_D6   DATA  56H	;LED6数据缓冲区
		FUNREG   DATA  57H	;功能标志
		CU_REC   DATA  58H	;当前记录数	
		REC_NU   DATA  59H      ;最大记录数
		BITCNT   DATA  5AH      ;I2C数据位计数器
		BYTCNT   DATA  5BH      ;I2C数据字节计数器
		SLVADR   DATA  5CH      ;被控器件地址
		SUBADR   DATA  5DH      ;被控器单元地址
		MAX_VL   DATA  5EH	;上限值
		MIN_VL   DATA  5FH	;下限值
		RCVDAT   DATA  60H      ;接收数据缓冲区
		XMTDAT   DATA  70H      ;发送数据缓冲区
;**************************************************************
;               CPU端口定义
;**************************************************************
		I2C_CLK   BIT  P1.0	;I2C总线时钟信号位
		I2C_DIO   BIT  P1.1	;I2C总线数据信号位
		LED_CS    BIT  P1.6	;7219片选信号位
		LED_DATA  BIT  P1.7	;7219数据信号位
		LED_CLK   BIT  P3.7	;7219时钟信号位
		AD_CLK    BIT  P3.5	;T549时钟信号位
		AD_DATA   BIT  P3.3	;T549数据信号位
		AD_CS     BIT  P3.4	;T549片选信号位
		SEC_INT   BIT  P3.2	;秒中断信号位		
		ACK       BIT  20H
;**************************************************************
		ORG	0000H
		  SJMP	BEGIN		;主程序
		ORG	0003H
		  LJMP	CLOCK		;秒时钟中断服务
		ORG	0023H
		  LJMP	INT_RS232	;串口中断服务
;**************************************************************
; 初始化时钟、串口中断及各变量值
;**************************************************************
BEGIN:  
		MOV	SP, #10H  		;定义堆栈
		ACALL READ_REC		;读取记录总数
		MOV	A, #01H
		MOV	YEA_MD, A
		MOV	MON_MD, A
		MOV	DAY_MD, A
		MOV   A, #00H
		MOV   FUNREG, A		;初始化变量单元
		MOV   AD_VAL, A
		MOV 	LED_D6, A
		MOV	MODREG, A
		MOV	FNDREG, A
		MOV	COM_LG, #08
		MOV	MIN_MD, A
		MOV   HOU_MD, A
;		MOV	TIMCNT, A
		MOV   AD_CNT, A		;AD变换初始化
		MOV   DELAYC, A
		SETB	AD_CS
		CLR   AD_CLK

		MOV	IE, #93H		;设置中断允许寄存器
		MOV   IP, #10H		;设置中断优先寄存器

		SETB	IT0			;外部中断为沿触发方式

		MOV	TMOD, #20H		;定时器0,1设置为工作方式2
		MOV   TH1, #0FDH		;设置波特率9600
		MOV   TL1, #0FDH		;
		SETB	TR1			;启动T1
		MOV	SCON, #050H	      ;设置串口工作方式3
		MOV	PCON, #00H		;波特率为Fosc/32
		
		MOV	R1, #68H		;设置接收缓冲区

		ACALL INIT_LED		;初始化7219
		ACALL SETSINT		;设置8563秒中断输出
		ACALL SET_TIME		;设置8563时间

		MOV	A, REC_NU
		ACALL DISP_REC

		SJMP  MAIN            	;转主程序
;**************************************************************
; 主程序模块
;**************************************************************
MAIN:   
		MOV	P1, #0FFH  		;禁止输出
		MOV   P3, #0FFH
		MOV   A, P1
		ANL   A, #3CH	
		CJNE  A, #3CH, K0
;		MOV	B, A
;		MOV	A, TIMCNT
;		CJNE  A, #00H, K0
		MOV   A, DELAYC
		CJNE  A, #00H, MAIN	;采样延时是否结束?
		ACALL	RUN_ADS
		SJMP  MAIN
K0:     
;		MOV	A, B
		CJNE  A, #34H, K1
		ACALL KEY_MOD
		MOV	R4, #5FH
		ACALL DELAY
		SJMP  END_M
K1:     
		CJNE  A, #38H, K2
		MOV   MODREG, #00H
		ACALL KEY_FUN
		MOV	R4, #5FH
		ACALL DELAY
		SJMP  END_M
K2:     
		CJNE  A, #1CH, K3
		ACALL KEY_UP
		MOV	R4, #5FH
		ACALL DELAY
		SJMP  END_M
K3:     
		CJNE  A, #2CH, END_M
		ACALL KEY_DOWN
		MOV	R4, #5FH
		ACALL DELAY
END_M:  
		SJMP	MAIN
;**************************************************************
; 初始化MAX7219
;**************************************************************
INIT_LED:				
		MOV	A, #01H  		;正常显示
		MOV	R7, #0CH		;设置显示模式
		ACALL SET_LED

		MOV	A, #06H	      ;7位LED
		MOV	R7, #0BH		;设置显示范围
		ACALL SET_LED

		MOV   A, #02H		;7/32*I
		MOV	R7, #0AH		;设置显示亮度
		ACALL SET_LED

		ACALL CLR_SCR		;清除显示屏幕

PR1:
		MOV   LED_D6, #40H	;设置时间工作状态
		MOV   A, LED_D6
		MOV	R7, #07H
		ACALL SET_LED
;**************************************************************
; 字节高低位交换	
;	输入:A:欲交换的字节 
;	输出:A:交换后的字节
;	R2,R3,R4
;**************************************************************
INVERSE:		
		MOV   R2, #00H
		MOV   R4, #00H
		MOV   R3, A
PA0:  
		CJNE  R2, #08H, PA1
		MOV   A, R4
		RET
PA1:  
		CJNE  R2, #00H, PA2
		MOV   A, R3
		ANL   A, #01H
		ORL   A, R4
		MOV   R4, A	
      	MOV   A, R3
	      RR    A
	      MOV   R3, A
      	INC   R2
      	SJMP  PA0
PA2:	
	      MOV   A, R4
      	RL    A
	      MOV   R4, A
	      MOV   A, R3
      	ANL   A, #01H
	      ORL   A, R4
	      MOV   R4, A
      	MOV   A, R3
	      RR    A
	      MOV   R3, A
	      INC   R2
	      SJMP  PA0
;**************************************************************
; 送数到LED显示   寄存器A:显示控制 寄存器B:显示内容
;**************************************************************
SEND_LED:	   	    			
		CLR   LED_CLK
		CLR   LED_CS
		MOV   R2, #00H
		MOV   R3, A
PA3:  
		CJNE  R2, #08H, PA7
		MOV   A, B
		MOV   R3, A
		SJMP  PA4
PA7:  
		CJNE  R2, #10H, PA4
		SETB  LED_CS
		RET
PA4:  
		ANL   A, #01H
	      CJNE  A, #01H, PA5
	      SETB  LED_DATA	
	      SJMP  PA6
PA5:  
		CLR   LED_DATA
PA6: 	
		SETB  LED_CLK
		NOP
		CLR   LED_CLK        
		MOV   A, R3
		RR    A
		MOV   R3, A
		INC   R2
		SJMP  PA3
;**************************************************************
; 清除屏幕显示:6位LED全清       
;**************************************************************
CLR_SCR:
		MOV	R6, #01H
PQ1:
		CJNE	R6, #7, PQ0
		RET
PQ0:
            MOV	A, R6
		ACALL CLR_LED
		INC	R6
		SJMP  PQ1
;**************************************************************
; 清除LED显示     寄存器A:要清除的LED位数	       
;**************************************************************
CLR_LED:
		MOV   B, #00H
	      ACALL INVERSE
		ACALL SEND_LED
		RET
;**************************************************************
; 查LED显示表	       
;**************************************************************
READ_TAB:				;
		MOV   DPTR,	#LED_TAB
		MOVC  A, @A+DPTR
		RET
;**************************************************************
; 查AD对应表	       
;**************************************************************
R_AD_TAB:				;
		MOV	A, AD_VAL
		MOV	B, #0AH
		DIV	AB
		DEC   A
		MOV   DPTR,	#AD_TAB
		MOVC  A, @A+DPTR
		RET
;**************************************************************
; 延时
;
; 输入 -- R4: 延时数量级
;**************************************************************
DELAY:				
		MOV   R2, #0FFH
PE0:  
		MOV   R3, #01H 
PE1:  
;		MOV   R4, #0FFH
PE2:  
		DJNZ  R4, PE2
	      DJNZ  R2, PE1
	      DJNZ  R3, PE0
		RET
;**************************************************************
; HEX码转换为BCD码	       
; 		
; 输入 ---	A:  被转换的HEX数  
; 返回 ---	R3:转换后低位BCD数
;      	R4:转换后高位BCD数
;**************************************************************
HEX_BCD:
		MOV	B, #100
		DIV	AB
		MOV	R3, A
		MOV	A, #10
		XCH	A, B
		DIV	AB
		MOV	R4, A
		MOV	R3, B
		SWAP  A
		ORL   A, B
		RET		
;**************************************************************
; BCD码转换为HEX码	       
; 		
; 输入 ---	A:  被转换的BCD数  
; 返回 ---	A: 转换后HEX
;**************************************************************
BCD_HEX:
		MOV	B, #10H
		DIV	AB
		MOV	R4, B
		MOV	B, #10
		MUL	AB
		ADD	A, R4
		RET
;**************************************************************
; 显示日期	       
;**************************************************************
DISP_DATE:
		MOV   A, DAY_MD		;取日期个位数赋给LED0
		ANL   A, #0FH
		MOV   LED_D0, A		;显示日期个位数
		MOV	R7, #01H
		ACALL WRITE_LED

		MOV   A, DAY_MD		;取日期十位数赋给LED1
		SWAP  A
		ANL   A, #0FH
		MOV   LED_D1, A		;显示日期十位数
		MOV	R7, #02H
		ACALL	WRITE_LED

		MOV   A, MON_MD		;取月份个位数赋给LED2
		ANL   A, #0FH
		MOV   LED_D2,A		;显示月份个位数
		MOV	R7, #03H
		ACALL	WRITE_LED

		MOV   A, MON_MD		;取月份十位数赋给LED3
		SWAP  A
		ANL   A, #0FH
		MOV   LED_D3, A		;显示月份十位数
		MOV	R7, #04H
		ACALL	WRITE_LED

		MOV   A, YEA_MD		;取年份个位数赋给LED2
		ANL   A, #0FH
		MOV   LED_D4, A		;显示年份个位数
		MOV	R7, #05H
		ACALL WRITE_LED

		MOV   A, YEA_MD		;取年份十位数赋给LED3
		SWAP  A
		ANL   A, #0FH
		MOV   LED_D5, A		;显示年份十位数
		MOV	R7, #06H
		ACALL WRITE_LED

		RET
;**************************************************************
; 显示LED数值
;
; 输入 -- A:显示的内容   R7:显示的位数
;**************************************************************
WRITE_LED:
		ACALL READ_TAB
	      ACALL INVERSE
		MOV   B, A
	      MOV   A, R7
	      ACALL INVERSE
		ACALL SEND_LED
		RET
;**************************************************************
; 设置LED数值
;
; 输入 -- A:显示的内容   R7:显示的位数
;**************************************************************
SET_LED:
	      ACALL INVERSE
		MOV   B, A
	      MOV   A, R7
	      ACALL INVERSE
		ACALL SEND_LED
		RET
;**************************************************************
; 显示时间	       
;**************************************************************
DISP_TIME:
		MOV   A, MIN_MD		;取分钟个位数赋给LED0
		ANL   A, #0FH
		MOV   LED_D0, A		;显示分钟个位数
		MOV	R7, #01H
		ACALL WRITE_LED

		MOV   A, MIN_MD		;取分钟十位数赋给LED1
		SWAP  A
		ANL   A, #0FH
		MOV   LED_D1, A		;显示分钟十位数
		MOV	R7, #02H
		ACALL	WRITE_LED

		MOV   A, HOU_MD		;取小时个位数赋给LED2
		ANL   A, #0FH
		MOV   LED_D2, A		;显示小时个位数
		MOV	R7, #03H
		ACALL WRITE_LED

		MOV   A, HOU_MD		;取小时十位数赋给LED3
		SWAP  A
		ANL   A, #0FH
		MOV   LED_D3, A		;显示小时十位数
		MOV	R7, #04H
		ACALL	WRITE_LED

		RET
;**************************************************************
; 显示秒点	       
;**************************************************************
DISP_SPT:
		MOV	A, LED_D0
		ACALL READ_TAB
		ORL   A, #80H
		MOV	R7, #01H
		ACALL	SET_LED

		MOV	A, LED_D1
		ACALL READ_TAB
		ORL   A, #80H
		MOV	R7, #02H
		ACALL SET_LED
		RET
;**************************************************************
; 清除秒点	       
;**************************************************************
CLR_SPT:
		MOV	A, LED_D0
		ACALL READ_TAB
		ANL   A, #07FH
		MOV	R7, #01H
		ACALL SET_LED

		MOV	A, LED_D1
		ACALL READ_TAB
		ANL   A, #07FH
		MOV	R7, #02H
		ACALL SET_LED
		RET
;**************************************************************
; 读取当前时间及日期数据	       
;**************************************************************
READ_TIME:
		MOV   SLVADR, #PCF8563

⌨️ 快捷键说明

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