01/10/2018, 11:09
Các bạn lập trình nhúng vdk cho mình hỏi chút về PWM
Mình xem video và thấy code cho led sáng dần tắt dần như sau :
>` #include <regx51.h>`
>` #define UP 0`
>`#define DOWN 1`
> sbit PWM_PIN = P2^0;
> unsigned int T,Ton,Toff;
> unsigned char TH_hight, TL_hight, TH_low, TL_low;
> void PWM_init(unsigned int ck)
> {
> PWM_PIN = 1; // den tat
> TMOD &= 0xF0; //Xoa cac bit cua timer0
> TMOD |= 0x01; // set timer0 mode 1
> ET0 = 1; // cho phep ngat timer0
> EA = 1; // cho phep ngat toan cuc
> // Duty = 50%
> T = ck;
> Ton = T/2;
> Toff = T-Ton;
> // thoi gian delay khi o muc cao
> TH_hight = (65536-Ton)>>8;
> TL_hight = (65536-Ton)&0x00FF;
> // thoi gian delay khi o muc thap
> TH_low = (65536-Toff)>>8;
> TL_low = (65536-Toff)>>8;
> TH0 = TH1;
> TL0 = TL1;
> }
> void PWM_start()
> {
> TR0 = 1; // khoi dong timer0
> }
> void PWM_stop()
> {
> TR0 = 0;
> }
> void PWM_Set_Duty(unsigned char duty)
> {
> if(duty ==0)
> {
> PWM_PIN = 0; // Light On
> ET0 = 0; // Cho phep ngat timer0
> }
> else if(duty ==100)
> { // Light Off
> PWM_PIN = 1;
> ET0 = 0; // cho phep ngat timer0
> }
> else
> {
> Ton = (((unsigned long)T)*duty)/100;
> Toff = T - Ton;
>
> // Thoi gian delay mode ON
> TH_hight = (65536-Ton)>>8;
> TL_hight = (65536-Ton)&0x00FF;
> // Thoi gian delay mode Off
> TH_low = (65536-Toff)>>8;
> TL_low = (65536-Toff)>>8;
>
> ET0 = 1;
> }
> }
> void Delay_ms(unsigned char time)
> {
> while(time--);
> }
> int main()
> {
> unsigned char status = 0 , duty = 0;
> PWM_init(1000);
> PWM_Set_Duty(0);
> PWM_start();
>
> while(1)
> {
> Delay_ms(100);
> if(status == UP)
> {
> duty += 2 ;
> if(duty == 100)
> {
> status = DOWN;
> }
> }
> else
> {
> duty -=2 ;
> if(duty == 0)
> {
> status = UP;
> }
> }
>
> PWM_Set_Duty(duty);
> }
> }
> void NgatTimer0() interrupt 1
> {
> PWM_PIN = !PWM_PIN;
> if(PWM_PIN == 0)
> {
> TH0 = TH_low;
> TL0 = TL_low;
> }else
> {
> TH0 = TH_hight;
> TL0 = TL_hight;
> }
> }
Nhưng mình đang không hiểu chỗ hàm interrupt, sao khi đèn sáng thì lại nạp TH0 = TH_low
và TL0 = TL_low
, mình nghĩ khi đèn sáng thì phải nạp deelay ở mức cao
chứ ?
Thanks.
Bài liên quan