среда, 24 июня 2015 г.

Простой бытовой таймер на микросхеме STC15F204EA (диапазон от 0 до 99 часов 59 минут)

Основные функции таймера:

        1. Установка времени таймера от 0 часов 0 минут до 99 часов 59 минут;
        2. При обратном отсчете во время последней минуты отображать только количество секунд;
        3. При достижении показаний экрана 00:00 включается звуковой сигнал продолжительностью 1 минута;
        4. Во время звучания сигнала достаточно нажать кнопки +, - для его отмены;

Принципиальная схема выглядит следующим образом:



Исходный код прошивки:

/************* Описание программы ****************************** 
Простой бытовой таймер на микросхеме STC15F204EA (диапазон от 0 до 99 часов 59 минут)

Основные функции таймера:

        1. Установка времени таймера от 0 часов 0 минут до 99 часов 59 минут;
        2. При обратном отсчете во время последней минуты отображать только количество секунд;
        3. При достижении показаний экрана 00:00 включается звуковой сигнал продолжительностью 1 минута;
        4. Во время звучания сигнала достаточно нажать кнопки +, - для его отмены;

Сайт: http://mynobook.blogspot.com/
Примечание: При использовании материалов данного сайта ссылка на него обязательна!
***************************************************/
#include <REG51.H>

//Цифровой индикатор:светодиодный многоразрядный цифровой семисегментный с общим анодом
unsigned char code table[]=
{0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,
0x01,0x09,0x11,0xC1,0x63,0x85,0x61,0x71,
0xFD,0xff};//0-9,A-F,-,выкл.

#define LED_D  P2    //Сегменты индикатора
#define LED_S  P3    //Разряды индикатора
sfr AUXR=0x8E;   //0000,0000 Вспомогательный регистр
sfr P3M0=0xB2; //P3 регистр статуса
sbit Beep=P1^3;//Пин зуммера
sbit K1=P1^0;  // Пин кнопки "Выбор"
sbit K2=P1^1;  // Пин кнопки "+"
sbit K3=P1^2;  // Пин кнопки "-"

unsigned char L,TZFlash,Ledcount,timeover,timestop,timeoversecend;
unsigned int  timecount;//Переменная секунд таймера
unsigned char H,M,S;
unsigned char cnt=0;//Переменная меню
unsigned char show[4]={0,0,0,0};
void delay(unsigned int x)
{
 while(x--);
}

//Функция управления цифровым дисплеем
void deal_show(void)
{
   if( (timeover==1)&&(timestop==0))//После окончания времени отсчета, дисплей начинает мигать
   {
      if(TZFlash==0) // дисплей погашен
      {
         show[0]=show[1]=show[2]=show[3]=0x11;
      }
      else           //Дисплей показывает "00:00"
      {
         show[0]=show[1]=show[2]=show[3]=0;
      }
   }
   else
   {
    if( (cnt!=0)&&(TZFlash==0) )  //Регулировка частоты мигания
    {
     switch(cnt)
     {
     case 1: show[0]=M%10; show[1]=M/10;
       show[2]=0x11; show[3]=0x11;break;
     case 2: show[0]=0x11; show[1]=0x11;
       show[2]=H%10; show[3]=H/10;break; 
     }
    }
    else
    {
     //Последнее минуту время отображается в секундах
         if( (M==0)&&(H==0)&&(cnt==0)&&(timeover==0) )
         {
            show[0]=S%10; show[1]=S/10;
        show[2]=0x11; show[3]=0x11;
         }
         else     //Нормальное отображение времени
         {
            show[0]=M%10; show[1]=M/10;
        show[2]=H%10; show[3]=H/10;
         } 
    }
   }
}

//Функция сигнала зуммера
void bell(void)
{
   unsigned char c;  
   Beep=0;
   for(c=0;c<100;c++)   //Сигнал, примерно каждые 30мс
      delay(1500);
   Beep=1;
}

