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

📄 text1.asm

📁 太阳能路灯控制 太阳能路灯控制
💻 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 + -