这个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;
}
}
|