×
单片机 > 单片机程序设计 > 详情

MEGA8做的呼吸灯

发布时间:2020-06-04 发布时间:
|
利用mega8的PWM做了一款简单的双色呼吸灯,呼吸频率可以调节。由于程序中还有其他功能,只将呼吸灯部分程序整理如下。

 /******************************************************************************
* 头文件设定
******************************************************************************/
#include
#include
#include "ADC.c"

#define  ledkey   (PIND & 0x08)


unsigned char KEY_Flag;
unsigned int i;


/******************************************************************************
* 函 数 名:    Delay_nus(unsigned int n)
* 功能描述:    延时函数
* 参    数:    延时参数:unsigned int n;
* 返 回 值:    无   
* 备    注:    ...
******************************************************************************/
void Delay_nus(unsigned int n)
{
 unsigned int  a,b;

 for (a = 0; a   for (b = 0; b<8; b++);
}

/******************************************************************************
* 函 数 名:    Delay_nms(unsigned int n)
* 功能描述:    延时函数
* 参    数:    延时参数:unsigned int n;
* 返 回 值:    无   
* 备    注:    ...
******************************************************************************/
void Delay_nms(unsigned int n)
{
 unsigned int  a,b;

 for (a = 0; a  {
  Delay_nus(1000);
 }
}

 

/******************************************************************************
* 函 数 名:    KEY()
* 功能描述:    按键函数
* 参    数:    无
* 返 回 值:    无   
* 备    注:    ...
******************************************************************************/
void KEY(void)
{
 if(ledkey == 0)   //按键长按2s后启动
     Delay_nus(5);         //延时等待按键2S
 if(ledkey == 0)   //如果按键依然按下,执行相应动作      
 {
  KEY_Flag++;    //按键标志位加1
  if(KEY_Flag>3)   //按键标志位只能为1或0
  {
      KEY_Flag=0;  
  }
  while(ledkey == 0);  //软件消抖
    }


/******************************************************************************
* 函 数 名:    delay()
* 功能描述:    延时函数
* 参    数:    无
* 返 回 值:    无   
* 备    注:    ...
******************************************************************************/
void delay(void)
{
 unsigned char i,j;
 for(i=5000;i--;i>1)
 for(j=500;j--;j>1);
}


/******************************************************************************
* 函 数 名:    main()
* 功能描述:    主函数
* 参    数:    无
* 返 回 值:    无   
* 备    注:    ...
******************************************************************************/
void main()
{
 unsigned char a; 
 PORTB = 0XFF;
 DDRD = 0XF0;
 delay();

 TCCR1A=0Xa2;
 TCCR1B=0X1B;

 ICR1 = 124;

 OCR1B=1;
 OCR1A=1;
 while(1)
 {
  KEY();
  a++;
  OCR1A=a;
  OCR1B=a;
  delay();
  if(a>122)
  {
   while(1)
   {
    KEY();
    if(KEY_Flag == 0)
    {
     DDRB &=0XF2;
    }
    if(KEY_Flag == 1)
    {
     DDRB &=0XF4;
    }
    if(KEY_Flag == 2)
    {
      PORTD =0X10;
    }
    if(KEY_Flag == 3)
    {
     PORTD =0X00;
    }
    a--;
    OCR1B=a;
    OCR1A=a;
    delay();
    if(a==1)    //最小值
    {
     break;    //跳出while
    }
   }
  }
 }
}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义