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_lowTL0 = 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
0