2个输出口以高电平为有效输出,也就是当输出100%时为高电平输出,输出0%时为低电平输出。
改变10H-11H的值可以控制2路PWM的占空比变化,例如当10H中的值从0-255变化时候,P1.0输出从0%-100%变化
此程序中频率完全固定不变化,改变10H,11H,12H中的清返值仅改变三路输出的占空比,
频率是完全恒定的.这里PWM波周期为(r7)50usx200=10mS,约为100Hz,晶振用的是12MHz
zzz EQU P1.0 左路马达输出口
yyy EQU P1.1 右路马达输出口
ld1 EQU 10H 左路马达,即占空比的比值,0-255变化
ld2 EQU 11H 右路马达,即占空比的比值,0-255变化
ORG 0000H
LJMP mm
ORG 000BH
LJMP t000
主程序段*****************************************************************************
org 0100h
mm:nop 复位程序
mov r4,#00h 延时1秒用
mov r5,#00h
mov r6,#05h
MOV SP,#5fH
MOV P1,#0FFH P1置高,关闭全部灯
MOV 10h,#0fH 给左路马达赋值,0ffh为速度最快,00h为最慢
MOV 11h,#8fH 给右路马达赋值,0ffh为速度最快,00h为最慢
mov r0,10h 将左路的赋值送进左路缓存
mov r1,11h 将右路的赋值送进右路缓存
MOV TMOD,#02H50us t0方式2自动重装
mov tcon,#00h
MOV TH0,#0cdH
MOV TL0,#0cdH
mov r7,#200 设定周期数据
SETB EA
SETB ET0
SETB TR0
mov 20h,#00h
m0:acall ys00延时1秒
acall pwm改变速度子程序
sJMP m0
定时器t0中断子程序<占用区0>********************************************************************
org 0180h
t000: 50us t0中断子程序,用于实现三路PWM输出
PUSH ACC
PUSH PSW
clr psw.4 进入区0
clr psw.3
CJNE R7,#00H,AA 从这里是程序的精华,检测R7值是否为0,等于0则下一条重新赋值,否则跳到AA
MOV R7,#200 R7重新赋值
setb 07h 设置改变pwm数据标志位
MOV R0,10h把左路速度值复制给R1
MOV R1,11h把右路速度值复制给R2
AA:CJNE R0,#00H,BB判断控制左路的值是否(或是否被减为0)为0,是则下一条关闭左路,否则跳到BB
SETB zzz 关闭左路
sJMP CC 跳到CC检测右路
BB:CLR zzz打开(或继续打开)左路
DEC R0R1数值减1
CC:CJNE R1,#00H,DD这里控制右路与上面左路原理一样
SETB yyy
sJMP GG
DD:CLR yyy
DEC R1
GG: DEC R7把R7的值减1,R7的初始值是#200h
POP PSW
POP ACC
RETI
延时1秒时间子李正答程序*****************************************************
org 0200h
ys00:push dph
push dpl
push acc
push psw
clr psw.4 进入区0
clr psw.3
ys1:djnz r4,ys1
ys2:djnz r5,ys1
ys3:djnz r5,ys1
mov r4,#00h
mov r5,#00h
mov r6,#05h
acall pwm
pop psw
pop acc
pop dpl
pop dph
ret
pwmr改变pwm时间子程序*****************************************************
org 0280h
pwm:jb 07h,pwm1 一个完整周期到否?
ret 未到则返回
pwm1:push acc
push psw
clr psw.4 进入区0
clr psw.3
mov a,10h
cjne a,#0ffh,pwm3 未到最大则继续
mov 10h,#0fh
sjmp pwm4
pwm3:mov a,10h
add a,#10h
mov 10h,a
pwm4:mov a,11h
cjne a,#0ffh,pwm6 未到最大则继续
mov 11h,8fh
sjmp pwm11
pwm6:mov a,11h
add a,#10h
mov 11h,a
pwm11:clr 07h
pop acc
pop psw
ret
END
这是一个 可以输出 三路 不同占空比的 程序明启漏PWMH1DATA 30H 高电平脉冲的个数
PWMH2DATA 31H
PWMH3DATA 32H
PWM DATA 33H PWM周期
COUNTER DATA 35H
TEMP DATA 36H
ORG0000H
AJMP MAIN
ORG000BH
AJMP INTT0
ORG0100H
MAIN:
MOV SP,#60H 给堆栈指针赋初值
MOV TMOD,#02H 定时器0在模式2下工作
MOV TL0,#38H 定时器每200us产生一次溢激烂出
MOV TH0,#38H 自动重装的值
SETB ET0 使能定时器0中断
SETB EA使能总中断
SETB TR0 开始计时
MOV PWMH1,#2PWM 1 占空比 可以修改
MOV PWMH2,#5PWM 2 占空比 可以修改
MOV PWMH3,#8PWM 3 占空比 可以修改
MOV COUNTER,#0
MOV PWM,#16 占空比 为 16 级 可以修改
JMP $
INTT0:几个参数需要 定义 三路 PWM 占空比 可以不同
PUSH PSW 现场保护
PUSH ACC
INCCOUNTER 计数值加1
MOVA,COUNTER
CJNE A,PWMH1,INTT01 如果等于高电平脉冲数
CLRP1.0P1.0变为低电平 PWM1
INTT01:
CJNE A,PWMH2,INTT02 如果等于高电平脉冲数
CLRP1.1P1.1变为低电平 PWM2
INTT02:
CJNE A,PWMH3,INTT03 如果等于高电平脉冲数
CLRP1.2P1.2变为低电平 PWM3
INTT03:
CJNE A,PWM,INTT05如果等于周期数
MOVCOUNTER,#0 计数器复位
SETB P1.0P1.0为旁型高电平
SETB P1.1P1.1为高电平
SETB P1.2P1.2为高电平
INTT05:
POP ACC 出栈
POP PSW
RETI
END
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)