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