标题: 我写的 x51 pwm 程序 [打印本页]

作者: richard56    时间: 2014-9-23 12:31
标题: 我写的 x51 pwm 程序

;*************************************************************************************************************************

;专案名称:PWM模块 for 89S51

;制令编号:N/A

;程序档案:x51PWM08(100Hz).ASM

;版    本:V1.00.0

;设计者  : Richard

;修改纪录: 周期=10mSec/ 频率= 100Hz

;2012/06/21: 已完成软件仿真,由T修改周期;P1Port修改PW(脉冲宽度),请留意T的修改会影响PW的执行状况(T>PW)

;*************************************************************************************************************************

PW           equ   3                      ;PW脉波ON时间设定(R3)

T              equ   4                      ;周期时间设定(R4)

T_Cnt               equ   5                      ;时间Counter(R5)


Led           reg    P2.0                  ;PWM基准脉波输出


                org   0000H

                ljmp  MAIN

;*************************************************************************************************************************        

MAIN:              mov  TMOD,#01H             ;定时器0设置为工作方式1,16位(2^16)

                ;mov TL0,#B0H         ;设定中断时间=50mSec=> (2^16 - 设定中断时间)=> (65536-50000) = 15536 = 3CB0(Hex)

                ;mov TH0,#03CH               ;TH0= 03CH ; TL0 = B0H

                ;mov TL0,#F0H         ;设定中断时间=10mSec=> (2^16 - 设定中断时间)=> (65536-10000) = 55536 = D8F0(Hex)

                ;mov TH0,#0D8H              ;TH0= 0D8H ; TL0 = F0H

                mov  TL0,#18H         ;设定中断时间=1mSec=> (2^16 - 设定中断时间)=> (65536-1000) = 64536 = FC18(Hex)

                mov  TH0,#0FCH              ;TH0= 0FCH ; TL0 = 18H

                setb   TR0

               

                setb   Led

                mov  R2,#0

                mov  PW,#03H                  ;PW初始设定,进入主程序后会读取P1状态来重新设定

                mov  T,#11                        ;周期(中断时间=1mSec)

                                                ;#128= 128mSec(7.8Hz)

                                                ;#101= 100mSec(10Hz)

                                                ;#15= 15mSec(67Hz)

                                                ;#11= 10mSec(100Hz)

                                                ;#9= 8mSec(124Hz)

                                                ;#8= 7mSec(140.9Hz)

                                                ;#7= 6mSec(167Hz)

                                                ;#6= 5mSec (197Hz)

                                                ;#5= 4mSec(250Hz)

                mov  T_Cnt,#1           ;周期Counter


LOOP:              jbc    TF0,CPLP         ;T0发生溢位则跳至CPLP

                ;T0未发生溢位

                call   CHG_P1                   ;读取P1状态设定为PW

                ajmp LOOP

               

CPLP:               

                ;mov TL0,#B0H         ;设定中断时间=50mSec=> (2^16 - 设定中断时间)=> (65536-50000) = 15536 = 3CB0(Hex)

                ;mov TH0,#03CH               ;TH0= 03CH ; TL0 = B0H

                ;mov TL0,#F0H         ;设定中断时间=10mSec=> (2^16 - 设定中断时间)=> (65536-10000) = 55536 = D8F0(Hex)

                ;mov TH0,#0D8H              ;TH0= 0D8H ; TL0 = F0H

                mov  TL0,#18H         ;设定中断时间=1mSec=> (2^16 - 设定中断时间)=> (65536-1000) = 64536 = FC18(Hex)

                mov  TH0,#0FCH              ;TH0= 0FCH ; TL0 = 18H

               

                inc    T_Cnt                       ;T_Cnt=T_Cnt+1

                mov  A,T_Cnt

                cjne  A,T, TA           ;if T_Cnt<>T then jump to TA

                ;ifT_Cnt=T

                clr    Led                   ;ON

                call   SET_CODE

                mov  T_Cnt,#1          ;T_Cnt=1 again, set break point here

TA:                                 

                mov  A,T_Cnt

                cjne  A,PW, TB                ;if T_Cnt<>PW then jump to TB

                ;ifT_Cnt=PW

                setb   Led                   ;OFF

                call   SET_CODE

                nop                           ;setbreak point here

TB:                                           ;

BACK:              ajmp LOOP

;*************************************************************************************************************************

;       取P1状态当作设定值输入

;*************************************************************************************************************************

CHG_P1:          push  PSW

                push  ACC

                mov  A,P1

                cpl    A

                anl    A,#11111111b           ;取P1.0~P1.7当作设定

                cjne  A,#0,PW_SET

                mov  PW,#3                      ;IFP1.0~P1.7=0 ; PW=3

                jmp   E_CHG_P1

PW_SET:          mov  PW,A

E_CHG_P1:      pop   ACC

                pop   PSW

                ret

;*************************************************************************************************************************

SET_CODE:     cjne  R2,#0,A1

                ;clr   P0.0                  ;clr  P0.0: ON(Low)

                ;setb  P0.1                  ;setb  P1.0:OFF(High)

                ;clr   P0.2                  ;clr   P0.2:ON(Low)

                mov  P0,#11111111B         ;0:ON(Low); 1:OFF(High)

                inc    R2

                jmp   A_END

               

A1:           cjne  R2,#1,A2

                ;clr   P0.0                  ;clr  P0.0: ON(Low)

                ;setb  P0.1                  ;setb  P1.0:OFF(High)

                ;clr   P0.2                  ;clr   P0.2:ON(Low)

                mov  P0,#11111110B         ;0:ON(Low); 1:OFF(High)

                inc    R2

                jmp   A_END

               

A2:           cjne  R2,#2,A3

                mov  P0,#11111111B

                inc    R2

                jmp   A_END

               

A3:           cjne  R2,#3,A4

                mov  P0,#11111101B

                inc    R2

                jmp   A_END

               

A4:           cjne  R2,#4,A5

                mov  P0,#11111111B

                inc    R2

                jmp   A_END

               

A5:           cjne  R2,#5,A6

                mov  P0,#11111011B

                inc    R2

                jmp   A_END

               

               

A6:           cjne  R2,#6,A_CLR

                mov  P0,#11111111B

                ;inc   R2

                ;jmp  A_END

                jmp   A_CLR

               

A7:           cjne  R2,#7,A8

                mov  P0,#11111011B

                inc    R2

                jmp   A_END

               

A8:           cjne  R2,#8,A_CLR

                mov  P0,#11111111B

               

A_CLR:            mov  R2,#1

A_END:            ret

;*************************************************************************************************************************

                end



作者: hkccd    时间: 2014-9-23 15:07
能共享一下电路图吗?或者电路连接的说明也可以
作者: blj178    时间: 2014-10-18 10:46
汇编太牛了
作者: 鐐归樀123    时间: 2014-10-24 00:19
璧烇紒妤间富澶帀瀹充簡鍟婏紒
作者: hjlost    时间: 2014-10-24 13:47
鎺樺楂樻墜锛屼笓鎸栧彜澧擄紝涓
作者: 小唐    时间: 2015-8-4 16:56
汇编没学过啊,,,,




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1