/* Программа измерения и контроля длительности импульса */
#include <ADuC842.h> // Описание регистров МК ADuC842
#include <stdio.h> // Подключение стандартной библиотеки ввода- вывода
unsigned char mCountTik=0; // Счетчик числа переполнений Таймера 0
unsigned char mProv=0; // Счетчик числа проверок
unsigned long mDlitImp=0; // Переменная для записи длительности импульса
sbit RS=P3^5; // Вывод МК для связи с ЖКИ
sbit RW=P3^6; // Вывод МК для связи с ЖКИ
sbit E=P3^7; // Вывод МК для связи с ЖКИ
sbit BUZY_LCD=P1^7; // Вывод МК для связи с ЖКИ
unsigned char STATE_LCD; // Определение переменной состояния ЖКИ /* Определение функции задержки */
void delay (long i)
{
long a;
for (a=0;a<i;a++);
}
/* Определение функции готовности ЖКИ */
void wait_lcd (void)
{
do {
E=1;
RS=0;
RW=1;
P1=0xFF;
STATE_LCD=BUZY_LCD;
E=0;
} while (STATE_LCD!=0);
RW=0;
}
/* Определение функции очистки экрана */
void clear_lcd (void)
{
E=1;
RS=0;
RW=0;
P1=0x01;
E=0;
wait_lcd(); }
/* Определение функции записи символа на дисплей */
void write_char (unsigned char *c1)
{
E=1;
RS=1;
RW=0;
P1=*c1;
E=0;
wait_lcd();
}
/* Определение функции инициализации ЖКИ */
void init_lcd (void)
{
delay(1849);
E=1;
RS=0;
RW=0;
P1=0x30;
E=0;
delay (505)
E=1;
RS=0;
RW=0;
P1=0x30;
E=0;
delay (18);
E=1;
RS=0;
RW=0;
P1=0x30;
E=0;
wait_lcd();
E=1;
RS=0;
RW=0;
P1=0x3C;
E=0;
wait_lcd(); }
/* Программа вывода измеренного значения на ЖКИ */
void vivodDlitImp (void)
{
idata char buf[32]; // Массив для форматизированного вывода строки
char *pbuf=buf; // Указатель массива
int bytes, cnt; // Переменные для организации вывода строки символов
bytes=sprintf(buf,«%s»,«DlitImp=»); // Запись строки в массив
bytes+=sprint(buf+bytes,«%.4d»,mDlitImp); // Запись переменной в массив
for (cnt=0;cnt<bytes;cnt++); // Вывод строки символов на ЖКИ
write_char(pbuf++);
}
/* Программа прерывания по переполнению Таймера 0 */
void t0ISR (void) interrupt 1
{
TR0=0; // Остановка счета Таймера 0
TH0=0; // Обнуление старшего байта Таймера 0
TL0=0; // Обнуление младшего байта Таймера 0
TR0=1; // Запуск счета Таймера 0
mCountTik++; // Инкрементирование переменной mCountTik }
/* Главная программа */
void main (void)
{
TH0=0; // Обнуление старшего байта Таймера 0
TL0=0; // Обнуление младшего байта Таймера 0
TMOD=0x19; /Установка режима работы Таймера 0 (16 разрядный счет, бит GATE=1 – запуск таймера при наличии сигнала на выходе INT0 и TR=1)/
ET0=1; // Разрешение прерывания по переполнению Таймера 0
EA=1; // Разрешение всех прерываний
while (INT0); // Ожидание окончания импульса
init_lcd(); // Инициализация ЖКИ
clear_lcd(); // Очистка экрана
/* Измерение длительности импульса */
while (1) {
TR0=1; // Запуск Таймера 0
while (!INT0); // Ожидание начала импульса
while (INT0); // Ожидание окончания импульса
TR0=0; // Остановка Таймера 0
mDlitImp=((TH0<<8)|(TL0)|(mCountTik<<16)); /* Присвоение результата измерения переменной mDlitImp */
mDlitImp=mDlitImp/2097152; /* Преобразование кода в длительность импульса, путем деления на частоту работы тактового генератора (2097152 Гц), полученное значение измеряется в секундах*/
TH0=0; // Обнуление старшего байта Таймера 0
TL0=0; // Обнуление младшего байта Таймера 0
/* Сравнение полученного значения с допустимыми пределами */
if ((mDlitImp<20/1000)&&(mDlitImp>80/1000)) {
mProv++; // Инкрементирование переменной счета числа проверок
delay (12331); // Задержка 0.1 с
if (mProv=10) {
clear_lcd(); // Очистка экрана ЖКИ
vivodDlitImp(); // Вывод последнего измеренного значения
delay(308299); // Задержка 2.5 с.
mProv=0; // Обнуление переменной счета числа проверок
}
}
else {
mProv=0; // Обнуление переменной счета числа проверок
}
}