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

📄 闹铃3.txt

📁 采用单片机控制的自动打铃器
💻 TXT
📖 第 1 页 / 共 2 页
字号:
TF2		EQU     0CFH;T2中断标志控制位
TR2		EQU	0CAH;T2启动/停止控制位
ET2		EQU	0ADH;T2允许中断控制位
PT2 		EQU	0BDH;T2优先级控制位
RCAP2L		EQU	0CAH;T2自动重载低位
RCAP2H		EQU	0CBH;T2自动重载高位
TL2		EQU	0CCH;T2计数器低位
TH2		EQU	0CDH;T2计数器高位
I2cStart	EQU	 55H;I2C开始标志
I2cStop		EQU	0AAH;I2C结束标志
SDA		EQU	0B2H;I2C数据线
SCL		EQU	0B3H;I2C时钟线
SHOW_CODE	EQU	 80H;显示段码
SHOW_BIT	EQU 	0A0H;显示位码
KeyFlag		EQU	 00H;按键标志位
S_Flash		EQU 	 01H;秒闪标志位
LED_FLAG	EQU 	 02H;LDE显示模式标志位
BeforKey	EQU      22H;上次采样键值
NowKey		EQU	 23H;现在次采样键值
LS_1		EQU	 24H;临时变量1
LS_2		EQU	 25H;临时变量2
LS_3		EQU	 26H;临时变量3
time0	        EQU	 27H;时钟秒
time1	        EQU	 28H;时钟分
time2	        EQU	 29H;时钟时
SHOW_MOUDE	EQU	 2AH;显示模式
SHOW_PC		EQU	 2BH;显示数据指针
RingCount	EQU	 2CH;报警数据个数
ShowRingData	EQU	 2DH;显示报警数据地址
RINGDATAH	EQU      2EH;报警数据高位起始地址
RINGDATAL	EQU	 57H;报警数据低位起始地址
	ORG 0000H
	MOV SP,#10H
	SJMP START
	ORG 0001BH
	AJMP INT_T1
	ORG 0002BH
	CPL P3.5
	CLR TF2
	RETI
	ORG 00035H
START:	MOV TH2,#3CH	    ;设置T2定时50ms
	MOV TL2,#0B0H
	MOV RCAP2H,#3CH
	MOV RCAP2L,#0B0H
	SETB PT2
	SETB ET2
	MOV TMOD,#60H       ;设置T1定时500ms(T2中断10次,T1中断5次)
	MOV TH1,#0FBH
	MOV TL1,#0FBH
	SETB ET1
	ACALL READ_DATA
	SETB EA
	SETB TR2
	SETB TR1
	MOV time0,#0
	MOV time1,#0
	MOV time2,#12
	SETB LED_FLAG
	CLR P3.4
AGAIN:
	MOV SHOW_MOUDE,#0      	;显示模式0
	MOV SHOW_PC,#time0;显示时钟(传时钟地址指针)
	ACALL DISPLAY		;调用动态扫描子程序
	ACALL COMP_DATA		;调用报警扫描子程序
	MOV BeforKey,NowKey
	ACALL GETKEY 		;调用键盘扫描子程序
	MOV NowKey,A
	CJNE A,BeforKey,AGAIN
	CJNE A,#0,NEXT_KEY0
	SETB KeyFlag
	SJMP AGAIN
NEXT_KEY0:
	JNB KeyFlag,AGAIN
	CLR KeyFlag
	CJNE A,#1,NEXT_KEY2
	ACALL SetTimer		;调用设置时钟子程序
	SJMP AGAIN
NEXT_KEY2:
	CJNE A,#2,AGAIN
	ACALL SetRing		;调用设置报警子程序
	SJMP AGAIN;--------------------//主程序结束//
COMP_DATA:			;报警扫描子程序
	MOV A,RingCount         ;-------------------循环执行打铃程序
	JZ COMP_EXIT
	MOV A,time0
	JNZ COMP_EXIT
	MOV R2,RingCount
        MOV R0,#RINGDATAL
        MOV R1,#RINGDATAH
COMP_LOOP:
	MOV A,@R1
	CJNE A,time2,NEXT_COMP
	MOV A,@R0
	CJNE A,time1,NEXT_COMP
	SETB P3.4
	SJMP COMP_EXIT
NEXT_COMP:
	INC R0
	INC R1
	DJNZ R2,COMP_LOOP
COMP_EXIT:
	RET
;//-----------------I2C接口程序----------------//
I2C_START:                    ;I2C开始
	SETB SDA
	SETB SCL
	NOP
    	CLR SDA
        NOP
	CLR SCL
	RET
I2C_STOP:                      ;I2C结束
	CLR SDA
	NOP
	SETB SCL
        NOP
	SETB SDA
	RET
I2C_SEND:                      ;I2C发送一个字节
        MOV R7,#08
	CLR C
