新闻  |   论坛  |   博客  |   在线研讨会
采用AT89C2051的数字可调稳压电源单片机源程序
tvb2058 | 2007-09-14 15:02:56    阅读:2506   发布文章

 

ORG 0000H          ;定位
       LJMP MAIN         ;跳转到MAIN主程序
       ;
       ORG 0003H          ;
定位
       LJMP IT_0           ;转入INT0的中断服务程序
       ;
       ORG 000BH          ;
定位
       LJMP IT_1           ;转入INT0的中断服务程序
       ;
       ORG 0100H          ;
定位
MAIN:  MOV R6,#32H        ;将50送R6
       ANL P3,#4FH         ;将P3.4、P3.5、P3.7置为0,使输出电压为
0.0V
       MOV P1,#0FFH       ;将0FFH送
P1 
       SETB P3.0           ;将P3.0置
1
       CLR P3.1            ;将P3.1置
0
       MOV R2,#0CH        ;将0CH送
R2
       LCALL DELAY       ;调用DELAY延时子程序

       SETB P3.1           ;将P3.1置1
       CLR P3.0            ;将P3.0置
0
       MOV R2,#0CH       ;将0CH送
R2
       LCALL DELAY       ;调用DELAY延时子程序

       DJNZ R6,MAIN       ;若R6-1不等于0,跳转到MAIN
       MOV P1,#00H        ;将00H送
P1
       MOV R2,#25H        ;延时
1S
       LCALL DELAY       ;调用DELAY延时子程序

       SETB EX0            ;开INT0中断
       SETB EX1            ;INT1中断
       SETB EA             ;开CPU中断
       SETB IT0             ;将INT0设为负边沿触发
       SETB IT1             ;将INT0设为负边沿触发
       MOV R7,#00H        ;将00H送R7
LOOP:    MOV A,R7           ;将R7值送
A
       MOV DPTR,#TABLE0  ;将TABLE0地址送
DPTR
       MOVC A,@A+DPTR   ;查表,将查到的值送
A
       ANL P3,A            ;将A值与P3值相与,结果送
P3
       MOV DPTR,#TABLE1  ;将TABLE1地址送
DPTR
       MOVC A,@A+DPTR   ;查表,将查到的值送
A
       ORL P3,A            ;将A值与P3值相或,结果送
P3
       MOV DPTR,#TABLE2  ;将TABLE2地址送
DPTR
MOVC A,@A+DPTR   ;查表,将查到的值送
A
       MOV P1,A            ;将A值送
P1
       SETB P3.0            ;将P3.0置
1
       CLR P3.1             ;将P3.1置
0
       MOV R2,#0CH        ;将0CH送
R2
       LCALL DELAY        ;调用DELAY延时子程序

       MOV DPTR,#TABLE3  ;将TABLE3地址送DPTR
       MOVC A,@A+DPTR   ;查表,将查到的值送
A
       MOV P1,A            ;将A值送
P1
       SETB P3.1            ;将P3.1置
1
       CLR P3.0             ;将P3.0置
0
       MOV R2,#0CH        ;将0CH送
R2 
       LCALL DELAY       ;调用DELAY延时子程序

       SJMP LOOP          ;跳转到LOOP循环
       ;
       ORG 0200H           ;
定位
IT_0:  MOV R2,#14H         ;将14H置送R2
       LCALL DELAY        ;调用DELAY延时子程序(延时约为57ms)

       JB P3.2,EXIT0         ;若INT0(P3.2)为1,说明为干扰信号,退出
       INC R7               ;若INT0(P3.2)为0,将R7加1
       CJNE R7,#07H,EXIT0   ;当R7值不为7时,跳转到
EXIT0
       MOV R7,#00H         ;当R7值为7时,令R7等于
0
EXIT0: RETI                 ;INT0中断返回

       ;
IT_1:  MOV R2,#14H         ;
将14H置送R2
       LCALL DELAY        ;调用DELAY延时子程序(延时约为57ms)

       JB P3.3,EXIT1         ;若INT1(P3.3)为1,说明为干扰信号,退出
       DEC R7               ;若INT0(P3.3)为0,将R7减1
       CJNE R7,#0FFH,EXIT1  ;当R7值不为0FFH时,跳转到
EXIT1
       MOV R7,#06H         ;当R7值为0FFH时,令R7等于
6
EXIT1: RETI                 ;INT1中断返回

       ;
TABLE0:DB 4FH,4FH,4FH,4FH,4FH,4FH,4FH,4FH     ;
控制信号
TABLE1:DB 00H,10H,20H,30H,80H,90H,0A0H,0B0H   ;控制信号
TABLE2:DB 0CFH,0E6H,0EDH,0FDH,0EFH,03H       ;第一数码管位显示信号
TABLE3:DB 3FH,6DH,3FH,3FH,3FH,5BH             ;第二数码管位显示信号
     
;
以下为通用延时子程序
;当R2=0CH时,延时约为10ms;当R2=14H时,延时约为57ms
DELAY:PUSH 02H                                ;将R2中的值推入堆笺
    
LP1:   PUSH 02H                                ;将R2中的值推入堆笺
   
LP2:   PUSH 02H                                ;将R2中的值推入堆笺
   
LP3:   DJNZ R2,LP3                             ;若R2-1不为0,跳转到
LP3
 POP 02H                                 ;将堆笺中值弹出到R2中

       DJNZ R2,LP2                             ;若R2-1不为0,跳转到LP2
       POP 02H                                 ;将堆笺中值弹出到R2中

       DJNZ R2,LP1                             ;若R2-1不为0,跳转到LP1
       POP 02H                                 ;将堆笺中值弹出到R2中

       DJNZ R2,DELAY                          ;若R2-1不为0,跳转到DELAY
       RET                                     ;子程序返回

END                                    ;结束
主程序MAIN中,从MOV P1,#0FFH到SETB EX0的前一行,其作用是刚开机时,让数码管显示全笔段,然后熄灭,以便于检查数码管的好坏,并做好准备。在初始化程序中,令IT0和IT1为1,是让INT0和INT1变为负边沿触发,以达到每按一次S1或S2(无论时间长短,当然时间必须超过57ms),输出电压和数码管改变一次。在LOOP循环中,先对P3相与后相或的目的是要将P3.4,P3.5,P3.7先清零后置位,相当于这一段代码就是一个简单的与或逻辑电路,具体操作情况读者可参照电路图自行分析。另外,主程序中的R7用于存放预设电压的序号,其值在0~6之间变化,每一个值对应一个电压值,依次为0—0.0V,1—3.0V,2—4.5V,3—5.0V,4—6.0V,5—9.0V,6—12V的电压。由于经常用的都是这些电压,所以上面几个电压对电子制作者来说已经足够了。TABLE0中存放控制信号,TABLE1中存放第一个数码管的字显示信号,TABLE2中存放第二个数码管的字显示信号。当按S1时,输出电压就按照上述电压依次增加;当按S2时,输出电压就依次减少。若此时电压为0.0V,再按S2就会使输出电压变为12V;反之,若此时电压为12V,再按S1就会使输出电压变为0.0V。

 

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客