熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2019-1-12 20:08
正文摘要:單片機(jī)stc15w4k32.有自帶pwm模塊。看數(shù)據(jù)手冊(cè)寫下如下漸亮燈程序。。下載后木有反應(yīng)。。把知道哪錯(cuò)了。。拜托大神指教。。。謝謝 |
呼吸燈效果:![]() |
樓主少設(shè)置東西了,PWM周期沒有設(shè)置PWMC=3000; PWM2CR和PWM2T2 等寄存器是擴(kuò)展XSFR不能直接讀寫, 需要先設(shè)置 P_SW2|=0x80;否則讀取的是XRAM存儲(chǔ)器。 而且,如果在循環(huán)中改變PWM2T2的值好像不行,應(yīng)該每個(gè)PWM周期改變一次PWM2T2的值。 |
本帖最后由 51heizlxz 于 2019-4-27 17:24 編輯 最近也在學(xué)PWM,以下程序使用PWM通道,可以實(shí)現(xiàn)呼吸燈效果。樓主少設(shè)置東西了,比如 PWM2CR 是擴(kuò)展的XSFR,需要先設(shè)置P_SW2|=0x80;才能讀寫,否則讀取的是XRAM存儲(chǔ)器。 而且在循環(huán)中改變PWM2T2的值,如果PWM波的周期沒到就改變了呢? 我在中斷里改PWM2T2的值,一個(gè)PWM周期變一次。 還有樓主好像也沒有設(shè)置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; //設(shè)置P2端口為準(zhǔn)雙向弱上拉 //因系統(tǒng)上電后,與PWM有關(guān)的端口均為高阻態(tài) //所以,這里要設(shè)置為弱上拉狀態(tài) P_SW2|=0x80; PWMCFG=0x00; //配置PWM初始輸出為低電平 PWMCKS=0x03; //PWM使用系統(tǒng)時(shí)鐘 PWMCR=0x01; //PWM通道2輸出使能 PWM2CR=0x08; //PWM輸出為P2.7 PWMC=3000; PWM2T1=0; //第一次翻轉(zhuǎn)的PWM計(jì)數(shù)值 PWM2T2=1; //第二次翻轉(zhuǎn)的PWM計(jì)數(shù)值 P_SW2&=0x0F; PWMCR=0xC1; //PWM計(jì)數(shù)器開始 EA=1; //開總中斷 while(1) { ; } } |
wulin 發(fā)表于 2019-1-13 20:10 上面的程序好像有點(diǎn)問題,循環(huán)語句。。。while(b--)位置應(yīng)該不對(duì)。。 |
wulin 發(fā)表于 2019-1-13 20:10 哦哦。。我的意思是連pca計(jì)數(shù)器都不用。。。直接用pwm模塊的計(jì)數(shù)器。。。。。。謝謝耐心回答。。。。 |
kissme 發(fā)表于 2019-1-13 17:04 上面的程序就是用STC15W404AS自帶PWM模塊的示例程序 |
wulin 發(fā)表于 2019-1-13 08:13 謝謝你。。。如果有單片機(jī)自帶的pwm模塊輸出pwm波的程序。。希望能拜讀。。。 |
本帖最后由 wulin 于 2019-1-13 10:21 編輯 特殊功能寄存器的配置通常用字節(jié)設(shè)置,多數(shù)不支持位操作。 給你一個(gè)PWM呼吸燈示例參考,MCU型號(hào)15W404AS,按默認(rèn)CCP0輸出端P1.1。注意特殊功能寄存器的配置與STC15W4K32有所區(qū)別。 #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定時(shí)器停止 //清除CF標(biāo)志 //清除模塊中斷標(biāo)志 CL = 0; //復(fù)位PCA寄存器 CH = 0; CMOD = 0x02; //設(shè)置PCA時(shí)鐘源,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定時(shí)器開始工作 } 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; } } |
Powered by 單片機(jī)教程網(wǎng)