找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10486|回复: 6
收起左侧

[求助]呼吸灯的编程思路(C语言)

[复制链接]
ID:43384 发表于 2012-7-29 00:59 | 显示全部楼层 |阅读模式
 呼吸灯的代码怎么写呀,灯的状态不是只有亮和灭两种么?难道还可以设置不同的亮度?
回复

使用道具 举报

ID:1 发表于 2012-7-29 01:00 | 显示全部楼层

用pwm啊   脉宽调制

回复

使用道具 举报

ID:27916 发表于 2012-7-29 12:46 | 显示全部楼层

忽明忽暗

 

 

 

 

回复

使用道具 举报

ID:134288 发表于 2016-7-30 21:55 | 显示全部楼层
admin 发表于 2012-7-29 01:00
用pwm啊   脉宽调制

虽说可以用pwm,但就是不理解原理,脉宽调制他的输出也只有高电平和低电平啊,是不是还得加da转换
回复

使用道具 举报

ID:94554 发表于 2016-7-31 08:18 | 显示全部楼层
/***************************************************************  
* 程序说明:使用P3.2和P3.4来控制P0端口的LED灯,达到手动调节渐亮或渐灭(也可一直按着),  
            到最亮或最暗时蜂鸣器发出提示声音;  
////////////////////////////////////////////////////////////////
晶振 11.0592M
* 利用定时器控制产生占空比可变的 PWM 波  
* 按int0键,PWM值增加,则占空比减小,LED 灯渐暗。  
* 按t0键,PWM值减小,则占空比增加,LED 灯渐亮。  


什么是PWM技术?简而言之,PWM是一种对模拟信号电平进行数字编码的方法。通过计
数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然
是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。
电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即
是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟
值都可以使用PWM进行编码。
MCS-51系列单片机本身无PWM输出功能, 但可以采用定时器配合软件的方法对输出脉冲进行调
宽来模拟实现,对精度要求不是太高的场合是非常实用的。
****************************************************************/   
   
#include  <reg52.h >   
#include  <intrins.h >   
sbit S1 =P3^2;  //定义P3.2为增加键   
sbit S2 =P3^4;  //定义P3.3为减少键   
sbit leds =P1^4;  //定义P3.3为减少键
sbit  BELL =P2^2;   //定义蜂鸣器   
unsigned char PWM=0x7f; //PWM赋初值   
void Bee();   
void delayms(unsigned char ms);   
void delay(unsigned char t);   
   
/*--------------------------------------------------*/   
void main() //主程序   
{     
    leds =0;
    P0=0xff;   
    TMOD=0x21;   
    TH0=0xfc;   //1ms延时常数   
    TL0=0x66;   //频率调节   
   
    TH1=PWM ;   //脉宽调节   
    TL1=0 ;   
   
     EA=1;   
     ET0=1;   
     ET1=1;   
      
     TR0=1 ;   
   
   while(1)   
   {   
     do{   
            if(PWM!=0xff)   
           {PWM++ ;delayms(10);}   
           else Bee();   
         }   
     while(S1==0);   
   
     do{   
           if(PWM!=0x02)   
          {PWM-- ;delayms(10);}   
           else Bee() ;   
          }   
     while(S2==0);   
   }   
}   
   
// ---------------------------定时器0中断服务程序   
void timer0() interrupt 1   
{     
    TR1=0;   
    TH0=0xfc;   
    TL0=0x66;   
    TH1=PWM;   
    TR1=1;   
    P0=0x7f ;   //启动输出   
}   
   
//---------------------------- 定时器1中断服务程序   
void timer1() interrupt 3   
{   
    TR1=0 ;   
    P0=0xff ;   //结束输出   
}   
   
//-------------------------------蜂鸣器子程序   
void Bee()        
  {   
      unsigned char i  ;   
      for (i=0  ;i<100  ;i++)   
        {   
          delay(100)  ;   
          BELL=!BELL  ;//BeLL取反   
        }   
     BELL=1  ;                            //关闭蜂鸣器   
     delayms(100);   
  }   
   
//-------------------------------- 延时子程序1   
void delay(unsigned char t)   
{   
    while(t--);   
}   
   
//--------------------------------- 延时子程序2   
void delayms(unsigned char ms)   
   
{   
    unsigned char i;   
    while(ms--)   
     {   
        for(i=0;i<120;i++);   
     }   
}  
回复

使用道具 举报

ID:180018 发表于 2017-3-24 21:47 | 显示全部楼层
没用呀
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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