找回密码
 立即注册

QQ登录

只需一步,快速开始

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

等周期脉宽调制pwm单片机汇编程序

[复制链接]
跳转到指定楼层
楼主
ID:128229 发表于 2016-6-27 21:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
;等周期脉宽调制pwm
;晶振:12MHZ
;89S51
P_PWM1      EQU         P1.0
cycle       EQU         1000        ;PWM的周期(单位微秒),则频率为1000赫兹
cycle_high  EQU         500         ;一个周期内,PWM端口为高电平的时间(初始值)
   DSEG AT 20H
   ORG         40H
   PWM_HIGH_L  DATA        40H
            PWM_HIGH_H  DATA        41H         ;PWM端口为高电平时,定时器寄存器的值
   PWM_LOW_L  DATA         42H
            PWM_LOW_H  DATA         43H         ;PWM端口为高电平时,定时器寄存器的值
    ORG         60H                     ; 堆栈起源
stack:      DS          20H                     ; 堆栈长度
   CSEG
   ORG         0000H                   ; power on/reset vector
            jmp         on_reset
            ORG         0003H                   ; 外部中断0向量
            reti                                ;
            ORG         000BH                   ; 计时器0溢出向量
            reti                                ;
            ORG         0013H                   ; 外部中断1的向量
            reti                                ;
            ORG         001BH                   ; 定时器溢出向量1
            JMP         TIMER1_ISR
    ORG         0023H                   ; 串行I / O中断矢量
            reti                                ;
;***********************************************************************************
;系统初始化等
            ORG         0033H                   ; begin code space
            USING       0                       ; register bank zero
on_reset:   MOV         R7,#00H
            DJNZ        R7,$        ;延时
            mov         sp, #(stack-1)          ; 初始化堆栈指针
            ;禁止各中断
            MOV         IE,#00H
            MOV         IP,#00H
SYS_INIT:   MOV         R0,#00H
SYS_INIT_LOOP:
            MOV         R1,#00H
            DJNZ        R1,$
            DJNZ        R0,SYS_INIT_LOOP        ;延时0.13S
            ;内部RAM(30H-5fH)清零
            MOV         R1,#30H
            MOV         A,#0
ZERO_LOOP:  MOV         @R1,A
            INC         R1
            CJNE        R1,#60H,ZERO_LOOP
            ;定时器1初始化
            MOV         TMOD,#00010000B         ;方式1,16位定时器模式
            MOV         PWM_HIGH_L,#LOW(65536 - cycle_high)
            MOV         PWM_HIGH_H,#HIGH(65536 - cycle_high)
            MOV         PWM_LOW_L,#LOW(65536 - (cycle - cycle_high))
            MOV         PWM_LOW_H,#HIGH(65536 - (cycle - cycle_high))
            SETB        P_PWM1                  ;先输出高
            MOV         TL1,PWM_HIGH_L
            MOV         TH1,PWM_HIGH_H
            SETB        ET1                     ;T1开中断
            SETB        EA                      ;开总中断
            SETB        TR1                     ;开定时器1
MAIN_LOOP:
;主循环
            SJMP        $
;**********************************************************************
;**********************************************************************
;定时器1中断服务程序
TIMER1_ISR:
            USING       1                       ; register bank 1
            PUSH        ACC
            PUSH        PSW
   JB          P_PWM1,PWM_OUT_LOW      ;如果输出为高则,输出低
            SETB        P_PWM1
            MOV         TL1,PWM_HIGH_L
            MOV         TH1,PWM_HIGH_H
            JMP         TIMER_ISR_RET
PWM_OUT_LOW:
            CLR         P_PWM1
            MOV         TL1,PWM_LOW_L
            MOV         TH1,PWM_LOW_H
TIMER_ISR_RET:
            POP         PSW
            POP         ACC
            RETI
;*********************************************************************
            END


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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