怎么样用51单片机产生三路占空比PWM波啊?要汇编语言的,有思路也行
发布网友
发布时间:2023-07-29 21:20
我来回答
共5个回答
热心网友
时间:2023-11-11 11:30
PWM EQU 7FH ;PWM赋初始值 OUT EQU P0 ;8个LED灯的接口
INCKEY EQU P3.2 ;K1,PWM值增加键。 DECKEY EQU P3.4 ;K2,PWM值减小键。
BEEP EQU P2.2
;----------------------------
ORG 0000H
SJMP START
ORG 000BH
SJMP INTT0
ORG 001BH
SJMP INTT1
ORG 0030H
;----------------------------
;主程序
;定时器0工作在模式1,定时器1工作在模式2。
;----------------------------
START:
MOV SP,#30H
MOV TMOD,#21H
MOV TH1,PWM ;脉宽调节
MOV TL1,#00H
MOV TH0,#0FCH ;1ms延时常数
MOV TL0,#066H ;频率调节
clr p1.4
SETB EA
SETB ET0
SETB ET1
SETB TR0
LOOP: MOV A,PWM ;
JB INCKEY,LOOP1 ;增加键是否按下?
CALL DELAY ;延时去抖动
JB INCKEY,LOOP1
CJNE A,#0FFH,PWMINC ;是否到最大值?
CALL BEEP_BL ;是,蜂鸣器报警。
SJMP LOOP
PWMINC:
INC PWM ;调节脉宽(脉宽减小)
SJMP LOOP
LOOP1: JB DECKEY,LOOP2 ;减小键是否按下?
CALL DELAY ;延时去抖动
JB DECKEY,LOOP2
CJNE A,#02H,PWMDEC ;是否到最小值?
CALL BEEP_BL ;是,蜂鸣器报警。
SJMP LOOP
PWMDEC:
DEC PWM ;调节脉宽(脉宽增加)
LOOP2: SJMP LOOP
;------------------------------
;T0中断服务子程序 (频率)
;控制定时器1中断
;------------------------------
INTT0:
CLR TR1
MOV TH0,#0FCH ;1ms延时常数
MOV TL0,#066H ;频率调节
MOV TH1,PWM
SETB TR1
MOV OUT,#07fH ;启动输出
RETI
;------------------------------
;T1中断服务子程序 (脉宽)
;控制PWM脉冲宽度
;------------------------------
INTT1:
CLR TR1 ;脉宽调节结束
MOV OUT,#0FFH ;结束输出
RETI
;------------------------------
;10ms延时子程序
;------------------------------
DELAY:
MOV R6,#50
DELAY1:
MOV R7,#100
DJNZ R7,$
DJNZ R6,DELAY1
RET
;-----------------------------------------------
;蜂鸣器响一声子程序
;-----------------------------------------------
BEEP_BL:
MOV R6,#100
BL1: CALL BL2
CPL BEEP
DJNZ R6,BL1
MOV R5,#25
CALL DELAY2
RET
BL2: MOV R7,#180
BL3: NOP
DJNZ R7,BL3
RET
DELAY2: ;延时R5×10MS
MOV R6,#50
BL4: MOV R7,#100
BL5: DJNZ R7,BL5
DJNZ R6,BL4
DJNZ R5,DELAY2
RET
;---------------------------------------------------
END
你可以参考这个程序自己写写
热心网友
时间:2023-11-11 11:31
; 这是产生 PWM 波的方法 中断部分 T0 自动重装载 方式2
INTT0: ; 几个参数需要 定义 三路 PWM 占空比 可以不同
PUSH PSW ; 现场保护
PUSH ACC
INC COUNTER ; 计数值加1
MOV A,COUNTER
CJNE A,PWMH1,INTT01 ; 如果等于高电平脉冲数
CLR P1.0 ; P1.0变为低电平 PWM1
INTT01:
CJNE A,PWMH2,INTT02 ; 如果等于高电平脉冲数
CLR P1.1 ; P1.1变为低电平 PWM2
INTT02:
CJNE A,PWMH3,INTT03 ; 如果等于高电平脉冲数
CLR P1.2 ; P1.2变为低电平 PWM3
INTT03:
CJNE A,PWM,INTT05 ;如果等于周期数
MOV COUNTER,#01H ;计数器复位
SETB P1.0 ;P1.0为高电平
SETB P1.1 ;P1.1为高电平
SETB P1.2 ;P1.2为高电平
INTT05:
POP ACC ;出栈
POP PSW
RETI
热心网友
时间:2023-11-11 11:31
如果是固定的PWM那好办,做个定时中断,中断里面判断时间,假如做1ms 的定时中断,5ms次让一个端口输出一个脉冲,然后10ms让另个端口输出Pwm脉冲,最后15ms 在另个端口输出Pwm脉冲,
热心网友
时间:2023-11-11 11:32
设定好相应时间,用三路定时器中断来不停的取反三个IO就行,这样三路可以各自调整互不干扰。89C52就有三个定时器T0 T1 T2
热心网友
时间:2023-11-11 11:33
三路就是三个子循环。
把全部的合成一个大循环,然后再分别*就好了追问我也是这么编的~不过就是不知道为啥按任何的键都是三路一同时起变化