![]() |
發布時間: 2018-11-5 20:08
正文摘要:本帖最后由 馮喆喆 于 2018-11-5 20:11 編輯 ' Z( ~7 B& Z5 h ! d& M6 z: x2 Z6 C' R; @& C用PIC16F887單片機產生方波,當我把方波頻率設為4KHz時波形是正常的,當我改變TIMER2的分頻值,從4改為16 ,此時頻率應該 ... |
遠祥 發表于 2018-11-6 07:384 U) g: y* F8 E; U; e p% h8 [ 這個是用PIC單片機產生PWM波,應該比較常見吧 |
單片機常用問題嗎? |
主要的程序我也貼上來各位看一下 /********端口初始化函數********/1 h0 j% _& o; s7 c0 |4 ?2 S! @ void init() { ANSELH=0x00; //設置B口為數字I/O口8 m0 F: p! @/ T2 v4 o* g8 j d OPTION_REG=0x00; WPUB=0xFF; //設置B口弱上拉7 @9 B0 q3 Z7 N, q/ @& p. p INTCON=0x00; //關總中斷 PIE1=0; //PIE1的中斷禁止" H' x D# n& ~. u8 T0 q9 U PIE2=0; //PIE2的中斷禁止2 ]8 C; X' w5 |+ C' p/ ^, N3 c( T" J$ d TRISB0=1;5 w8 c5 `. b5 i! p TRISB1=1; //將RB1設置為輸入口,按按鍵 S% a( W$ A: u- G3 S1 z* [7 r$ h6 s- w TRISB2=1; //將RB2設置為輸入口,按按鍵 TRISB3=1;5 [8 s0 ~& G1 o6 F6 |8 b0 ~7 N TRISB4=1;3 j3 D/ [( f+ [, h2 R* e RC1=0;/ D+ z7 M& B9 ]7 c* a5 L TRISC1=0; //脈寬調制輸出引腳,設置為輸出 }% }3 n- w" o" H: G1 y /********PWM初始化函數********/4 j2 P7 z" A5 n4 U) B void PWM_Init()5 l2 `+ V) X/ |% t$ ?4 F v+ P { PR2=249; //脈寬調制波形的周期為1000us CCP2CON=0x0C; //CCP2模塊工作在PWM模式,占空因數的低兩位為00 z7 H+ J8 x8 l T2CON=0x02; //禁止TMR2,且前后分頻值為16,同時開始輸出PWM" L7 u+ h2 k0 r. i! @% [8 I CCPR2L=0xB8; //脈寬調制波形的占空比初始值* T* W( K" w) P% G% w0 E } /********鍵盤掃描函數******* */ void keyscan() { if(RB1==0) //如果是RB1鍵按下. L) B# d) P5 _( |2 g {+ x o; t: ]8 q, C, w+ ^! C9 R delay_ms(5); //延時去抖( Y( B' c, F! O) j' _* K if(RB1==0) //確認是否有鍵按下 { E' e5 q0 j4 u# \* b, }- m while(!RB1); //等待按鍵釋放' Z4 |. O+ Z' F# b0 E CCP2CON=0x0C;0 T% x5 x+ ?0 B' {; W CCPR2L=0xB8; //80%占空比. G! s6 F; J, R. e TMR2ON=1; }% m3 d9 p* w% O% N9 ]" w0 B } if(RB2==0) //如果是RB2鍵按下( V: P+ t- P) W' n; L* w: b { delay_ms(5); //延時去抖7 H2 E H, q' G/ x3 S$ ^: M if(RB2==0) //確認是否有鍵按下 { while(!RB2); //等待按鍵釋放( ]3 C! g7 t! C+ i: C, j% Q7 U CCP2CON=0x0C; CCPR2L=0x96; //60%占空比$ |& `9 P2 Q, ]7 j TMR2ON=1; } } if(RB0==0) //如果是RB0鍵按下 { delay_ms(5); //延時去抖 if(RB0==0) //確認是否有鍵按下 { while(!RB0); //等待按鍵釋放 CCP2CON=0x00; //關PWM" j. V' M4 A7 u TMR2ON=0; //禁止TMR27 f. {- H& ?' G6 L+ B8 c0 C3 h% | //delay_ms(5); RC1=0;. n0 C+ @; o* l( { }. c* G) Y- G& Z# b } }0 n# I1 ?4 Q X- M /********主函數********/+ j, x0 }2 v. [6 G void main() {0 q7 @7 z( x0 h3 `4 y% f8 J4 O init(); //系統初始化' G- o. V* i2 Z6 Q2 F PWM_Init(); //脈沖寬度初始化3 T) t" f) X4 \# n& u7 d while(1) { keyscan(); //調用按鍵掃描處理脈寬因數 } } |
Archiver|手機版|小黑屋|機械社區 ( 京ICP備10217105號-1,京ICP證050210號,浙公網安備33038202004372號 )
GMT+8, 2025-9-27 07:20 , Processed in 0.060898 second(s), 21 queries , Gzip On.
Powered by Discuz! X3.5 Licensed
© 2001-2025 Discuz! Team.