Основные функции таймера:
1. Установка времени таймера от 0 часов 0 минут до 99 часов 59 минут;
2. При обратном отсчете во время последней минуты отображать только количество секунд;
3. При достижении показаний экрана 00:00 включается звуковой сигнал продолжительностью 1 минута;
4. Во время звучания сигнала достаточно нажать кнопки +, - для его отмены;
Принципиальная схема выглядит следующим образом:
Исходный код прошивки:
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); //Выбор позиции
}
Оригинал статьи здесь.
В1 на схеме это электродетонатор? )))))
ОтветитьУдалить:) Электроденонатор это что-то из взрывотехники
УдалитьB1 - это пьезоэлектрический динамик