找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3405|回复: 14
打印 上一主题 下一主题
收起左侧

单片机定时器PWM调光问题

[复制链接]
跳转到指定楼层
楼主
ID:499742 发表于 2019-3-30 10:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面的程序直接改成定时器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;
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:451718 发表于 2019-3-30 12:53 | 只看该作者
是我浏览器出问题了么? 怎么看不到你下面的代码
回复

使用道具 举报

板凳
ID:499742 发表于 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     //  
                 }
}
回复

使用道具 举报

地板
ID:499742 发表于 2019-3-30 16:05
robinsonlin 发表于 2019-3-30 12:53
是我浏览器出问题了么? 怎么看不到你下面的代码

第一次发帖不知道为啥看不见后面得程序,可以加个Q1105669801不,请教一下

5#
ID:56665 发表于 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;
回复

使用道具 举报

6#
ID:499742 发表于 2019-3-31 18:57 | 只看该作者
可以看到全部程序了
回复

使用道具 举报

7#
ID:160500 发表于 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. }
复制代码
回复

使用道具 举报

8#
ID:160500 发表于 2019-3-31 20:34 | 只看该作者
AUXR是用STC的单片机时的设置,定时器中断程序要改成T1的。
回复

使用道具 举报

9#
ID:388197 发表于 2019-3-31 21:22 | 只看该作者
如果注释掉的部分是配置T1的,应该寄存器配置有误吧,传统51 配置T1模式应该是TMOD高4位,具体多少不记得了,但应该不是配置低4位的0X02.像中断设置这些最好还是用工具,省得自己去记.
回复

使用道具 举报

10#
ID:160500 发表于 2019-4-1 13:05 | 只看该作者
这么短的定时时间,51忙的过来吗?
回复

使用道具 举报

11#
ID:499742 发表于 2019-4-1 19:25 | 只看该作者
liuzx66 发表于 2019-3-31 20:34
AUXR是用STC的单片机时的设置,定时器中断程序要改成T1的。

谢谢,受教了
回复

使用道具 举报

12#
ID:230975 发表于 2020-4-17 22:15 | 只看该作者
liuzx66 发表于 2019-3-31 20:32
如果T0可以的话,T1也是可以的。不能运行是因为你设置的不对。参考下面的代码:

他的设置怎么不对的?你的这个设置没有开总中断,定时器1中断也没开
回复

使用道具 举报

13#
ID:230975 发表于 2020-4-17 22:16 | 只看该作者
liuzx66 发表于 2019-4-1 13:05
这么短的定时时间,51忙的过来吗?

51忙的过来。新的1T的单片机比这个时间还要短。
回复

使用道具 举报

14#
ID:230975 发表于 2020-4-17 22:26 | 只看该作者
金满堂 发表于 2019-3-30 16:02
#include

typedef unsigned char uint8;

这个程序你用定时器0,测试过没有问题吗。测试了你的程序有些问题。
回复

使用道具 举报

15#
ID:230975 发表于 2020-4-17 22:32 | 只看该作者
void init()  //51 定时器1模式2 8位自动装填,50US
{
  TMOD=0X20;
  TH1=0XCE;
  TL1=0XCE;
  EA=1;
  ET1=1;
  TR1=1;
}
回复

使用道具 举报

16#
ID:230975 发表于 2020-4-17 22:33 | 只看该作者
你这个程序我调试了一下,用T0,DOWN键按下有问题的。你可以试下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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