找回密码
 立即注册

QQ登录

只需一步,快速开始

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

如何用51单片机实现呼吸灯(2秒变亮,4秒变暗)

[复制链接]
跳转到指定楼层
楼主
ID:613250 发表于 2020-10-4 15:56 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
是利用占空比吗?比如我把初始占空比设为50%,每次增加2%,到90%时,再每次减少1%,到50%.这样可行吗?还有pwm的周期一般设为多少合适。再者,利用proteus如何看到呼吸灯的效果。初学51,求各路大佬赐教!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:138956 发表于 2020-10-4 18:50 | 只看该作者

//包含该文件可以使用_nop_()函数
#include <intrins.h>

unsigned int Num=0;         //声明递增 递减变量
unsigned int Clock=3000;  //声明变量 这个变量就是肉眼看到的变快变慢的参数

/***********************************************
函数名称:Delay_us
功    能:
入口参数:us:延时
返 回 值:无        
备    注:内部时钟:24MHz           
************************************************/
void Delay_us(unsigned int i) //这个延时就是PWM的频率了 太大眼睛能看到闪来闪去
{
        for(;i>0;i--)               
                _nop_();        
}
/***********************************************
函数名称:husi_led
功    能:呼吸灯
入口参数:us:延时数量
返 回 值:无        
备    注:
************************************************/
void husi_led(void)
{
while(1)
   {
      for(Num=Clock;Num>0;Num--) //led逐渐变暗
          {                        
       P05=1;                       //测试LED灯                        
       Delay_us(Num);         //3000慢慢减 慢慢变暗
       P05=0;                       //测试LED灯                                         
       Delay_us(Clock-Num);     
          }                                       
       P05=0;                  //测试LED灯
//**************************************//                                       
      for(Num=0;Num<Clock;Num++)  //led逐渐变亮
         {
       P05=1;                     //测试LED灯
       Delay_us(Num);       //0慢慢加 慢慢变亮
       P05=0;                     //测试LED灯            
       Delay_us(Clock-Num);                                                   
         }                                       
       P05=1;                    //测试LED灯
         }
}
大致是变亮3秒,变暗3秒,你看看吧!
回复

使用道具 举报

板凳
ID:825447 发表于 2020-10-4 21:28 | 只看该作者
你在延时函数上稍加改动即可
声明延时函数void delay(uint)
然后主函数
void main()
{}
在主函数里加上延时函数delay(m)//此处m值你可以直接改,m值改变延时用的时间也随之改变了
最后再写下具体的延时函数
void delay(uint m)
{
  uint x , y ;
  for(x = m ; x > 0 ; x-- )
     for(y = 110 ; y > 0 ; y--);
}
想要具体调时间可以用keil里面的调试器,设置断点执行
回复

使用道具 举报

地板
ID:337139 发表于 2020-10-5 20:43 | 只看该作者
有多种方法的呀!占空比是其中一种,频率在nHz比较好。看得清楚一些。二三楼的方法也是可取的。楼主你试一下。多调试就OK了。
回复

使用道具 举报

5#
ID:613250 发表于 2020-10-5 21:40 | 只看该作者
长风007 发表于 2020-10-5 20:43
有多种方法的呀!占空比是其中一种,频率在nHz比较好。看得清楚一些。二三楼的方法也是可取的。楼主你试一 ...

嗯,nHz大概是多少
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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