這個PWM程序是我從網上找的,備注多數是我自己備注的,請師傅們幫忙看看我備注加??問號的地方的程序是怎么意思呢
#include <reg51.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit down = P3^3; //定義PWM增加按鍵
sbit up = P3^0; //定義PWM減少按鍵
sbit led = P2^0; //定義PWM輸出控制端口
uint8 t = 0; //定義一個無符號字符變量,累計定時器溢出次數
uint8 PWM_T = 0; //占空比控制變量
/***************************************************
延時1毫秒函數
****************************************************/
void delay_1ms(uint16 t)
{
uint16 x,y;
for(x=t;x>0;x--)
for(y=120;y>0;y--);
}
/****************************************************
主程序
****************************************************/
void main(void)
{
TMOD = 0x02; //定時器0,工作模式2,8位自動重裝載定時模式
TH0=210; //寫入預置初值(取值1-255,數越大PWM頻率越高) 初值計算公式TH0=255-t*f/12;定時器計數50次溢出,每次定時計數1us;
TL0=210; //寫入預置值 (取值1-255,數越大PWM頻率越高) t:計數次數;f:晶振頻率:11.0592M
TR0=1; //啟動定時器
ET0=1; //允許定時器0中斷
EA=1; //允許總中斷
P1=0xff; //初始化P1,輸出端口
PWM_T=30; //默認上電PWM=30%
while(1)
{
if(!up) //檢測PWM增加按鍵是否按下,如果按下,執行里面的判斷程序
{
if(PWM_T<250) //判斷PWM控制變量是否小于250,如果小于250,則加加,如果不小于250,則無操作
{
PWM_T++;
}
delay_1ms(10);//延時10毫秒 ?????此處延時有什么作用?是按鍵消抖嗎?
}
if(!down) //檢測PWM減少按鍵是否按下,如果按下,則執行里面的判斷程序
{
if(PWM_T>0) //判斷PWM控制變量是否大于0, 如果大于0,則減減,如果不大于0,則無操作
{
PWM_T--;
}
delay_1ms(10);//延時10毫秒
}
}
}
/****************************************************
/定時器0中斷模擬PWM
****************************************************/
timer0() interrupt 1
{
t++; //每次定時器溢出計數變量加1,每次計數50us,累計溢出250次,累計計時12.5ms
if(t==250) //PWM周期 100個單位 ?????此處如何確定PWM周期就是100個單位
{ //當定時器累計溢出250次時,清空計數變量,重新開始累計溢出次數,P1端口輸出低電平,否則輸出高電平
t=0; //使t=0,開始新的PWM周期
led=0; //輸出端口
}
if(PWM_T<=t) //按照當前占空比切換輸出為高電平
//???這兒的PWM_T<=t和PWM_T==t有區別嗎??應該怎么樣才正確,仿真兩個寫法都能調節占空比
{ //當PWM_T檢測等于定時器溢出次數時,P1端口輸出高電平,否則輸出低電平
led=1;
}
}
|