SEND_BIT:
	RLC A
	MOV SDA,C
        NOP
	SETB SCL
	NOP
	CLR SCL
        DJNZ R7,SEND_BIT
	SETB SDA
        NOP
	SETB SCL
	NOP
	CLR SCL
	RET
I2C_RECEIVE:			;I2C接收一个字节
        MOV R7,#08
RECEIVE_BIT:
	SETB SCL
	NOP
        MOV C,SDA
	RLC A
	CLR SCL
	DJNZ R7,RECEIVE_BIT
	SETB SDA
	NOP
	SETB SCL
	NOP
	CLR SCL
	RET
READ_24C02:			;读24C02
	ACALL I2C_START
	MOV A,#0A0H
	ACALL I2C_SEND
	MOV A,R0
	ACALL I2C_SEND
	ACALL I2C_START
	MOV A,#0A1H
	ACALL I2C_SEND
	ACALL I2C_RECEIVE
	ACALL I2C_STOP
	RET
WRITE_24C02:			;写24C02
	ACALL I2C_START
	MOV A,#0A0H
	ACALL I2C_SEND
	MOV A,R0
	ACALL I2C_SEND
	MOV A,R1
	ACALL I2C_SEND
	ACALL I2C_STOP
	RET
READ_DATA:;--------------------从24C02中读取数据更新内存
	MOV R2,#10
READ_START_AGAIN:			;读开始标志位
	MOV R0,#0
	CLR EA
	ACALL READ_24C02
	SETB EA
	CJNE A,#I2cSTART,READ_SUB
	SJMP WRITE_STOP
READ_SUB:
	DJNZ R2,READ_START_AGAIN	;读开始位错误刷新24C02
WRITE_STOP:
	XRL A,#I2cSTART
	JZ READ_NEXT1
	MOV R0,#0
	MOV R1,#I2cStart
	CLR EA
	ACALL WRITE_24C02		;写开始字节
	SETB EA
	MOV R7,#5
	ACALL Delay1ms
	MOV R0,#1
	MOV R1,#I2cStop
	CLR EA
	ACALL WRITE_24C02		;写结束字节
	SETB EA
	MOV R7,#5
	ACALL Delay1ms
READ_NEXT1:
	MOV R0,#1                       ;读数据地址;R1为间地址寻址寄存器
	MOV R3,#0                       ;读数据总数;R2为数据缓存器
READ_DATA_AGAIN:
	CLR EA
	ACALL READ_24C02		;读高位
	SETB EA
	INC R0
	CJNE A,#I2cStop,READ_NEXT2	;判断是否是结束标志
	SJMP READ_EXIT
READ_NEXT2:
	MOV R2,A
	MOV A,#RINGDATAH
	ADD A,R3
	MOV R1,A
	MOV A,R2
	MOV @R1,A
	CLR EA
	ACALL READ_24C02		;读低位
	SETB EA
	INC R0
	MOV R2,A
	MOV A,#RINGDATAL
	ADD A,R3
	MOV R1,A
	MOV A,R2
	MOV @R1,A
	INC R3
	CJNE R3,#40,READ_DATA_AGAIN
READ_EXIT:
	MOV RingCount,R3		;更新报警数据个数
	RET
WRITE_DATA:;--------------------把内存中的数据写到24C02中去
        MOV R0,#0
	MOV R1,#I2cStart
	CLR EA
	ACALL WRITE_24C02		;写开始标志
	SETB EA
	MOV R7,#5
	ACALL Delay1ms
	INC R0
	MOV A,RingCount
	JZ WRITE_RETURN
	MOV R2,#0
WRITE_DATA_AGAIN:
	MOV A,#RINGDATAH
	ADD A,R2
	MOV R1,A
	MOV A,@R1
	MOV R1,A
	CLR EA
	ACALL WRITE_24C02		;写高位
        SETB EA
	INC R0
	MOV R7,#5
	ACALL Delay1ms
	MOV A,#RINGDATAL
	ADD A,R2
	MOV R1,A
	MOV A,@R1
	MOV R1,A
	CLR EA
	ACALL WRITE_24C02		;写低位
        SETB EA
	INC R0
	MOV R7,#5
	ACALL Delay1ms
	INC R2
	MOV A,R2
	CJNE A,RingCount,WRITE_DATA_AGAIN
WRITE_RETURN:
	MOV R1,#I2cStop
	CLR EA
	ACALL WRITE_24C02		;写结束标志
	SETB EA
	RET
;//-----------------End I2c Code---------------//
;--------------显示子程序-----------------------
;显示模式:
;   	0---------正常显示数据
;	1---------显示调试模式(0,1位闪烁)
;	2---------显示调试模式(2,3位闪烁)
;	3---------显示调试模式(4,5位闪烁)
;	4---------显示特殊字符模式
SHOW_NUMBER:                     ;段码
	DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
	DB 40H
SHOW_NULL:                       ;空码
	DB 00H,38H,38H,3EH,37H,00H
