找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请教单片机PWM控制3W led灯珠,开机为什么要闪一下?

[复制链接]
跳转到指定楼层
楼主
如题,开机闪一下然后才正常,找了半天也没解决,请问是什么原因?



单片机源程序如下:
#include <reg52.H>
#include<intrins.h>
#include"Delay.h"
unsigned char Pwm_Duty =0;   //定义一个占空比变量
unsigned char PWM_Cnt=0;    //200us的变量/50HZ的%分之一

sbit PWM = P1^0;   //PWM输出

void Timer0Init(void)                //200微秒@12.000MHz
{
        TMOD &= 0xF0;                //设置定时器模式
        TMOD |= 0x01;                //设置定时器模式
        TL0 = 0x38;                  //设置定时初始值
        TH0 = 0xFF;                  //设置定时初始值
        TF0 = 0;                    //清除TF0标志
        ET0 = 1;
        EA = 1;
        TR0 = 1;                //定时器0开始计时

}
  void timer0_Routine(void) interrupt 1   //T0中断程序
{
        
        TL0 = 0x38;                         //重装始值
        TH0 = 0xFF;                         //重装始值
        PWM_Cnt++;
        if(PWM_Cnt>=100)       //计满100=20ms
        {
          PWM_Cnt=0;
        }

}
void Int0_Routine(void) interrupt 0
{
        static unsigned char PWM_KEY;  //static静态变量,保持按键值
        IT0=0;
        if(INT0==0)
        {
                Delay(20);
        }
        while(INT0==0);
        Delay(20);        
        
        PWM_KEY++;        //按键加一
        switch(PWM_KEY)
        {
                case 1:Pwm_Duty=10;break;   //占空比10%
                case 2:Pwm_Duty=20;break;
                case 3:Pwm_Duty=30;break;
                case 4:Pwm_Duty=40;break;
                case 5:Pwm_Duty=50;break;
                case 6:Pwm_Duty=60;break;
                case 7:Pwm_Duty=70;break;
                case 8:Pwm_Duty=80;break;
                case 9:Pwm_Duty=90;break;
                case 10:Pwm_Duty=100;break;
                case 11:Pwm_Duty=0;
                PWM_KEY=0;IT0=1; break;
                default:break;  //default语句冒号后都执行break
        }
}
        void main()
{
  PWM =0;
        IT0=0;   //外部中断电平触发
        EX0=1;   //外部中断0中断允许位
        EA=1;
        Timer0Init();        //定时器初始化函数

        while(1)
  {
     if(PWM_Cnt<Pwm_Duty)   //小于或等于设置的占空比
             {
                       PWM = 1;   //占空比输出
             }
                else
            PWM = 0;    //占空比输出        
  }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1004920 发表于 2023-12-20 14:31 | 只看该作者
你这个是硬件的问题,上电单片机IO口默认高电平,然后单片机初始化,才转为低电平。所以开机LED会亮一下。
回复

使用道具 举报

板凳
ID:883242 发表于 2023-12-20 14:31 | 只看该作者
AT89C52上电后,程序执行前,所有IO口都是高电平,当然让LED点亮了。
回复

使用道具 举报

地板
ID:1062320 发表于 2023-12-22 09:05 | 只看该作者
AT89c51上电初始化的时候 好像会使所有io高电平,如果要避免这个问题 要不试着让单片机控地而不是VCC
回复

使用道具 举报

5#
ID:1080935 发表于 2023-12-22 09:19 | 只看该作者
1、端口反相
2、换单片机
3、初始化(上电有延时,效果不理想)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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