|
這兩天學(xué)習(xí)了PWM,想通過按鍵來控制PWM的大小,在網(wǎng)上找了一個(gè)程序,程序沒有問題,但有些地方我沒明白,希望大家?guī)臀宜伎家幌隆?br />
下面是我的分析和我的疑問,對于分析有錯(cuò)誤的地方希望大家?guī)臀抑刚?br />
分析:這個(gè)程序我認(rèn)為應(yīng)該是用兩個(gè)定時(shí)器來控制的,定時(shí)器0控制的是周期,定時(shí)器1控制的是占空比,通過改變定時(shí)器1中TH1的大小改變占空比的值。
疑問:單片機(jī)定時(shí)器的方式2不是自動(dòng)重裝嗎,不是該是TH0自動(dòng)把值賦給TL0嗎。我把定時(shí)器0的TH0的初值設(shè)為0,刪掉定時(shí)器0中斷中的TL0=0這句話,為什么led產(chǎn)生的現(xiàn)象就不對了呢(按鍵3無法一直控制占空比增加,按鍵4也無法一直控制占空比減少)。
主函數(shù)中對占空比增加的控制,為什么TH0<200就可以,我把句子改為TH0<250就不行了呢。
#include <reg52.h>
#define out P2
sbit key3=P3^2;
sbit key4=P3^3;
//-----------------------------------------------------------------
void Init(void)
{
TMOD=0x22; //T1=T0=??????2??????
TH1=0; //??????(0.128ms)
TL1=0xff;
TH0=0; //??????=0??????
TL0=0;
TR0=1; //?????T0???
ET1=1;
ET0=1;
EA=1; //???ж??
}
void Timer0(void) interrupt 1
{
out=0xff; //??led
TL0=0;
TR1=1; //????????
}
void Timer1(void) interrupt 3
{
out=~out; //??led
TR1=0; //??????????
}
void delay( unsigned int i)
{
while(i--);
}
void main()
{
Init();
while(1)
{
key3=1;
key4=1;
if(key3==0)
{
delay(1000);
if(key3==0)
{
if(TH1<200)
TH1++;
}
}
else if (key4==0)
{
delay(1000);
if(key4==0)
{
if(TH1>0)
TH1--;
}
}
}
}
|
|