void key(void)
{
 if(K1==0)   //Функции клавиш
 {
  bell();
      S=0;
      if(++cnt==3)//1=H;2=M;
      {
   cnt=0;S=3;  //После установки времени инициализация 3сек
         timeover=timestop=timeoversecend=0;
      }
  while(K1==0)deal_show();
 }
 if(K2==0)   //"+"
 {
  bell();
      if(cnt!=0)
  {
   switch(cnt)
   {
   case 1: if(++H==99) H=0; break;
   case 2: if(++M==60){M=0; S=0;}break;
   }
  }
      if(timeover==1)   //Отключение звука
         timestop=1;
      while(K2==0)deal_show();
 }
 if(K3==0)   //"-"
 {
  bell();
      if(cnt!=0)
  {
   switch(cnt)
   {
   case 1: if(H--==0) H=99; break;
   case 2: if(M--==0) {M=59; S=0;} break;
   }
  }
      if(timeover==1)   //Отключение звука
         timestop=1;
      while(K3==0)deal_show();
 }
}

void Timer0Init(void)  //2мс @ 12.000MHz
{
 AUXR |= 0x80; //Режим таймера
 TMOD &= 0xF0; //Установка режима таймера
 TL0 = 0x40;  //Установка начального значения
 TH0 = 0xA2;  //Установка начального значения
 TF0 = 0;     //Очистить значение TF0
 TR0 = 1;     //Начало отсчета таймера
 ET0 = 1;
}

void main ()
{
 Timer0Init();//Инициализация таймера, прерывание 2мс  
 EA=1;  //EA
 P3M0=0xf0; // набор выходных пинов P3
 timecount=Ledcount=timeover=timestop=timeoversecend=0;
   H=0;M=3;S=3;  //Начальное значение 3мин
 while(1)
 {
  deal_show();//Вывод на дисплей
  key();  //Опрос клавиш
 }
}

void time0(void) interrupt 1 //2мс
{
   if(++timecount==500) //1 секунда
 {
  timecount=0;
      if((timeover==0)&&(cnt==0))//Значение не достигло нормального времени
      {
     if( S--==0 )
     { 
      if(M--==0)
      { 
       if(H--==0)
               {
        timeover=1;
                  S=H=M=0;
               }
               else
                  M=59;
      }
            else
               S=59;
     }
      }
      else  //Время ожидания - одна минута
      {timeoversecend++;}
 }
 switch(timecount)  //Настройка сигнала
 {
  case 0:     TZFlash=0;L=1;  break;//Мигание
  case 50:     TZFlash=1;  break;
      case 100:  TZFlash=0;  break;
      case 150:  TZFlash=1;  break;
      case 200:  TZFlash=0;  break;
      case 250:  TZFlash=1;L=0;  break;//Мигание
  case 300:    TZFlash=0;  break;
      case 350:    TZFlash=1;  break;
      case 400:    TZFlash=0;  break;
      case 450:    TZFlash=1;  break;
      default:  break;
 }
   if((timeover==1)&&(timestop==0))//Время таймера не достигло конца
   {
      if(timeoversecend<60)   //Сигнал окончания, 1 мин=60сек
         Beep=TZFlash;
      else        //Время таймера окончено
      {
         timestop=1;
         timeoversecend=0;
      }
   }
 if(Ledcount++==4) //Сканирование разрядов индикатора
  Ledcount=0;
 LED_S = 0x0F;//Разряды индикатор,обнуление
 switch(Ledcount) //Секунды, запись 0x11
 {
  case 0: if((timeover==0)&&(show[3]==0))//Десятки часов
                  LED_D=table[0x11];   //Первый разряд=0, не отображается
               else
                  LED_D=table[show[3]]; break;
      case 1:  if(timeover==0)         //Позиция часов
               {
                  if(L==1)  //Мигание
                     LED_D=table[show[2]]&0xFE;
                  else  
                     LED_D=table[show[2]];
               }
               else     //Отображение секунд
                  LED_D=table[show[2]]&0xFE;
               break;           
      case 2: LED_D=table[show[1]]; break;//Десятки минут
      case 3: LED_D=table[show[0]]; break;//Минуты
  default: break;
 }
 LED_S=(0x10<<Ledcount); //Выбор позиции 
}
Оригинал статьи здесь.

2 комментария:

  1. В1 на схеме это электродетонатор? )))))

    ОтветитьУдалить
    Ответы
    1. :) Электроденонатор это что-то из взрывотехники
      B1 - это пьезоэлектрический динамик

      Удалить