📄 uvi_4245 nov 08 08.dt
字号:
MOV A,@0X0C
MOV PORTC,A
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&一般寄存器初始化
MOV A,@0X55 ;掉电检测
XOR A,POWERTEST1
JBS STATUS,Z
LJMP CLR_RAM
MOV A,@0XAA
XOR A,POWERTEST2
JBS STATUS,Z
LJMP CLR_RAM
; MOV A,@0X18 ;test power on T=1,P=1
; AND A,STATUS
; XOR A,@0X18
; JBS STATUS,Z
LJMP MAIN1
CLR_RAM: ;清除SRAM
BANK 0
MOV A,@0XFF
MOV R4,A
CLR_RAM1:
BANK 0
CLR R0
DEC R4
MOV A,@0XCF
SUB A,R4
JBC STATUS,C
LJMP CLR_RAM1
MOV A,@0X55
MOV POWERTEST1,A
MOV A,@0XAA
MOV POWERTEST2,A
MOV A,@0X01
MOV MONTH,A
MOV DAY,A
MOV A,@0X0C
MOV HOUR,A ;初始上电显示中午12点
MOV HOUR_12,A
;=============================================================================主程序
MAIN1:
BANK 0
MOV A,@0X81
MOV IMR,A
BANK 1
MOV A,@0XC0
MOV EIMR,A ;允许SET,UV按键中断
ENI
MAIN:
BANK 1
MOV A,@0XC0
MOV EIMR,A
BANK 0
BS FLAG2,SET_MODE_FLAG
MOV A,@0X81
MOV IMR,A
BANK 0
JBC PRST,FTBAT ;电池电压不足标志
LCALL POWER_TEST ;检查电池
BANK 0
JBC PRST,FUV
LCALL UV_TEST ;UV长按标志 测试UV
BANK 0
JBC PRST,FDEM
LCALL D_TIME_MODE
BANK 0
JBC FLAG1,UV_SHORT
LCALL UV_SHORT_M ;UV短按标志 显示UV和相应倒计时时间
BANK 0
JBC FLAG2,SET_LONG
LCALL D_TIME_SET
BANK 0
JBC PRST,FSET
LCALL TIME_SET ;SET标志,设置时间或调整12/24小时制
JBC PRST,FDEM
LJMP MAIN
JBC PRST,FUV
LJMP MAIN
BANK 0
LCALL TIME_DISPLAY ;显示时间
BANK 0
JBS PORTB,UV
LJMP MAIN
MOV KEY_TIME,KEY_TIME
JBS STATUS,Z
LJMP MAIN
JBS PORTB,SET
LJMP MAIN
;=========================================================================POWER_DOWN IDLE模式
POWER_DOWN:
BANK 3
MOV A,@0X00
MOV ADCR,A
MOV ADICH,A
MOV ADICL,A ;关AD
BANK 4
MOV A,@0X04
MOV IOC7,A
MOV A,@0XA2
MOV IOC8,A
MOV A,@0X09
MOV IOC9,A ;P90,P93 2.5V,VS
MOV A,@0X00
MOV IOCA,A
MOV A,@0X0C
MOV IOCB,A
MOV A,@0X0C
MOV IOCC,A
BANK 5
MOV A,@0X04
MOV P7PHCR,A ;PULL HIGH
MOV A,@0X0C
MOV PBPHCR,A
MOV A,@0X00
MOV PCPHCR,A
MOV A,@0X00
MOV P8PHCR,A
MOV A,@0X00
MOV P9PHCR,A
MOV PAPHCR,A ;设置上拉
BANK 0
MOV A,@0X04
MOV PORT7,A
MOV A,@0XE2
MOV PORT8,A ;关闭uvi检测
MOV A,@0X09
MOV PORT9,A
MOV A,@0X00
MOV PORTA,A
MOV A,@0X0C
MOV PORTB,A
MOV A,@0X80
MOV IMR,A ;使能T1,TCC中断(0.5s,50ms)
BANK 1
MOV A,@0XC0
MOV EIMR,A ;允许SET,UV按键中断
BANK 4
MOV A,@0XC0
MOV WKCR,A ;允许SET,UV唤醒
BANK 0
BS SCCR,IDLE ;IDLE模式
ENI
SLEP
NOP
NOP
NOP
NOP
WAKE_UP:
LJMP MAIN
;========================================================POWER_TEST电压检测
POWER_TEST:
BANK 4
BC IOC8,POWER
BANK 0
MOV A,@0XA2
MOV PORT8,A ;P86=0 开启UV测试电路
BC PRST,FTBAT
BANK 3
MOV A,@0X00
MOV ADICH,A
MOV A,@0X08 ;AD3,2.5V检测
MOV ADICL,A
POWER_TEST1:
MOV A,@0X73 ;FC/64
MOV ADCR,A
BS ADCR,ADRUN
POWER_TEST1A:
JBC ADCR,ADRUN
LJMP POWER_TEST1A
NOP
NOP
NOP
BS ADCR,ADRUN
POWER_TEST1A1:
JBC ADCR,ADRUN
LJMP POWER_TEST1A1
POWER_TEST1B:
MOV A,ADDH
BANK 0
MOV TEMP1,A ;读取结果高8位
POWER_TEST2:
JBC PRST,FBAT
LJMP POWER_TEST2B ;电量不足
POWER_TEST2A:
MOV A,@0XF5 ;2.5/2.6*255=245
SUB A,TEMP1
JBC STATUS,C
BS PRST,FBAT ;大于245表示电池电压不足2.6V
LJMP POWER_RET
POWER_TEST2B:
MOV A,@0XF1 ;2.5/2.63*255=242
SUB A,TEMP1
JBS STATUS,C
BC PRST,FBAT ;小于242表示电池电压大于2.63V
POWER_RET:
MOV A,@0XE2
MOV PORT8,A
RET
;==========================================================UVI AND D_TIME 倒计时和UVI显示
UV_SHORT_M:
BANK 1
MOV A,@0X00
MOV EIMR,A
BANK 0
BC FLAG2,SET_MODE_FLAG
MOV A,@0X64
MOV SHORT_COUNT,A
UV_SHORT_DIS:
BANK 0
CLR FLAG
JBC PRST,FSEC
LJMP UV_SHORT_DIS_ON
UV_SHORT_DIS_OFF:
MOV A,@0X0A
MOV DIS1,A
MOV DIS2,A
MOV DIS3,A
MOV DIS4,A
LJMP UV_SHORT_DIS_OUT
UV_SHORT_DIS_ON:
BC FLAG,FDDIS
BS FLAG,FDOTDIS
MOV A,@0X0A
MOV DIS4,A
CLR DIS1
CLR DIS2
CLR DIS3
MOV A,UVIMAX
MOV TEMP1,A
UV_SHORT_DIS1:
MOV A,@0X64
SUB A,TEMP1
JBS STATUS,C
LJMP UV_SHORT_DIS2
MOV TEMP1,A
INC DIS1
LJMP UV_SHORT_DIS1
UV_SHORT_DIS2:
MOV A,@0X0A
SUB A,TEMP1
JBS STATUS,C
LJMP UV_SHORT_DIS3
MOV TEMP1,A
INC DIS2
LJMP UV_SHORT_DIS2
UV_SHORT_DIS3:
MOV A,TEMP1
MOV DIS3,A
MOV A,@0X01
SUB A,DIS1
JBC STATUS,C
LJMP UV_SHORT_DIS_OUT
MOV A,@0X0A
MOV DIS1,A
UV_SHORT_DIS_OUT:
BANK 0
LCALL SEG_COM
LCALL COM_RAM
WAIT1:
BANK 0
JBS PRST,F50MS
LJMP WAIT1
BC PRST,F50MS
DJZ SHORT_COUNT
LJMP UV_SHORT_DIS
BC FLAG2,SET_LONG
BC FLAG2,SET_SHORT
BC FLAG1,UV_SHORT
BC PRST,FUV
BC PRST,FSET
BS PRST,FDEM
RET
;==========================================================UV_TEST 紫外线测试
UV_TEST:
BANK 4
BC IOC8,POWER
BANK 1
MOV A,@0X00
MOV EIMR,A ;禁止SET,UV按键中断
BANK 0
MOV A,@0XA2
MOV PORT8,A ;P86=0 开启UV测试电路
MOV A,@0X81
MOV IMR,A ;ENBALE T1 AND TCC中断
BC PRST,FSET
BC PRST,FUV
BC FLAG1,UV_SHORT
BC PRST,F50MS
BS PRST,FAN
CLR UVIMAX
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
UV_TEST0:
MOV A,@0X3C
MOV T_COUNT,A ;0.5S*60=30S
BANK 3
MOV A,@0X00
MOV ADICH,A
MOV A,@0X59
MOV ADICL,A ;AD0,3,4,6
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
UV_TEST1:
BANK 0
MOV A,@0X0A ;0.05S*10=0.5S
MOV T10SEC,A
CLR FLAG
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&传感器电压AD转换VS*20
UV_TEST31:
BANK 3
MOV A,@0X70
MOV ADCR,A ;AD0 VS
BS ADCR,ADRUN
WAIT2:
JBC ADCR,ADRUN
LJMP WAIT2 ;先启动一次
BANK 3
MOV A,ADDH
MOV A,ADDL
BANK 0
CLR VSL
CLR VSH
MOV A,@0X14
MOV AD_COUNT,A ;AD转换20次
UV_TEST31A:
BANK 3
BS ADCR,ADRUN
WAIT3:
JBC ADCR,ADRUN
LJMP WAIT3
BANK 3
MOV A,ADDH
BANK 0
MOV TEMP1,A ;读取高8位
BANK 3
MOV A,ADDL
AND A,@0X0F
BANK 0
MOV TEMP2,A ;读取低4位
SWAPA TEMP1
MOV TEMP1,A
AND A,@0XF0
OR TEMP2,A ;AD低8位
MOV A,@0X0F
AND TEMP1,A ;AD高4位
MOV A,TEMP2 ;VS1=VS1+VS低位
ADD VSL,A
JBC STATUS,C
INC VSH ;进位
MOV A,TEMP1
ADD VSH,A
DJZ AD_COUNT
LJMP UV_TEST31A
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&传感器偏置电压AD VB VOUT*20 AD6
UV_TEST32:
BANK 3
MOV A,@0X76
MOV ADCR,A
BS ADCR,ADRUN
WAIT4:
JBC ADCR,ADRUN
LJMP WAIT4 ;先启动一次
BANK 3
MOV A,ADDH
MOV A,ADDL
BANK 0
CLR VBL
CLR VBH
MOV A,@0X14
MOV AD_COUNT,A ;AD转化20次
UV_TEST32A:
BANK 3
BS ADCR,ADRUN
WAIT5:
JBC ADCR,ADRUN
LJMP WAIT5
BANK 3
MOV A,ADDH
BANK 0
MOV TEMP1,A
BANK 3
MOV A,ADDL
AND A,@0X0F
BANK 0
MOV TEMP2,A
SWAPA TEMP1
MOV TEMP1,A
AND A,@0XF0
OR TEMP2,A
MOV A,@0X0F
AND TEMP1,A
MOV A,TEMP2
ADD VBL,A
JBC STATUS,C
INC VBH
MOV A,TEMP1
ADD VBH,A
DJZ AD_COUNT
LJMP UV_TEST32A
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&两检测电压差值VS=(VS-VB)*12
UV_TEST33:
BANK 0
MOV A,VBL
SUB VSL,A
JBS STATUS,C
INC VBH ;有借位
MOV A,VBH
SUB VSH,A
JBS STATUS,C
CLR VSH ;VS<VB VS=0
JBS STATUS,C
CLR VSL
UV_TEST33A:
MOV A,@0X0C
MOV AD_COUNT,A ;VS=VS*12
MOV A,VSL
MOV VBL,A
MOV A,VSH
MOV VBH,A
CLR VSL
CLR VSH
UV_TEST33B:
MOV A,VBL
ADD VSL,A
JBC STATUS,C
INC VSH
MOV A,VBH
ADD VSH,A
DJZ AD_COUNT
LJMP UV_TEST33B
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&计算UVI值(扩大10倍)
UV_TEST34:
BANK 0
CLR UVI
MOV A,@0X60 ;3(mv/uvi)/3000*4096*20*12=983.4因为UV传感器的灵敏度逐渐增大所以除数逐渐增大近似认为100 0-5 0.3uvi 5-10 0.5uvi 10以上误差较大
MOV VBL,A
MOV A,@0X00
MOV VBH,A
UV_TEST34A:
MOV A,VBL
SUB VSL,A
JBC STATUS,C
LJMP UV_TEST34B
MOV A,@0X01 ;有借位vsl<vbl
SUB VSH,A
JBS STATUS,C
LJMP UV_TEST34E ;有借位vsH=0
UV_TEST34B:
MOV A,VBH
SUB VSH,A
JBS STATUS,C
LJMP UV_TEST34E
UV_TEST34D:
INC UVI
MOV A,@0X01
ADD VBL,A
JBC STATUS,C
INC VBH ;增大除数VB
MOV A,@0XFC ;254
SUB A,UVI
JBS STATUS,C
LJMP UV_TEST34A
UV_TEST34E:
NOP
NOP
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&UV_TEST4校正UVI 电源校正2.5V AD转换AD3
UV_TEST41:
BANK 3
MOV A,@0X73
MOV ADCR,A
BS ADCR,ADRUN
WAIT6:
JBC ADCR,ADRUN
LJMP WAIT6
BANK 3
MOV A,ADDH
MOV A,ADDL
UV_TEST41A:
BANK 3
BS ADCR,ADRUN
WAIT7:
JBC ADCR,ADRUN
LJMP WAIT7
BANK 3
MOV A,ADDH
BANK 0
MOV TEMP1,A
MOV A,@0XB6 ;2.5V AD结果TEMP1
SUB A,TEMP1
JBC STATUS,C
LJMP UV_TEST42
MOV A,@0XB6
MOV TEMP1,A
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&UVI校正 UVI1=UVI*213/TEMP1
UV_TEST42:
BANK 0
CLR VSL
CLR VSH
MOV A,@0XD5 ;2.5/3*255=213=0XD5
MOV AD_COUNT,A
UV_TEST42A:
MOV A,UVI
ADD VSL,A
JBC STATUS,C
INC VSH
DJZ AD_COUNT ;电源校正VS=UVI*213
LJMP UV_TEST42A
CLR UVI
UV_TEST42B: ;UVI1=UVI*213/TEMP1(校正)
MOV A,TEMP1
SUB VSL,A
JBC STATUS,C
LJMP UV_TEST42C
MOV A,@0X01 ;借位
SUB VSH,A
JBS STATUS,C
LJMP UV_TEST42D
UV_TEST42C:
INC UVI
MOV A,@0XFC ;254
SUB A,UVI
JBS STATUS,C
LJMP UV_TEST42B
UV_TEST42D:
NOP
NOP
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&VR调节放大系数0.8-1.43 80+(0-255)/4
UV_TEST51: ;VR AD转换
BANK 3
MOV A,@0X74
MOV ADCR,A
BS ADCR,ADRUN
WAIT8:
JBC ADCR,ADRUN
LJMP WAIT8 ;先启动一次
BANK 3
MOV A,ADDH
NOP
NOP
NOP
BANK 3
BS ADCR,ADRUN
WAIT9:
JBC ADCR,ADRUN
LJMP WAIT9
BANK 3
MOV A,ADDH
BANK 0
MOV TEMP1,A
CLR VBL
UV_TEST51A:
MOV A,@0X04
SUB TEMP1,A
JBS STATUS,C
LJMP UV_TEST51B
INC VBL ;VBL=VR/4
LJMP UV_TEST51A
UV_TEST51B:
MOV A,@0X50
ADD VBL,A ;80+VR/4
CLR VSL
CLR VSH
UV_TEST51C:
MOV A,UVI ;VS=UVI*(80+VR/4)
ADD VSL,A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -