|
PWM(脈寬調(diào)制)在很多場(chǎng)合都用得上,例如LED亮度控制,開(kāi)關(guān)電源輸出電圧控制等。
這里采用簡(jiǎn)單的定時(shí)器實(shí)現(xiàn)PWM波輸出,通過(guò)更改定時(shí)器定時(shí)參數(shù),控制IO口輸出
波形高低電平持續(xù)時(shí)間,實(shí)現(xiàn)PWM波。
代碼如下:
- #include<reg52.h>
- #define T0_INTERRUPT 1 //T0中斷向量號(hào)
- #define PWMH_L 0x9C
- #define PWMH_H 0xFF //PWM低電平時(shí)間0.1ms
- #define PWML_L 0xCE
- #define PWML_H 0xFF //PWM高電平時(shí)間0.05ms
- sbit LED1 = P1^0; //常亮LED,作為對(duì)比,仿真看不出效果
- sbit LED2 = P1^1; //PWM驅(qū)動(dòng)LED
- typedef unsigned char uchar;
- typedef unsigned int uint;
- void Init_T0();
- void main()
- {
- LED1 = 0; //點(diǎn)亮LED1
- LED2 = 1; //熄滅LED2
- Init_T0(); //初始化定時(shí)器0
- while(1)
- {
- PCON |= 0x01; //單片機(jī)進(jìn)入休眠模式,節(jié)省功耗
- }
- }
- void Init_T0()
- {
- TMOD &= 0xF0;
- TMOD |= 0x01; //16位定時(shí)器模式
-
- TH0 = PWML_H;
- TL0 = PWML_L;
-
- EA = 1; //開(kāi)全局中斷
- ET0 = 1; //允許T0中斷
- TR0 = 1; //啟動(dòng)定時(shí)器
- }
- void T0_Interrupt() interrupt T0_INTERRUPT
- {
- TF0 = 0;
- if(LED2 == 1)
- {
- LED2 = 0; //設(shè)置低電平持續(xù)時(shí)間,LED2亮
- TH0 = PWMH_H;
- TL0 = PWMH_L;
- }
- else
- {
- LED2 = 1; //設(shè)置高電平持續(xù)時(shí)間,LED2滅
- TH0 = PWML_H;
- TL0 = PWML_L;
- }
- }
復(fù)制代碼
|
|