找回密码
 立即注册

QQ登录

只需一步,快速开始

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

pwm语法 看起来没问题 但是改变占空比 效果没改变 求解

[复制链接]
ID:60244 发表于 2017-11-10 14:56 | 显示全部楼层 |阅读模式
20黑币
使用定时器   让P2^3口(小灯)    发送PWM   占空比是固定值
想用  if   判断语句实现   控制高低电平时间
但是改变高低电平的分配时间   灯的亮度不发生改变  
求个详细解答    程序如下
#include "reg52.h"                         

typedef unsigned int u16;         
typedef unsigned char u8;

sbit PWM=P2^3;          //--定义使用的IO口--//

u16 timer1;                   //--定义一个全局变量--//

void Timer1Init()
{
        TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。

        TH1 = 0xFF;
        TL1 = 0xff;   //1us
               
        ET1=1;//打开定时器1中断允许
        EA=1;//打开总中断
        TR1=1;//打开定时器                       
}

void main()
{       
        Timer1Init();  //定时器1初始化
        while(1)         
        {       
                        if(timer1>1000)                //设定周期
                        {
                                timer1=0;                 //周期归零
                                if(timer1<=100)        //调占空比   改变此值  小灯亮度没变化,求解释@@##¥%……
                                {
                                        PWM=1;                 
                                }
                                else
                                {  
                                        PWM=0;
                                }
                        }
                       
        }               
}

void Time1(void) interrupt 3    //3 为定时器1的中断号
{
        TH1 = 0xFF;
        TL1 = 0xff;   //1us
        timer1++;

       
}

最佳答案

查看完整内容

中断设置为1us是不合理的。 你想一想,CPU执行一条指令需要多少时间? 另外:CPU在下列情况下是不能响应中断的: 1、当一条指令正在执行中,尚未完成时; 2、当本中断已被响应后,尚未 RETI 时; 你想想,如此。你的中断还能不能每隔1uS中断一次呢? 另外你的主程序还有没有办法顺利地执行下去吗?会不会一个中断接着一个中断地到来? 改一下程序吧,学习不认真的家伙。
回复

使用道具 举报

ID:123289 发表于 2017-11-10 14:57 | 显示全部楼层
中断设置为1us是不合理的。
你想一想,CPU执行一条指令需要多少时间?
另外:CPU在下列情况下是不能响应中断的:
1、当一条指令正在执行中,尚未完成时;
2、当本中断已被响应后,尚未 RETI 时;
你想想,如此。你的中断还能不能每隔1uS中断一次呢?
另外你的主程序还有没有办法顺利地执行下去吗?会不会一个中断接着一个中断地到来?
改一下程序吧,学习不认真的家伙。
回复

使用道具 举报

ID:219796 发表于 2017-11-10 23:09 来自手机 | 显示全部楼层
思路不错,但同楼上说法,1us的延迟没啥意义,你定个毫秒的定时还差不多
回复

使用道具 举报

ID:246473 发表于 2017-11-11 10:21 来自手机 | 显示全部楼层
定时的频率搞低一点,频率太高,51单片机速度跟不上
回复

使用道具 举报

ID:248346 发表于 2017-11-11 14:16 | 显示全部楼层
定时中断时间太短了,主函数差不多一直卡着不动了
回复

使用道具 举报

ID:126608 发表于 2017-11-11 18:41 | 显示全部楼层
1u秒上面TH1等于0xff,写成大写的0xFF了。
回复

使用道具 举报

ID:248503 发表于 2017-11-11 23:24 | 显示全部楼层
if(timer1>1000)                //设定周期
                     //   {
                                timer1=0;                 //周期归零
                                if(timer1<=100)        //调占空比   改变此值  小灯亮度没变化,求解释@@##¥%……
                                {
                                        PWM=1;                 
                                }
                                else
                                {  
                                        PWM=0;
                                }
                    //    }
回复

使用道具 举报

ID:60244 发表于 2017-11-13 08:44 | 显示全部楼层
谢谢 各位   
回复

使用道具 举报

ID:248822 发表于 2017-11-13 09:20 | 显示全部楼层
中断执行时间过短了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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