你好 ! 这个程序还有吗? 能不能分享给我一份,我想具体学习一下,非常感谢! |
wulin 发表于 2018-12-11 08:52 学习了,多谢! |
HC6800-ES-V2.0 发表于 2018-12-10 08:02 请问pwmcr.这几个大写英文是pca的命令字么 |
wulin 发表于 2018-12-10 07:28 求教:num的值开始从1加到255。加了5000次。再让num的值从255减到1也是5000次。。把num的值赋给计数器初值。。.那么这个占空比是多少呢。。。没明白它咋会渐亮 |
嗯嗯。学到了,非常感谢。 |
wulin 发表于 2018-12-11 08:52 嗯嗯。学到了,非常感谢。 |
本帖最后由 wulin 于 2018-12-11 09:00 编辑 summerhqj 发表于 2018-12-10 22:26 count1,count2是计数延时变量,延时十几毫秒num增/减一次,否则不是呼吸灯而是闪烁灯,b=5000也是计数延时,目的是让呼吸灯在最亮和最暗时停留几十毫秒以改善视觉效果。其实把这个子程序略改一下就可以用按键控制增减PWM输出电压。示例如下: void keyscan() { static uint count1=0,count2=0; if(!key1) { count1++;//消抖计数 if(count1>=2000) { count1=0; if(num>0) { num=num-5;//按5递减占空比(按实际需求调整进阶) CCAP0H=num;//PWM输出电压增高 } while(!key1);//松手检测 } } if(!key2) { count2++; if(count2>=2000) { count2=0; if(num<0xff) { num=num+5;//按5递增占空比 CCAP0H=num;//PWM输出电压降低 } while(!key2); } } } |
HC6800-ES-V2.0 发表于 2018-12-10 08:02 谢谢! |
wulin 发表于 2018-12-10 07:28 感谢,请问下这个count1,count2,2000和5000分别是代表什么呢? |
summerhqj 发表于 2018-12-10 17:23 ![]() |
![]() 感谢,请问下,如果我只用了单片机的P2.5口来进行PWM输出,它上面写了CCP0_3,那是不是只要设置CCP0_3就好了,程序要怎么写呢?我看了这个程序没能看出他的PWM输出口,请教下您,麻烦您了,谢谢! |
因为是第一次接触这个单片机的PWM网上找的资料也看不大懂,真的非常感谢各位大佬。 |
这个STC15单片机的PWM,我做过试验,部分程序如下(同一程序还有其它功能,暂时不管): //以下内容为设置PWM波的输出 P_SW2|=0x80; PWMCFG = 0x00; PWMCKS = 0x00; PWMIF=0x00; PWMFDCR=0x00; PWMC = 1001; PWM2T1 = 0; PWM2T2 = 1001; PWMCR=0x81; while(1) { for (i=0;i<1000;i++) { PWM2T1=i; Delay2ms(); } PWMCR=0x00; PWM2T1=1000; Delay1000ms(); PWMCR=0x81; for (i=1000;i>0;i--) { PWM2T1=i;//呼吸灯变亮的过程 Delay2ms(); } } } 我做的设置,都是参看单片机手册得到的。 至于你要求的用PWM输出一个具体值的电压,这个我不会!!! |
用两个按键操作一个变量num的+-,范围0x00~0xff,直接控制CCAP0H寄存器:CCAP0H=num; 这是一个PWM呼吸灯程序,把呼吸程序改成按键程序即可直接应用在PWM调压。供你参考。 #include <STC15F2K60S2.H> #define uint unsigned int #define uchar unsigned char //sbit key1=P4^2; //sbit key2=P4^4; sbit LED=P1^0; uchar num=0x00; bit a=0; uint b; void PWM_Init() { CCON = 0; //初始化PCA控制寄存器 //PCA定时器停止 //清除CF标志 //清除模块中断标志 CL = 0; //复位PCA寄存器 CH = 0; CMOD = 0x02; //设置PCA时钟源,PWM频率=12MHZ/2/256=23.4375KHZ //PWM频率=11.0592MHZ/2/256=21.600KHZ PCA_PWM0 = 0x00; //PCA模块0工作于8位PWM CCAP0H = CCAP0L = 0xff; //PWM0的占空比为100% CCAPM0 = 0x42; //PCA模块0为8位PWM模式 CR = 1; //PCA定时器开始工作 } void scan() { static uint count1=0,count2=0; if(a==0) { count1++; if(count1>=2000) { count1=0; if(num<0xff) { num++; if(num==0xff) { a=1; b=5000; while(b--); } } } } else { count2++; if(count2>=2000) { count2=0; if(num>0) { num--; if(num==0) { a=0; b=5000; while(b--); } } } } } void main() { P1M0 = 0x01; //推挽输出 P1M1 = 0x00; //推挽输出 PWM_Init(); while(1) { scan(); CCAP0H=num; } } |
|