找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3673|回复: 16
收起左侧

单片机控制led灯微亮,用的1Khz,占空比50%的信号给LED灯

[复制链接]
ID:508684 发表于 2019-4-29 16:57 | 显示全部楼层 |阅读模式
请教各位,我想让led灯微亮,用的1Khz,占空比50%的信号给LED灯,但是用Prouse仿真时,灯老是闪烁,请问有没有老是知道这是为什么?怎么解决这个问题呢?

单片机源程序如下:
#include<reg52.h>
sbit light1=P1^4;
sbit light2=P1^5;
void main()
{
    TMOD=0X01;
        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        light2=0;
        while(1);
        {
        }
}
void temp() interrupt 1
{
    TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;
        light1=~light1;
}


回复

使用道具 举报

ID:96682 发表于 2019-4-29 20:34 | 显示全部楼层
软件仿真模拟不了高频率的,不能期望太高只能以实物为准
回复

使用道具 举报

ID:213173 发表于 2019-4-29 20:42 | 显示全部楼层
用Prouse仿真呼吸灯不可能得到想象的结果。
回复

使用道具 举报

ID:508684 发表于 2019-4-30 20:10 | 显示全部楼层
wc86110 发表于 2019-4-29 20:34
软件仿真模拟不了高频率的,不能期望太高只能以实物为准

原来是这样啊,老师我用实物也实验了,但是灯没有微亮的效果,老师有没有控制灯微亮的方法吗
回复

使用道具 举报

ID:508684 发表于 2019-4-30 20:12 | 显示全部楼层
wulin 发表于 2019-4-29 20:42
用Prouse仿真呼吸灯不可能得到想象的结果。

这样啊,老师我用实物也实验了,但是灯没有微亮的效果,我这样做灯要么和原来一样全亮,要么就闪烁的厉害,没有微亮的效果,老师有没有什么方法呢
回复

使用道具 举报

ID:508684 发表于 2019-4-30 20:13 | 显示全部楼层
wc86110 发表于 2019-4-29 20:34
软件仿真模拟不了高频率的,不能期望太高只能以实物为准

除了使用两个不同的电阻的方法
回复

使用道具 举报

ID:508684 发表于 2019-4-30 20:13 | 显示全部楼层
wulin 发表于 2019-4-29 20:42
用Prouse仿真呼吸灯不可能得到想象的结果。

除了使用两个不同的电阻的方法
回复

使用道具 举报

ID:96682 发表于 2019-4-30 23:03 | 显示全部楼层
通过修改程序实现呗
回复

使用道具 举报

ID:213173 发表于 2019-4-30 23:38 | 显示全部楼层
吴育竹 发表于 2019-4-30 20:13
除了使用两个不同的电阻的方法

给你一个呼吸灯程序,P1接LED
  1. #include<reg52.h>
  2. typedef unsigned char uchar;
  3. typedef unsigned int uint;

  4. uint count=0,time0=0,time1=0,DIR=0;

  5. void main( )
  6. {       
  7.         while (1)
  8.         {
  9.                 time0++;
  10.                 count++;
  11.                 if(count>=80)
  12.                 {
  13.                         count=0;
  14.                         if(DIR==0)
  15.                         time1++;
  16.                         else
  17.                         time1--;               
  18.                 }
  19.                 if(time1>=500)
  20.                         DIR=1;
  21.                 if(time1==0)
  22.                         DIR=0;
  23.                 if(time0>=500)
  24.                         time0=0;
  25.                 if(time0<=time1)
  26.                         P1=0x00;
  27.                 else
  28.                         P1=0xff;
  29.         }
  30. }
复制代码
回复

使用道具 举报

ID:508684 发表于 2019-5-1 11:02 | 显示全部楼层
wulin 发表于 2019-4-30 23:38
给你一个呼吸灯程序,P1接LED

老师我呼吸灯程序看的懂了,我自己改了程序,但是效果不理想,我用P3^4连了一个红外热释传感器,用P1^7连接了一个LED灯观察效果,我达到的效果是,有人来高亮,无人来微亮,老师能看看我的程序吗/*设置一个定时器,控制P20口输出PWM,频率为100HZ,占空比可调,热释检测有无人控制占空比*/
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char                                                                                               
sbit PWM=P1^7;
sbit LED1=P1^3;//LED1常亮作为跟PWM输出时的亮度对比
sbit reshi=P3^4;//控制占空比
uchar time;
uint num;
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}


void main()
{
        num=0;
        TMOD=0x01;//定时器0工作方式1
        TH0=(65536-100)/256;
        TL0=(65536-100)%256;//赋值定时0.1ms
        EA=1;
        ET0=1;
        TR0=1;
        while(1)
        {
                LED1=0;        
                while(reshi==0)//无人高亮
                {
                        delay(5);
                        while(reshi==0)
                        {
                                num=20;
                              
                        }
                }
                while(reshi==1)//有人微亮
                {
                        delay(5);
                        while(reshi==1)
                        {
                                num=0;
                              
                        }
                }
        }        
}


