找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2918|回复: 5
打印 上一主题 下一主题
收起左侧

我写的 x51 pwm 程序

[复制链接]
跳转到指定楼层
楼主
ID:66535 发表于 2014-9-23 12:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

;专案名称: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


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:2318 发表于 2014-9-23 15:07 来自手机 | 只看该作者
能共享一下电路图吗?或者电路连接的说明也可以
回复

使用道具 举报

板凳
ID:67573 发表于 2014-10-18 10:46 | 只看该作者
汇编太牛了
回复

使用道具 举报

地板
ID:67849 发表于 2014-10-24 00:19 | 只看该作者
璧烇紒妤间富澶帀瀹充簡鍟婏紒
回复

使用道具 举报

5#
ID:66501 发表于 2014-10-24 13:47 | 只看该作者
鎺樺楂樻墜锛屼笓鎸栧彜澧擄紝涓
回复

使用道具 举报

6#
ID:73872 发表于 2015-8-4 16:56 | 只看该作者
汇编没学过啊,,,,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表