汇编程序:
PWMH DATA 30H ;高电平脉冲的个数
PWM DATA 31H ;PWM周期
COUNTER DATA 32H
TEMP DATA 33H
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP INTT0
ORG 0100H
MAIN:
MOV SP,#60H ;给堆栈指针赋初值
MOV PWMH,#02H ;
MOV COUNTER,#01H
MOV PWM,#15H
MOV TMOD,#02H ;定时器0在模式2下工作
MOV TL0,#38H ;定时器每200us产生一次溢出
MOV TH0,#38H ;自动重装的值
SETB ET0 ;使能定时器0中断
SETB EA ;使能总中断
SETB TR0 ;开始计时
KSCAN:
JNB P1.1,K1CHECK ;扫描KEY1,
JNB P1.2,K2CHECK ;扫描KEY2,如果按下KEY2,跳转到KEY2处理程序
SJMP KSCAN
K1CHECK:
JB P1.1,K1HANDLE ;去抖动,如果按下KEY1,跳转到KEY1处理程序
SJMP K1CHECK
K1HANDLE:
MOV A,PWMH
CJNE A,PWM,K1H0 ;判断是否到达上边界
SJMP KSCAN ;是,则不进行任何操作
K1H0:
MOV A,PWMH
INC A
CJNE A,PWM,K1H1 ;如果在加1后到达最大值
CLR TR0 ;定时器停止
SETB P1.0 ;P1.0为高电平
SJMP K1H2
K1H1:
CJNE A,#02H,K1H2 ;如果加1后到达下边界
SETB TR0 ;重开定时器
K1H2:
INC PWMH ;增加占空比
SJMP KSCAN
K2CHECK:
JB P1.2,K2HANDLE ;去抖动,如果按下KEY2,跳转到KEY2处理程序
SJMP K2CHECK
K2HANDLE:
MOV A,PWMH
CJNE A,#01H,K2H0 ;判断是否到达下边界
SJMP KSCAN ;是,则不进行任何操作
K2H0:
MOV A,PWMH
MOV TEMP,PWM
DEC A
CJNE A,#01H,K2H1 ;如果在减1后到达下边界
CLR TR0 ;定时器停止
CLR P1.0 ;P1.0为低电平
SJMP K2H2
K2H1:
DEC TEMP
CJNE A,TEMP,K2H2 ;如果到达上边界
SETB TR0 ;启动定时器
K2H2:
DEC PWMH ;降低占空比
SJMP KSCAN
INTT0:
PUSH PSW ;现场保护
PUSH ACC
INC COUNTER ;计数值加1
MOV A,COUNTER
CJNE A,PWMH,INTT01 ;如果等于高电平脉冲数
CLR P1.0 ;P1.0变为低电平
INTT01: CJNE A,PWM,INTT02 ;如果等于周期数
MOV COUNTER,#01H ;计数器复位
SETB P1.0 ;P1.0为高电平
INTT02: POP ACC ;出栈
POP PSW
RETI
END
帮我详细的注释一下PWM? 谢谢。
对于单纯硬件PWM的涓流充电的脉动问题,可以采用具有PWM端口的单片机,再结合外部PWM芯片即可解决涓流的脉动性。在充电过程中可以这样控制充电电流:采用恒流大电流快速充电时,可以把单片机的PWM输出全部为高电平(PWM控制芯片高电平使能)或低电平(PWM控制芯片低电平使能);当进行涓流充电时,可以把单片机的P...
帮我解释一下这个PWM控制电机调速的程序。
一、加速减速,就是增加或减少脉冲宽度,改变电机速度!脉冲的宽度由 1、CLK=0的状态持续,由T1的定时决定;2、CLK=1的状态持续,由(T0-T1)的时间决定;二、定时器中断TH0=0x00 ; TL0=0x00 ;1、T0定时器工作1方式,T0定时器启动后,从TH0、TL0赋值的计数值开始增加,增加到0XFFFF后,T0...
求详细解释这个51单片机PWM波原理
如果到了,说明PWM的低电平时间够了,那么就改flag=1,输出改高电平,同时记录次数变量清零,重新开始,如此循环便可得到你想要的PWM波形。
计数器0的溢出为pca计数器的时钟源 什么意思
PWM[54]是定义的一组PWM脉宽输出数组,PWM脉宽输出是0-255;0的时候脉宽输出最大,255的时候脉宽输出最小;然后那个初始化PCA,初始化定时器0就不说了,你自己下一个手册看下就明白;然后是中断,每中断一次index加1,然后判断index是不是等于54,意思就是PWM[54]整个数组里面的PWM是不是都送了一次...
at89c51的pwm输出占空比的概念 后面可以给点注释吗?
PWM输出脚P1.1脚:#define out P1^1占空比全局变量 unsigned char ZKB; \/\/ZKB=1~100即1%~100%void moto_control(){unsigned char i;for(i=0;i<100;i++){if(i==0)out=1; \/\/等于0的时候输出高电平 不等于0的时候保持状态吧 if(i==ZKB)out=0; \/\/当i==你设置的占空比时候 ...
单片机pwm控制电机转速
1”,41ns—400ns输出低电频“0”,这样为一个周期,后面就一直循环吧。如果按键P1.0按下,执行方式1,全速运行,否则以默认方式运行;按键P1.1按下,执行方式2,改变占空比,以50%的速度运行,否则,不作改变;按键P1.2按下,执行方式3,改变占空比,以10%的速度运行,否则,不作改变。
...能使单片机的两个输出口产生2个不同的pwm脉冲吗??懂得话给个程序...
提供一种思路,程序没时间写。1、PWM需要周期,因此定时器必须得设置匹配值,达到周期计数时间后复位TC值;2、两个PWM波形需要产生可调的PWM,那么就需要让定时器知道什么时刻该让这个IO口输出高低电平。可以让两个输出提供参数,比如数值是多少后出现高电平,高电平持续多长数值?3、最后就是关键点了,...
谁帮忙把这个51单片机模仿PWM呼吸灯的主函数程序注释下,很乱
void main (void){ unsigned int t = 1;unsigned int i, TEMP;unsigned int TYPE = 0;bit LOOP = 0;while (1){ if (KEY == 0){ l1:Delay(10000);TYPE = (1 - TYPE);if (TYPE == 0){ t = 1;LOOP = 0;};} if (TYPE == 0){ if (LOOP == 0){ Display(t);t++;...
Altium Designer中如何表示PWM信号输入
1:用字符串注释 2:用线画几个PWM信号 3:标网络标号
C语言写占空比50%PWM波的代码
如果想要进步最好自己写,不要老是要人家给代码之类的。给个思路你吧。有软件PWM和硬件PWM 像51单片机没有硬件PWM只能用软件PWM:1,设定定时器并开中断(定时时间为你需要的PWM频率)2,在中断函数中设定每次中断到来输出PWM的端口电平取反。硬件PWM:根据单片机的datasheet,配置好相关的寄存器并使能PWM...