SHOW_BIT_CODE:                   ;位码
	DB 0DFH,0EFH,0F7H,0FBH,0FDH,0FEH
;------------------
DISPLAY:                         ;显示子程序
	MOV R1,#6
SHOW_AGAIN:
	MOV A,SHOW_MOUDE
	XRL A,#4
	JZ  SHOW_CHAR
	MOV A,R1
	ACALL GETCODE		 ;调用得到位数据子程序
	MOV DPTR,#SHOW_NUMBER
	MOVC A,@A+DPTR
	SJMP SHOW_TO_CODE
SHOW_CHAR:                       ;显示模式为4则显示字符NULL
	MOV DPTR,#SHOW_NULL
	MOV A,R1
	DEC A
	MOVC A,@A+DPTR
SHOW_TO_CODE:
	MOV SHOW_BIT,#0FFH;-------显示数据屏蔽
	MOV SHOW_CODE,A
	MOV A,R1
	MOV DPTR,#SHOW_BIT_CODE-1
	MOVC A,@A+DPTR
	MOV SHOW_BIT,A
	MOV R7,#1
	ACALL Delay1ms
	DJNZ R1,SHOW_AGAIN
	MOV SHOW_BIT,#0FFH;--------显示数据屏蔽
	RET
;---------------------------------------
Delay1ms:                 ;-----------延时1MS
	MOV R5,#2
DELAY:	MOV R6,#0
	DJNZ R6,$
	DJNZ R5,DELAY
	DJNZ R7,Delay1ms
	RET
;-----------------------------------------
GETCODE:;得到位数据子程序
	MOV B,#10
	DEC A
        RL A
	MOV DPTR,#FIND_BIT
	JMP @A+DPTR
FIND_BIT:;位散转
	SJMP SHOW_0
	SJMP SHOW_1
	SJMP SHOW_2
	SJMP SHOW_3
	SJMP SHOW_4
	SJMP SHOW_5
SHOW_0:					;得到位0数据
	MOV R0,SHOW_MOUDE
	CJNE R0,#1,SHOW_LED_0
	JB S_Flash,SHOW_LED_0
	MOV A,#10
	RET
SHOW_LED_0:
	MOV R0,SHOW_PC
	MOV A,@R0
	DIV AB
	MOV A,B
	RET
SHOW_1:					;得到位1数据
	MOV R0,SHOW_MOUDE
	CJNE R0,#1,SHOW_LED_1
	JB S_Flash,SHOW_LED_1
	MOV A,#10
	RET
SHOW_LED_1:
	MOV R0,SHOW_PC
	MOV A,@R0
	DIV AB
	RET
SHOW_2:					;得到位2数据
	MOV R0,SHOW_MOUDE
	CJNE R0,#2,SHOW_LED_2
	JB S_Flash,SHOW_LED_2
	MOV A,#10
	RET
SHOW_LED_2:
	MOV R0,SHOW_PC
	INC R0
	MOV A,@R0
	DIV AB
	MOV A,B
	RET
SHOW_3:					;得到位3数据
	MOV R0,SHOW_MOUDE
	CJNE R0,#2,SHOW_LED_3
	JB S_Flash,SHOW_LED_3
	MOV A,#10
	RET
SHOW_LED_3:
	MOV R0,SHOW_PC
	INC R0
	MOV A,@R0
	DIV AB
	RET
SHOW_4:					;得到位4数据
	MOV R0,SHOW_MOUDE
	CJNE R0,#3,SHOW_LED_4
	JB S_Flash,SHOW_LED_4
	MOV A,#10
	RET
SHOW_LED_4:
	MOV R0,SHOW_PC
	INC R0
	INC R0
	MOV A,@R0
	DIV AB
	MOV A,B
	RET
SHOW_5:					;得到位5数据
	MOV R0,SHOW_MOUDE
	CJNE R0,#3,SHOW_LED_5
	JB S_Flash,SHOW_LED_5
	MOV A,#10
	RET
SHOW_LED_5:
	MOV R0,SHOW_PC
	INC R0
	INC R0
	MOV A,@R0
	DIV AB
	RET
GETKEY:;扫描键盘得到键值子程序
	MOV A,P1
	CJNE A,#0FDH,GOTO_KEY2
	MOV A,#1
	RET
GOTO_KEY2:
	CJNE A,#0FEH,GOTO_KEY3
	MOV A,#2
	RET
GOTO_KEY3:
	CJNE A,#0FBH,GOTO_KEY4
	MOV A,#3
	RET
GOTO_KEY4:
	CJNE A,#0F7H,GOTO_KEY5
	MOV A,#4
	RET
GOTO_KEY5:
	CJNE A,#0EFH,GOTO_KEY6
	MOV A,#5
	RET
GOTO_KEY6:
	CJNE A,#0DFH,GOTO_KEY7
	MOV A,#6

⌨️ 快捷键说明

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