Вы находитесь на странице: 1из 14

1.

Разработка программного обеспечения

2.1 Описание выбранного алгоритма функционирования


устройства

Алгоритм работы программы построен на обработке событий нажатия


клавиш на клавиатуре и выводе изображения кукушки.
Для работы клавиатуры была использована подпрограмма KeyNum(),
позволяющая считывать с клавиатуры значения, отслеживая номер нажатой
кнопки.

#include <reg52.h>

//Klava

sbit P1_0=0x90;

sbit P1_1=0x91;

sbit P1_2=0x92;

sbit P1_3=0x93;

sbit P0_4=0x84;

sbit P0_5=0x85;

sbit P0_6=0x86;

sbit P3_3=0xb3;

//Delay

sbit RS=0xb5;

sbit RW=0xb6;

sbit E=0xb7;

sfr DATA=0xa0;

char Sec;

char Min;
char Hours;

unsigned int Counter, Dlit, Nota, Octava, bird;

unsigned char KeyNum(void)

P1=0;

P0_4=0;

P0_5=1;

P0_6=1;

if(P1_0==0)return(1);

if(P1_1==0)return(4);

if(P1_2==0)return(7);

if(P1_3==0)return(10);

P0_4=1;

P0_5=0;

P0_6=1;

if(P1_0==0)return(2);

if(P1_1==0)return(5);

if(P1_2==0)return(8);

if(P1_3==0)return(11);

P0_4=1;

P0_5=1;

P0_6=0;

if(P1_0==0)return(3);
if(P1_1==0)return(6);

if(P1_2==0)return(9);

if(P1_3==0)return(12);

return(0);

void Indication(unsigned char n){

P0=(P0 & 0xf0);

n=(n & 0x0f);

P0=(P0|n);}

