📄 text1.asm
字号:
;*********************************************************************;
;LIANG/2007/12/15;AT89C2051单片机;使用定时器T1;时钟12.0Mhz;
;太阳能路控制器程序;过热保护;过放保护;过充保护;保护自动恢复;
;正常模式(根据光线自动充/放控制 );
;定时模式(可选5/7/9/10小时定时充/放电控制);
;forA51 Build-to"solar hex";
;*********************************************************************;
;硬件资源定义
;太阳能光电板检测 Solartest-o 1 高 0 低
;过充检测 Ctest-o 1 大于14.4V 0 正常
;过放检测 Ftest-o 1 低于10.8V 0 正常
;过热检测 Ttest-o 1 大于40度 0 正常
;充电控制 Solar-d 1 导通 0 截至
;负载控制 F-d 1 导通 0 截至
;工作模式 mode 1 定时 0 正常
;定 时 00 5小时 01 7小时 10 9小时 11 10小时
;*********************************************************************;
;F_d p3.1
;Solar_d p3.7
;Solartest_o p3.2
;Ctest_o p3.3
;Ftest_o p3.4
;Ttest_o p3.5
;mode p1.4
;comp+ (Ctest) p1.0 |模拟比较器
;comp- (2.5V) p1.1 |模拟比较器
;放电指示 p1.5(长亮)
;充电指示 p1.7(长亮)
;定时指示 p1.6(频闪)
;过放指示 p1.5(闪烁-0.5s)
;过充指示 p1.7(闪烁-0.5s)
;*******************************预定义*******************************;
F_d bit p3.1
Solar_d bit p3.7
Solartest_o bit p3.2
Ctest_o bit p3.3
Ftest_o bit p3.4
Ttest_o bit p3.5
mode bit p1.4
Fdes bit p1.5
Cdes bit p1.7
Timerdes bit p1.6
;***************程序开始**************
org 0000h
ajmp main
org 0030h
main: mov p1,#0ffh ;置p1口;
clr F_d ;关灯;
setb Solar_d ;关充电-太阳能;
jb Solartest_o,out1 ;判Solartest_o是否为1跳转daytime(白天);
jmp night_time ;否则是night_time;
out1: ajmp daytime ;跳白天;
;*******************************夜间*************************;
night_time: acall del ;延时0.5s;
jb Solartest_o,u1 ;再次判断;
jmp u3 ;夜间;
u1: ajmp daytime ;白天;
u3: setb Cdes ;充电指示灭;
setb Solar_d ;关充电-太阳能;
light_on: setb F_d ;开灯;
clr Fdes ;放电指示亮;
jb mode,timer_f ;查询模式,定时模式,正常模式;
test: jb Solartest_o,out3 ;判断光线强度,白天-夜间;
ajmp protection1 ;跳到判断保护;
out3: ajmp daytime ;跳到白天;
protection1: jb Ftest_o,light_off ;过放保护关灯;
jb Ttest_o,light_off ;过热保护关灯;
ajmp test ;循环;
light_off: clr F_d ;关灯;
setb Fdes ;放电指示灭;
acall del ;延时0.5s;
clr Fdes ;放电指示亮;
mov c,Ftest_o ;过放是否恢复;
orl c,Ttest_o ;判过热是否恢复;
jnc light_on ;恢复开灯;
jb Solartest_o,daytime ;判断光线强度,白天-夜间;
ajmp light_off ;继续保护;
;***************定时放电**************;
timer_f: mov a,#00h ;清A;
mov c,p1.3 ;读p1.3的状态 p1.2 p1.3 定时值;
orl c,p1.2 ;1.2、1.3相或 两同为0 0 0 5小时;
jnc t5 ;为0跳转t5;
mov c,p1.3
anl c,p1.2 ;1.2、1.3相与 两同为1 1 1 10小时;
jc t10 ;为1跳转t10;
mov c,p1.2 ;读p1.2的状态 1 0 9小时;
jc t7 ;判p1.3是不是为1 0 1 7小时;
mov 33h,#9
jmp t_on
t5: mov 33h,#5
jmp t_on
t7: mov 33h,#7
jmp t_on
t10: mov 33h,#10
;*****************************读定时值***********************;
t_on: mov r1,#60 ;软件定时;
mov r2,#60 ;软件定时;
mov r3,#20 ;软件定时;
mov tmod,#10h ;定时器T1方式1;
mov th1,#03ch ;50MS定时初值;
mov tl1,#0b0h ;50MS定时初值;
mov ie, #00h ;禁止中断;
setb tr1 ;启动定时器T1;
loop: jbc tf1,loop1 ;T1溢出查询;
clr Timerdes ;定时指示亮;
ajmp loop ;定时未到;
loop1: setb Timerdes ;定时指示灭;
jb Ftest_o,of1 ;过放保护关灯;
jb Ttest_o,of1 ;过热保护关灯;
jmp chongzhuang ;跳重装;
of1: acall light_of ;关灯;
chongzhuang: mov th1,#03ch ;重载定时初值;
mov tl1,#0b0h ;重载定时初值;
jnb mode,test ;查询模式,定时模式,正常模式;
djnz r3,loop ;r3内容减1不为0跳loop,执行20次,即1000ms;
mov r3,#20 ;软件定时;
djnz r2,loop ;r2内容减1不为0跳loop,执行60次,即1min;
mov r2,#60 ;软件定时;
djnz r1,loop ;r1内容减1不为0跳loop,执行60次,即1小时;
mov r1,#60 ;软件定时;
inc a ;a的内容加1;
cjne a,33h,t_on ;a和33h的内容比较不相等跳t_on;
clr F_d ;定时到关灯;
wait_d: jb Solartest_o,daytime ;判断光线强度,白天-夜间;
ajmp wait_d ;等待;
;***************************定时到关灯************************;
;******************************白天***************************;
daytime: acall del ;延时0.5s;
jnb Solartest_o,u2 ;再次判断;
jmp u4 ;白天;
u2: ajmp night_time ;夜间;
u4: setb Fdes ;放电指示灭;
clr Cdes ;充电指示亮;
clr F_d ;关灯;
on_c: clr Solar_d ;开solar-d;
solartest2: jb mode,timer_c ;查询模式,定时模式;
jnb Solartest_o,out ;判断光线强度,白天-夜间;
jmp protection2
out: ajmp night_time
protection2: jb Ctest_o,stop_c ;过充保护;
jb Ttest_o,stop_c ;过热保护;
jb p3.6,stop_c ;模拟检测过充保护;
ajmp solartest2 ;继续判断光线强度,白天-夜间;
stop_c: clr Solar_d ;关充电;
setb Cdes ;充电指示灭;
acall del ;延时0.5s;
clr Cdes ;充电指示亮;
mov c,Ctest_o ;过充是否恢复;
orl c,Ttest_o ;判过热是否恢复;
orl c,p3.6 ;判模拟检测是否恢复;
jnc on_c ;恢复充电;
jnb Solartest_o,out ;判断光线强度,白天-夜间;
ajmp stop_c ;继续保护;
;***************定时充电***************;
timer_c: mov a,#00h ;清A;
mov c,p1.3 ;读p1.3的状态 p1.2 p1.3 定时值;
orl c,p1.2 ;1.2、1.3相或 两同为0 0 0 5小时;
jnc t5_c ;为0跳转t5
anl c,p1.2 ;1.2、1.3相与 两同为1 1 1 10小时;
jc t10_c ;为1跳转t10
mov c,p1.3 ;读p1.3的状态 1 0 9小时;
jc t7_c ;判p1.3是不是为1 0 1 7小时;
mov 33h,#9
jmp t_on_c
t5_c: mov 33h,#5
jmp t_on_c
t7_c: mov 33h,#7
jmp t_on_c
t10_c: mov 33h,#10
;*****************************读定时值***********************;
t_on_c: mov r1,#60 ;软件定时;
mov r2,#60 ;软件定时;
mov r3,#20 ;软件定时;
mov tmod,#10h ;定时器T1方式1;
mov th1,#03ch ;50MS定时初值;
mov tl1,#0b0h ;50MS定时初值;
mov ie, #00h ;禁止中断;
setb tr1 ;启动定时器T1;
loop_c: jbc tf1,loop1_c ;T1溢出查询;
clr Timerdes ;延时指示亮;
ajmp loop_c ;T1溢出查询;
loop1_c: setb Timerdes ;延时指示灭;
jb Ctest_o,tc ;过充保护断电;
jb Ttest_o,tc ;过热保护断电;
jb p3.6,tc ;模拟检测过充保护;
ajmp chongzhuang1 ;重载;
tc: acall stop_c_t ;停充电;
chongzhuang1: mov th1,#03ch ;重载定时初值;
mov tl1,#0b0h ;重载定时初值;
jnb mode,v2 ;查询模式,定时模式,正常模式;
ajmp v1
v2: ajmp solartest2
v1: djnz r3,loop_c ;r3内容减1不为0跳loop_c,执行20次,即1000MS;
mov r3,#20 ;软件定时;
v3: djnz r2,loop_c ;r2内容减1不为0跳loop_c,执行60次,即1min;
mov r2,#60 ;软件定时;
djnz r1,loop_c ;r1内容减1不为0跳loop_c,执行60次,即1sec;
mov r1,#60 ;软件定时;
v5: inc a ;a的内容加1;
cjne a,33h,t_on_c ;a和33h的内容比较不相等跳t_on_c;
clr Solar_d ;定时到停充电;
wait_n: jnb Solartest_o,out2 ;判断光线强度,白天-夜间;
ajmp wait_n
out2: ajmp night_time ;继续判断光线强度,白天-夜间;
;***************************定时到停充电******************************;
;*************************定时放电模式保护恢复************************;
light_of: clr F_d ;关灯;
setb Fdes ;放电指示灭;
setb Timerdes ;定时指示灭;
mov c,Ttest_o ;过放是否恢复;
orl c,Ftest_o ;判过热是否恢复;
jnc on1 ;恢复开灯;
ajmp return ;返回;
on1: setb F_d ;开灯;
clr Fdes ;放电指示亮;
return: ret ;返回;
;*************************定时充电模式保护恢复************************;
stop_c_t: clr Solar_d ;关充电;
setb Timerdes ;定时指示灭;
setb Cdes ;充电指示亮;
mov c,Ttest_o ;过充是否恢复;
orl c,Ftest_o ;判过热是否恢复;
jnc on_c_t ;恢复充电;
ajmp return1 ;返回;
on_c_t: setb Solar_d ;恢复充电;
clr Cdes ;充电指示亮;
return1: ret ;返回;
;******************************返回**********************************;
;*****************************延时0.5s*******************************;
del: mov r5,#02h
dely1: mov r6,#0ffh
dely2: mov r7,#0ffh
dely3: djnz r7,dely3
djnz r6,dely2
djnz r5,dely1
ret
;******************************返回**********************************;
end
;***************程序结束****************
;****************附C*****************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -