标题:
求指教下stc89c51单片机定时器PWM占空比程序
[打印本页]
作者:
老二不怕黑
时间:
2022-1-15 23:45
标题:
求指教下stc89c51单片机定时器PWM占空比程序
这个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;
}
}
作者:
青街古城
时间:
2022-1-16 17:30
if(t==250) //PWM周期 100个单位 ?????此处如何确定PWM周期就是100个单位
这个感觉不对吧,如果要看作一百个单位的话,前面那个 PWM_T=30; //默认上电PWM=30%
这个的值就改了啊。如果不改的话这250就应该改啊。不然感觉你这个输出的占空比不会是百分之30啊
作者:
YZM168
时间:
2022-1-16 22:41
1. delay_1ms(10);//延时10毫秒 ????作用是按照给定时间间隔递增
2. if(t==250) //PWM周期 100个单位 ???前一句自加后必然结果
作者:
wulin
时间:
2022-1-17 10:12
#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=156; //写入预置初值(取值1-255,数越大PWM频率越高)
TL0=156; //定时周期100us
TR0=1; //启动定时器
ET0=1; //允许定时器0中断
EA=1; //允许总中断
P1=0xff; //初始化P1,输出端口
PWM_T=30; //默认上电PWM=30%
while(1)
{
if(!up) //检测PWM增加按键是否按下,如果按下,执行里面的判断程序
{
delay_1ms(10); //延时10毫秒消抖
if(!up) //再次确认按下
{
if(PWM_T<100) //判断PWM控制变量是否小于100,如果小于100,则加加,如果不小于100,则无操作
{
PWM_T++;
while(!up);//等待松手,否则会连续++
}
}
}
if(!down) //检测PWM减少按键是否按下,如果按下,则执行里面的判断程序
{
delay_1ms(10); //延时10毫秒消抖
if(!down) //再次确认按下
{
if(PWM_T>0) //判断PWM控制变量是否大于0, 如果大于0,则减减,如果不大于0,则无操作
{
PWM_T--;
while(!down);//等待松手,否则会连续--
}
}
}
}
}
/****************************************************
/定时器0中断模拟PWM
****************************************************/
void timer0() interrupt 1
{
t++;
if(t>=100)//原来代码不能在0~100范围可调
{
t=0;
}
if(PWM_T>t)
{
led=0;
}
else led=1;
}
复制代码
作者:
老二不怕黑
时间:
2022-1-18 22:33
wulin 发表于 2022-1-17 10:12
谢谢老师,明白多了,
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1