Board logo

标题: 三位数码管显示PWM控制稳压电源 [打印本页]

作者: 13013963877    时间: 2009-4-14 09:50     标题: 三位数码管显示PWM控制稳压电源

本帖最后由 13013963877 于 2011-5-22 11:38 编辑

;*****************************************************************
; PWM 控制10v内可调电源程序输出电压你可以设定要修改电压转换程序  *                              *
; 不得用于商业用途                                               *
; 晶振为12MHZ  3位数码管显示 步进电压0.039V 254级                *
; 利用定时器控制产生占空比可变的 PWM 波                          *
; 按K1,PWM值增加,则占空比减小                                  *
; 按K2,PWM值减小,则占空比增加                                  *
;*****************************************************************
;定义各存储器单元-----------------------
        
         OUT   EQU  P2.0        ;PWM输出
         ZX    EQU  P0          ;显示口
         SMG   EQU  P2.5        ;个位
         SMS   EQU  P2.6        ;十位
         SMB   EQU  P2.7        ;百位
         INCKEY EQU  P1.0       ;K1,PWM值增加键
         DECKEY EQU  P1.7       ;K2,PWM值减小键。
         PWM    EQU  2FH         ;PWM存储器
         ;30H-34H                UDAT计算用
         DP1    EQU  35H        ;显示缓冲器
         DP2    EQU  36H        ;
         DP3    EQU  37H        ;
         ;39H 3AH 3BH         
;-----------------------
         ORG   0000H
         SJMP  START
         ORG   000BH
         AJMP  INTT0
         ORG   001BH
         AJMP  INTT1
         ORG   0030H
;-----------------------
;主程序
;定时器0工作在模式1,定时器1工作在模式2。
;初始化--------------------
START:
          MOV  SP,#50H
          MOV ZX,#00H
          MOV P1,#0FFH
          MOV P2,#0FFH
          MOV P3,#0FFH
          MOV TMOD,#21H
          MOV PWM,#0FFH            ;初始输出电压最低
          MOV TH1,PWM              ;脉宽调节
          MOV TL1,#00H
          MOV TH0,#0FFH            ;延时常数
          MOV TL0,#00H             ;频率调节3921HZ
          MOV R1,#11
          MOV R0,#30H              ;清各单元
QW:       MOV @R0,#00H
          INC R0
          DJNZ R1,QW
          SETB EA
          SETB ET0                 ;开T0中断
          SETB ET1                 ;开T1中断
          SETB TR0                 ;启动T0控制T1启动
;主程序--PWM值在1-255之间-------------------------------------
LOOP:     ACALL UDAT         ;调电压转换程序
          ACALL DISP         ;调显示程序
          MOV A,PWM          ;脉宽调节
          JB INCKEY,LOOP1    ;增加键是否按下
          CALL DELAY         ;延时去抖动
          JB INCKEY,LOOP1    ;有键盘按下转
          CJNE A,#0FFH,PWMINC;最大值没到继续加到0FFH
         
          SJMP LOOP
;调节脉宽(脉宽小于最大值需要加)
PWMINC:
          INC PWM                  ;调节脉宽(脉宽减小)
          SJMP LOOP                ;跳到主程序
;再次判断键盘
LOOP1:    JB DECKEY,LOOP2          ;减小键是否按下?PWM值减小键
          CALL DELAY               ;延时去抖动
          JB DECKEY,LOOP2          ;K2,PWM值减小键
          CJNE A,#01H,PWMDEC       ;是否到最小值?没到可以减到2
      
          SJMP LOOP
;调节脉宽(脉宽大于最大值需要减小)
PWMDEC:
          DEC PWM                  ;调节脉宽(脉宽增加)
LOOP2:    SJMP LOOP                ;跳到主程序
;主程序----------------到此结束---
;---------------------------------------------------
;T0中断服务子程序   (频率)
;控制定时器1中断T0 ,把脉宽值送T1高8位,启动T1定时
;并且启动输出T0控制T1 PWM时数启动
;输出口启动先是高电平开始-------------------
INTT0:
          CLR  TR1
          MOV TH0,#0FFH            ;延时常数
          MOV TL0,#00H             ;频率调节3921HZ
          MOV  TH1,PWM          ;PWM调整值送T1
          SETB TR1              ;启动T1
          CLR OUT         ;启动 输出
          RETI