void Delay(unsigned int T){

unsigned int I;

TMOD=(TMOD & 0xfc);

TMOD=(TMOD | 0x01);

TF0=0;

TR0=0;

for(I=0;I<T;I++)

{TH0=0xff;

TL0=0x2e;

TR0=1;

while(TF0==0);

TF0=0;

}
void LCD_SEND(bit c0d1,unsigned char byte_to_send){

RS=c0d1;

RW=0;

E=1;

DATA=byte_to_send;

Delay(1);

E=0;

Delay(1);

void LCD_INIT(void)

Delay(200);

LCD_SEND(0,0x30);

Delay(40);

LCD_SEND(0,0x30);

LCD_SEND(0,0x30);

LCD_SEND(0,0x38);

LCD_SEND(0,0x0f);

LCD_SEND(0,0x06);

LCD_SEND(0,0x01);

Delay(50);

LCD_SEND(0,0x30);

}
void Delay_ms(unsigned int T)

unsigned int I;

TMOD=(TMOD & 0xFC);

TMOD=(TMOD | 0x01);

TR0=0;

TF0=0;

for(I=0;I<T;I++)

TH0=0xF8;

TL0=0x30;

TR0=1;

while(TF0==0);

TF0=0;

void Time(void)

unsigned char T[8];

unsigned char I;

if(Sec<59) Sec++;
else

{Sec=0;

if(Min<59)Min++;

else

{Min=0;

if(Hours<23)Hours++;

else Hours=0;

T[0]=Hours/10+0x30;

T[1]=Hours%10+0x30;

T[2]=0x3a;

T[3]=Min/10+0x30;

T[4]=Min%10+0x30;

T[5]=0x3a;

T[6]=Sec/10+0x30;

T[7]=Sec%10+0x30;

LCD_SEND(0,0x80);

for(I=0;I<8;I++)

LCD_SEND(1,T[I]);

Delay_ms(1000);

void keytemp(void){

unsigned char tempH[] = {100, 100} ;


unsigned char tempM[] = {100, 100} ;

unsigned char tempS[] = {100, 100} ;

unsigned char key = 0;

unsigned char i;

key = KeyNum();

if(key == 10)

//Hours

for(i=0;i<2;i++){

key = KeyNum();

if(tempH[0] == 100)

tempH[0] = key;

else tempH[1] = key;

if(tempH[0]!=100 && tempH[1]!=100)

Hours = tempH[0]*10 + tempH[1];

//Minutes

for(i=0;i<2;i++){

key = KeyNum();

if(tempM[0] == 100)

tempM[0] = key;

else tempM[1] = key;

if(tempM[0]!=100 && tempM[1]!=100)

Min = tempM[0]*10 + tempM[1];


}

//Seconds

for(i=0;i<2;i++){

key = KeyNum();

if(tempS[0] == 100)

tempS[0] = key;

else tempS[1] = key;

if(tempS[0]!=100 && tempS[1]!=100)

Sec = tempS[0]*10 + tempS[1];

void main(void){

unsigned int I;

unsigned char N[8]={6,33,57,68,89,107,123,0};

unsigned char T[8]={4, 4, 4, 4, 4, 4, 4,32};

unsigned char bird[1]={0x23};

Octava=16;

TMOD =(TMOD & 0xcc);

TMOD =(TMOD | 0x12);

RCAP2H=0x00;

RCAP2L=0x00;

T2CON=(T2CON & 0xFC);


TR2=1;

EA=1;

ET0=1;

ET1=1;

EX0=1;

IT0=1;

ET2=0;

while(Min == 30)

Counter=Octava;

P3_3=0;

TR0=0;

TF0=0;

TR1=0;

TF1=0;

for (I=0;I<8;I++)

Nota=N[I];

Dlit=T[I];

P0=Dlit/2;

if(Nota!=0)

TH0=Nota;

TL0=Nota;
TR0=1;

else TR0=0;

TH1=0;

TL1=0;

TR1=1;

while(Dlit !=0);

LCD_INIT();

while(Min == 30){

LCD_SEND(0,0x65);

for(I=0;I<1;I++)

{LCD_SEND(1,bird[I]);

if(I==1)I=0;

for(;;)

{LCD_SEND(0,0x18);

Delay(1000);

}}

keytemp();

while(1){
Time();

}}

При старте программы мы переводим таймер Т1 в режим 2, после чего


обнуляем его флаг и подаем команду прекращения работы таймера.
При вхождении в бесконечный цикл генерации звука первым действием
стартует проверка нажатой клавиши. До того момента, пока клавиша не
будет нажата, результатом функции KeyNum() будет 0, а значит выражение
KeyNum()==0 всегда будет истино и программа дальше выполняться не
будет.
После нажатия на любую клавишу на клавиатуре функция KeyNum() вернет
значение, не равное нулю. В таком случае проверка KeyNum()==0 вернет
false и программа выйдет из цикла. Значение, считанное с клавиатуры,
является кодом частоты звука и помещается в старший байт таймера ТН1.
После присвоения старшему байту таймера числа с клавиатуры программа
входит в 16-кратный цикл, в котором сначала идет проверка флага таймера
на равенство нулю и если флаг таймера не равен нулю, то он обнуляется, а к
итератору цикла прибавляется единица.
Как только итератор достигает значения 16, программа выходит из 16-
кратного цикла и инвертирует сигнал на входе P3_3, после чего цикл
бесконечного воспроизведения звука начинается сначала.

Получается, что алгоритм имеет следующую последовательность:

Начало программы > запуск времеи>проверка нажатия клавиши > нажатие


клавиши > запись нового времени > ожидание > вывод кукушки > повтор
программы.

2.2 Обоснование структуры программы

Структуру программы было решено сделать модульной, для более


удобного обращения с ней. Для всей работы используется 8 подпрограмм для
работы с таймерами клавиатурой и часами, и программа main для запуска
всего этого.

Задачей main является воспроизведение бесконечного цикла часов.

В бесконечный цикл включается задача проверки нажатия клавиши на


клавиатуре и проверка времени для запуска кукушки.

В основной программе используется единственная глобальная переменная


«I» для использования ее как итератора в циклах. Она используется в цикле
for для подсчета импульсов.
Подключаемая библиотека reg52.h была выбрана для большего функционала
при разработке.

2.3 Разработка программы


2.4 Инструкция по использованию программы
Устройство предназначено для отсчета времени суток и его индикации
на экране жидкокристаллического дисплея в формате «ЧЧ:ММ» с
появлением кукушки на дисплее в сопровождении соответствующих
звуковых сигналов:
- в 30 минут каждого часа – одиночное появление;
- в начале каждого часа – последовательность появлений (от 1 до 12 в
зависимости от наступившего времени).
В работе устройства должен быть предусмотрен режим установки
времени.
Для установки времени требуется нажать клавишу «*» после чего вводить
цифры с клавиатуры.
Заключение

Итогом данной работы являются нерабочие часы, построенный на базе


стенда LESO1. Часы могут считать время, остальной функционал не был
реализован. В работе были использованы все необходимые материалы и
программное обеспечение. В результате была реализована только часть
работы. Разработка программы заняла достаточное количество времени, все
необходимые для выполнения данной работы знания уже были получены,
поэтому написание программы прошла быстро, однако ее отладка заняла
определенное время в виду отсутствия доступа к стенду.