标题: 单片机定时器PWM调光问题 [打印本页]

作者: 金满堂    时间: 2019-3-30 10:44
标题: 单片机定时器PWM调光问题
下面的程序直接改成定时器1和定时器1中断就不行,为什么呢?求高手指点


#include <reg52.h>


typedef unsigned char uint8;
typedef unsigned int  uint16;
sbit out=P2^1;     //LED输出
//sbit POWER = P3 ^ 3; //ON/OFF开关键


sbit down = P3^0;
作者: robinsonlin    时间: 2019-3-30 12:53
是我浏览器出问题了么? 怎么看不到你下面的代码
作者: 金满堂    时间: 2019-3-30 16:02
robinsonlin 发表于 2019-3-30 12:53
是我浏览器出问题了么? 怎么看不到你下面的代码



#include <reg52.h>

typedef unsigned char uint8;
typedef unsigned int  uint16;

sbit out=P2^1;     //LED输出
//sbit POWER = P3 ^ 3; //ON/OFF开关键
sbit down = P3^0;        // 增加亮度按钮
sbit up = P3^1;                // 减小亮度按钮


uint8 t = 0;
uint8 PWM_T = 0;   //占空比控制变量,亮暗快慢变量

void delay_1ms(uint16 t)
{
        uint16 x,y;
        for(x=t;x>0;x--)
                for(y=120;y>0;y--);
}

void Timer0Init()
{

    TMOD|=0x02;     //定时器0工作方式2,TH0是重装值,TL0是初值
        TH0=200;//210;  //写入预置初值(取值1-255,数越大PWM频率越高)
        TL0=200;//210;  //写入预置值 (取值1-255,数越大PWM频率越高)
        TR0=1;       //启动定时器
        ET0=1;       //允许定时器0中断
        EA=1;        //允许总中断               
//    TMOD|=0x02;     //定时器0工作方式2,TH0是重装值,TL0是初值
//        TH1=200;//210;  //写入预置初值(取值1-255,数越大PWM频率越高)
//        TL1=200;//210;  //写入预置值 (取值1-255,数越大PWM频率越高)
//        TR1=1;       //启动定时器
//        ET1=1;       //允许定时器0中断
//        EA=1;        //允许总中断
}
         
/****************************************************
                  主程序
****************************************************/

void main(void)      
{

    Timer0Init();
        out=1;         //初始化输出端口
        PWM_T=20;//亮度初值;
         while(1)      
       
         {   
                   if(!up)
                         {
                                if(PWM_T<250)
                                        {
                                          PWM_T++;
                                        }
                               
                                delay_1ms(10);
                        }
                 if(!down)
                         {

                                if(PWM_T>2)
                                        {
                                          PWM_T--;

                                        }
                               
                                delay_1ms(10);
                        }

       
         }      
}
/****************************************************
               /定时器0中断模拟PWM
****************************************************/

void tim0_isr (void) interrupt 1 //定时器0中断服务函数
{
         t++;            //每次定时器溢出加1         
         if(t==50)       //PWM周期 100个单位
                 {
                  t=0;   //使t=0,开始新的PWM周期
                  out=0; //LED输出0
                 }
         
         if(PWM_T==t)   //按照当前占空比切换输出为高电平
                 {  
                         out=1;  //LED输出1     //  
                 }
}

作者: m182892    时间: 2019-3-30 16:47
只显示这几行
#include <reg52.h>


typedef unsigned char uint8;
typedef unsigned int  uint16;
sbit out=P2^1;     //LED输出
//sbit POWER = P3 ^ 3; //ON/OFF开关键


sbit down = P3^0;

作者: 金满堂    时间: 2019-3-31 18:57
可以看到全部程序了
作者: liuzx66    时间: 2019-3-31 20:32
如果T0可以的话,T1也是可以的。不能运行是因为你设置的不对。参考下面的代码:
  1. void Timer1Init(void)                //56微秒@12.000MHz
  2. {
  3.         AUXR &= 0xBF;                //定时器时钟12T模式
  4.         TMOD &= 0x0F;                //设置定时器模式
  5.         TMOD |= 0x20;                //设置定时器模式
  6.         TL1 = 0xC8;                //设置定时初值
  7.         TH1 = 0xC8;                //设置定时重载值
  8.         TF1 = 0;                //清除TF1标志
  9.         TR1 = 1;                //定时器1开始计时
  10. }
复制代码

作者: liuzx66    时间: 2019-3-31 20:34
AUXR是用STC的单片机时的设置,定时器中断程序要改成T1的。
作者: cjm82    时间: 2019-3-31 21:22
如果注释掉的部分是配置T1的,应该寄存器配置有误吧,传统51 配置T1模式应该是TMOD高4位,具体多少不记得了,但应该不是配置低4位的0X02.像中断设置这些最好还是用工具,省得自己去记.
作者: liuzx66    时间: 2019-4-1 13:05
这么短的定时时间,51忙的过来吗?
作者: 金满堂    时间: 2019-4-1 19:25
liuzx66 发表于 2019-3-31 20:34
AUXR是用STC的单片机时的设置,定时器中断程序要改成T1的。

谢谢,受教了
作者: hmgqljz111    时间: 2020-4-17 22:15
liuzx66 发表于 2019-3-31 20:32
如果T0可以的话,T1也是可以的。不能运行是因为你设置的不对。参考下面的代码:

他的设置怎么不对的?你的这个设置没有开总中断,定时器1中断也没开
作者: hmgqljz111    时间: 2020-4-17 22:16
liuzx66 发表于 2019-4-1 13:05
这么短的定时时间,51忙的过来吗?

51忙的过来。新的1T的单片机比这个时间还要短。
作者: hmgqljz111    时间: 2020-4-17 22:26
金满堂 发表于 2019-3-30 16:02
#include

typedef unsigned char uint8;

这个程序你用定时器0,测试过没有问题吗。测试了你的程序有些问题。
作者: hmgqljz111    时间: 2020-4-17 22:32
void init()  //51 定时器1模式2 8位自动装填,50US
{
  TMOD=0X20;
  TH1=0XCE;
  TL1=0XCE;
  EA=1;
  ET1=1;
  TR1=1;
}
作者: hmgqljz111    时间: 2020-4-17 22:33
你这个程序我调试了一下,用T0,DOWN键按下有问题的。你可以试下




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1