;-----------------------------
;T1中断服务子程序(脉宽)TH1始终是+1值到0FFH溢出,中断
;控制PWM脉冲宽度T1定时的值就是脉宽值,T1中断时说明持续的脉宽够
;脉宽够时关断输出为高电平-------
INTT1:    ;因为定时器1工作在模式2不需要重装数据
          CLR  TR1         ;脉宽调节结束
          SETB  OUT        ;结束输出
          RETI
;电压转换,计算,送显示数----------------
;电压转换程序,精确到0.039V
UDAT:    MOV B,#39
         MOV A,PWM
         CPL A            ;取反因为输出已反向
         MUL AB
         MOV 30H,A
         MOV 31H,B
;双字节十六进制整数转换成双字节BCD码整数
;入口条件:待转换的双字节十六进制整数在31H,30H中。
;出口信息:转换后的三字节BCD码整数在3BH,3AH,39H中。
HB2: CLR A ;BCD码初始化
MOV 3BH,A
MOV 3AH,A
MOV 39H,A
MOV R2,#10H ;转换双字节十六进制整数
HB3: MOV A,30H ;从高端移出待转换数的一位到CY中
RLC A
MOV 30H,A
MOV A,31H
RLC A
MOV 31H,A
MOV A,39H ;BCD码带进位自身相加,相当于乘2
ADDC A,39H
DA A ;十进制调整
MOV 39H,A
MOV A,3AH
ADDC A,3AH
DA A
MOV 3AH,A
MOV A,3BH
ADDC A,3BH
MOV 3BH,A ;双字节十六进制数的万位数不超过6,不用调整
DJNZ R2,HB3 ;处理完16bit
        MOV A,39H       ;取小数点后2.3位
        ANL A,#0FH      ;取低4位
        CLR C
        SUBB A,#5       ;4舍5入
        JC  HB4         ;够5加1
        MOV A,39H
        ANL A,#0F0H     ;取高4位
        SWAP A          ;高低字节交换
        INC A           ;加1
        MOV DP1,A        ;存入显示缓冲器1位
HB4:    MOV A,39H        ;不够直接存入
        ANL A,#0F0H
        SWAP A
        MOV DP1,A        
        MOV A,3AH        ;取整数及小数点后1位
        ANL A,#0FH       ;取低4位小数点后1位
        MOV DP2,A        ;存入显示缓冲器2位
        MOV A,3AH
        ANL A,#0F0H      ;取整数高4位
        SWAP A
        MOV DP3,A        ;存入显示缓冲器3位
RET  
      
;延时子程序延时去抖动这里调显示4次
;-----------------------
DELAY:
          MOV R7,#4
DELAY1:   ACALL DISP
          DJNZ R7,DELAY1
          RET
;延时子程序------------------------------------
T1MS:   MOV R5,#00H  
TT:     MOV R6,#9
        DJNZ R6,$
DJNZ R5,TT
RET
;显示子程序------------------------------------
DISP:SETB SMG           ;关各位选
    SETB SMS
    SETB SMB
    MOV ZX,#00H         ;关数据显示口
    MOV  DPTR,#DISPTAB  ;送查表地址
    MOV  A,DP1          ;取要显示数
    MOVC A,@A+DPTR      ;查表
    CPL A               ;数据表为阳码取反为阴码去掉以下相同
    MOV  ZX,A           ;显示输出
    CLR  SMG            ;选择个位
    LCALL  T1MS         ;调延时子程序
    SETB SMG            ;关位选
    MOV ZX,#00H
    MOV  A,DP2
    MOVC A,@A+DPTR
    CPL A
    MOV  ZX,A
    CLR  SMS            ; 十位
    LCALL  T1MS
    SETB SMS
    MOV ZX,#00H
    MOV  A,DP3
    MOVC A,@A+DPTR
    CPL A
    MOV  ZX,A
    CLR  SMB            ; 百位
    SETB  P0.7          ;小数点在百位
    LCALL  T1MS
    SETB SMB
    MOV ZX,#00H
    RET
DISPTABB 0C0H,0F9H,0A4H,0B0H,99H,
        DB 92H,82H,0F8H,80H,90H
       ;0,1,2,3,4,5,6,7,8,9
;---------------------------------------------------
           END
有好东西大家共同分享
作者: 杨峰    时间: 2009-4-14 16:27

谢谢分享。
作者: 学员5701-01    时间: 2009-4-14 22:55

谢谢分享,论坛有你更精彩!




欢迎光临 『家电维修论坛 163DZ.COM』 (http://xn--www-ryc87f.163dz.com/bbs/) Powered by Discuz! 7.0.0