找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2106|回复: 8
收起左侧

关于单片机按键控制PWM大小的问题?

[复制链接]
ID:687423 发表于 2020-2-22 10:15 | 显示全部楼层 |阅读模式
这两天学习了PWM,想通过按键来控制PWM的大小,在网上找了一个程序,程序没有问题,但有些地方我没明白,希望大家帮我思考一下。
下面是我的分析和我的疑问,对于分析有错误的地方希望大家帮我指正。
分析:这个程序我认为应该是用两个定时器来控制的,定时器0控制的是周期,定时器1控制的是占空比,通过改变定时器1中TH1的大小改变占空比的值。
疑问:单片机定时器的方式2不是自动重装吗,不是该是TH0自动把值赋给TL0吗。我把定时器0的TH0的初值设为0,删掉定时器0中断中的TL0=0这句话,为什么led产生的现象就不对了呢(按键3无法一直控制占空比增加,按键4也无法一直控制占空比减少)。
          主函数中对占空比增加的控制,为什么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--;
            }
          }
     }
   
}


回复

使用道具 举报

ID:342451 发表于 2020-2-22 12:49 | 显示全部楼层
PWM输出用一个定时器就ok了,给你一段参考
void Timer1() interrupt 3
{
        static u16 p;
        TH1=0XFC;        //给定时器赋初值,定时1ms
        TL1=0X18;
        /****电机控制****/
        p++;
        if(p<PWM)EN=1;
        if(p>=PWM)EN=0;
        if(p==10)p=0;//周期10*1ms
}
改变PWM只需要用按键改变变量PWM的值即可,这样就可以输出一个频率固定,占空比可调的PWM波
回复

使用道具 举报

ID:687423 发表于 2020-2-22 15:39 | 显示全部楼层
之一知足 发表于 2020-2-22 12:49
PWM输出用一个定时器就ok了,给你一段参考
void Timer1() interrupt 3
{

能把程序发完整吗,你这个PWM是怎么变化的啊。
回复

使用道具 举报

ID:687423 发表于 2020-2-22 15:42 | 显示全部楼层
之一知足 发表于 2020-2-22 12:49
PWM输出用一个定时器就ok了,给你一段参考
void Timer1() interrupt 3
{

如果PWM只是单纯由按键控制的话,这个程序实现不了啊
回复

使用道具 举报

ID:342451 发表于 2020-2-22 18:09 | 显示全部楼层
。。jj 发表于 2020-2-22 15:39
能把程序发完整吗,你这个PWM是怎么变化的啊。

你仔细看下这个定时器中断函数里代码什么意思,EN就是随便定义的一个IO口,P和PWM是个变量,假如PWM值是4,p每1ms加一,所以前4ms EN是高电平,后6ms 输出低电平,这不就是一个占空比40%的波形么
回复

使用道具 举报

ID:687423 发表于 2020-2-23 15:29 | 显示全部楼层
之一知足 发表于 2020-2-22 18:09
你仔细看下这个定时器中断函数里代码什么意思,EN就是随便定义的一个IO口,P和PWM是个变量,假如PWM值是4 ...

你这个我试过了啊,根本无法控制。
void delay(ui i)
{
        while(i--);
}
void init()
{
        TMOD=0x01;
        TH0=0XFC;
        TL0=0X18;
        EA=1;
        TR0=1;
        ET0=1;
}
void anjian()
{
        if(key4==0)
        {
                delay(1000);
                if(key4==0)
                {
                        i++;
                }
        }
        while(!key4);
}
void main()
{
        while(1)
        {
                if(p>i)
                {
                        pwm=1;
                }
                else
                        pwm=0;
        }
}
void init1() interrupt 1
{
        TH0=0XFC;
        TL0=0X18;
        p++;
        if(p>10)
                p=0;       
}
回复

使用道具 举报

ID:462827 发表于 2020-2-23 17:32 | 显示全部楼层
一个定时器就够了呀
回复

使用道具 举报

ID:342451 发表于 2020-2-23 18:04 | 显示全部楼层
。。jj 发表于 2020-2-23 15:29
你这个我试过了啊,根本无法控制。
void delay(ui i)
{

。。。你按键程序好像没有放到循环里面吧
回复

使用道具 举报

ID:679425 发表于 2020-2-24 10:04 | 显示全部楼层
PWM只是单纯由按键控制的话,这个程序实现不了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表