LINUX.ORG.RU

Сообщения Lucky03

 

Программа измерения импульса

/* Программа измерения и контроля длительности импульса */

#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; // Обнуление переменной счета числа проверок

}

}

Lucky03
()

RSS подписка на новые темы