void timer0() interrupt 1
{
        TR0=0;//赋值时先关闭定时器
        TH0=(65536-100)/256;
        TL0=(65536-100)%256;//赋值定时0.1ms
        TR0=1;//再从新打开定时器
        time++;
        if(time>=100) time=0;//0.1ms*100=10ms,即100HZ;
        if(time<=num) PWM=0;
        else PWM=1;


}
回复

使用道具 举报

ID:213173 发表于 2019-5-1 15:34 | 显示全部楼层
吴育竹 发表于 2019-5-1 11:02
老师我呼吸灯程序看的懂了,我自己改了程序,但是效果不理想,我用P3^4连了一个红外热释传感器,用P1^7连 ...

优化了一下,你试试。
  1. #include<reg52.h>
  2. typedef unsigned char uchar;
  3. typedef unsigned int uint;
  4. sbit PWM=P1^7;
  5. sbit LED1=P1^3;//LED1常亮作为跟PWM输出时的亮度对比
  6. sbit reshi=P3^4;//控制占空比
  7. uint count=0,time0=0,time1=0,DIR=0;

  8. void main( )
  9. {       
  10.         LED1=0;        //常亮
  11.         time1=30;//初始亮度
  12.         while (1)
  13.         {
  14.                 count++;
  15.                 if(count>=100)//计数延时(渐亮/暗速度)
  16.                 {
  17.                         count=0;
  18.                         if(reshi==0)//无人高亮
  19.                         {
  20.                                 if(time1<500)
  21.                                         time1++;
  22.                         }
  23.                         else if(time1>30)//有人微亮               
  24.                                 time1--;               
  25.                 }
  26.                 if(++time0>=500)
  27.                         time0=0;
  28.                 if(time0<=time1)
  29.                         PWM=0;
  30.                 else
  31.                         PWM=1;
  32.         }
  33. }
复制代码
回复

使用道具 举报

ID:452817 发表于 2019-5-1 16:01 | 显示全部楼层
我只能说仿真和现实是有差距的
回复

使用道具 举报

ID:395068 发表于 2019-5-2 14:43 | 显示全部楼层
你要微亮占空比就不能是50了,50的话高电平的时间和低电平的时间一样的,怎么可能微亮呢
回复

使用道具 举报

ID:365802 发表于 2019-5-3 08:39 | 显示全部楼层
之前实现过, 思路是这样的, PWM频率一定, 改变PWM的占空比就可以控制亮度了哦.
回复

使用道具 举报

ID:508684 发表于 2019-5-3 13:18 | 显示全部楼层
wulin 发表于 2019-5-1 15:34
优化了一下,你试试。

老师你这个哪部分程序是占空比程序,哪部分是控制占空比大小的 呢
回复

使用道具 举报

ID:508684 发表于 2019-5-3 13:19 | 显示全部楼层
ping264888 发表于 2019-5-3 08:39
之前实现过, 思路是这样的, PWM频率一定, 改变PWM的占空比就可以控制亮度了哦.

我用P3^4连了一个红外热释传感器,用P1^7连接了一个LED灯观察效果,我想达到的效果是,有人来高亮,无人来微亮,老师能看看我的程序吗,请问你说的占空比频率和占空比大小控制是在哪部分改动呢/*设置一个定时器,控制P20口输出PWM,频率为100HZ,占空比可调,热释检测有无人控制占空比*/
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char                                                                                                
sbit PWM=P1^7;
sbit LED1=P1^3;//LED1常亮作为跟PWM输出时的亮度对比
sbit reshi=P3^4;//控制占空比
uchar time;
uint num;
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}


void main()
{
        num=0;
        TMOD=0x01;//定时器0工作方式1
        TH0=(65536-100)/256;
        TL0=(65536-100)%256;//赋值定时0.1ms
        EA=1;
        ET0=1;
        TR0=1;
        while(1)
        {
                LED1=0;        
                while(reshi==0)//无人高亮
                {
                        delay(5);
                        while(reshi==0)
                        {
                                num=20;
                              
                        }
                }
                while(reshi==1)//有人微亮
                {
                        delay(5);
                        while(reshi==1)
                        {
                                num=0;
                              
                        }
                }
        }        
}


void timer0() interrupt 1
{
        TR0=0;//赋值时先关闭定时器
        TH0=(65536-100)/256;
        TL0=(65536-100)%256;//赋值定时0.1ms
        TR0=1;//再从新打开定时器
        time++;
        if(time>=100) time=0;//0.1ms*100=10ms,即100HZ;
        if(time<=num) PWM=0;
        else PWM=1;


}
回复

使用道具 举报

ID:525872 发表于 2019-5-4 12:44 | 显示全部楼层
调节脉宽占空比啊,你的是500HZ的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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