呼吸灯效果:![]() |
楼主少设置东西了,PWM周期没有设置PWMC=3000; PWM2CR和PWM2T2 等寄存器是扩展XSFR不能直接读写, 需要先设置 P_SW2|=0x80;否则读取的是XRAM存储器。 而且,如果在循环中改变PWM2T2的值好像不行,应该每个PWM周期改变一次PWM2T2的值。 |
本帖最后由 51heizlxz 于 2019-4-27 17:24 编辑 最近也在学PWM,以下程序使用PWM通道,可以实现呼吸灯效果。楼主少设置东西了,比如 PWM2CR 是扩展的XSFR,需要先设置P_SW2|=0x80;才能读写,否则读取的是XRAM存储器。 而且在循环中改变PWM2T2的值,如果PWM波的周期没到就改变了呢? 我在中断里改PWM2T2的值,一个PWM周期变一次。 还有楼主好像也没有设置PWM周期 PWMC=3000; #include "STC15W4K.H" #define uchar unsigned char #define uint unsigned int void PWM_CBIF() interrupt 22 { static uint idata a=1; static uint idata b=0; if(a==1) { b++; if(b==3000) a=0; } if(a==0) { b--; if(b==0) { a=1; b++; } } P_SW2|=0x80; PWM2T2=b; P_SW2&=0x0F; PWMIF=0; } void main() { P2M0=0; P2M1=0; //设置P2端口为准双向弱上拉 //因系统上电后,与PWM有关的端口均为高阻态 //所以,这里要设置为弱上拉状态 P_SW2|=0x80; PWMCFG=0x00; //配置PWM初始输出为低电平 PWMCKS=0x03; //PWM使用系统时钟 PWMCR=0x01; //PWM通道2输出使能 PWM2CR=0x08; //PWM输出为P2.7 PWMC=3000; PWM2T1=0; //第一次翻转的PWM计数值 PWM2T2=1; //第二次翻转的PWM计数值 P_SW2&=0x0F; PWMCR=0xC1; //PWM计数器开始 EA=1; //开总中断 while(1) { ; } } |
wulin 发表于 2019-1-13 20:10 上面的程序好像有点问题,循环语句。。。while(b--)位置应该不对。。 |
wulin 发表于 2019-1-13 20:10 哦哦。。我的意思是连pca计数器都不用。。。直接用pwm模块的计数器。。。。。。谢谢耐心回答。。。。 |
kissme 发表于 2019-1-13 17:04 上面的程序就是用STC15W404AS自带PWM模块的示例程序 |
wulin 发表于 2019-1-13 08:13 谢谢你。。。如果有单片机自带的pwm模块输出pwm波的程序。。希望能拜读。。。 |
本帖最后由 wulin 于 2019-1-13 10:21 编辑 特殊功能寄存器的配置通常用字节设置,多数不支持位操作。 给你一个PWM呼吸灯示例参考,MCU型号15W404AS,按默认CCP0输出端P1.1。注意特殊功能寄存器的配置与STC15W4K32有所区别。 #include <STC15F2K60S2.H>//15系列头文件 #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 = 0x02; //P1.1推挽输出 P1M1 = 0x00; //P1.1推挽输出 PWM_Init(); while(1) { scan(); CCAP0H=num; } } |