Смекни!
smekni.com

Разработка микропроцессорной системы контроля (стр. 2 из 2)

При обнаружении нажатой кнопки выполняется блок 7, в котором производится возвращение в основную программу значения переменной key, в противном случае – блок 8.

Блок 8 осуществляет модификацию переменной scan путем сдвига влево для сканирования следующего столбца.

В блоке 9 производится инкрементация переменной scan. Далее программа переходит к блоку 2.

На рисунке 3 представлена блок-схема алгоритма индикации С(х).

В блоке 1 инициализируется переменная chan.

В блоке 2 производится проверка равенства бита ADCS=1 регистра ADCON. Если условие выполняется, то АЦП не готов к выполнению новых преобразований и программа возвращается к блоку 2. Если нет, то программа переходит к блоку 3.

В блоке 3 устанавливаются биты ADR0-ADR2 для выбора канала АЦП.

В блоке 4 производится проверка равенства бита ADCI=1 регистра ADCON. Если условие не выполняется, то программа переходит к блоку 6, где осуществляется установление бита ADCSв 0, с последующим переходом к блоку 11. Если да, то программа переходит к блоку 5.

В блоке 5 выполняется присвоение переменной nxфакта нажатия кнопки в опрашиваемом столбце.

В блоке 7 осуществляется расчет напряжения Ux.

В блоке 8 осуществляется расчет текущего значения концентрации Сх.

В блоке 9 производится индикация значения концентрации Сх.

В блоке 10 выполняется сброс бита ADCIв 0.

В блоке 11 возвращается в основную программу значения переменной Сх.

На рисунке 4 представлена блок-схема алгоритма обработки прерывания.

В блоке 1 инкрементируется переменная time.

В блоке 2 производится установка старшего байта таймера 0.

В блоке 3 устанавливается младший байт таймер

5 РАЗРАБОТКА ПРОГРАММЫ ДЛЯ МИКРОПРОЦЕССОРНОЙ СИСТЕМЫ КОНТРОЛЯ

HELLO.C

Copyright 1995-1999 Keil Software, Inc.

#include <REG552.H>

#include <stdio1.h> /* prototype declarations for I/O functions */

unsigned char xdata wr_ir _at_ 0x7ff0 ;

unsigned char xdata rd_ir _at_ 0x7ff1 ;

unsigned char xdata wr_dr _at_ 0x7ff2 ;

unsigned char xdata rd_dr _at_ 0x7ff3 ;

unsigned char scan;

unsigned char key;

char chan=0x00;

float Ux,Cx, C0=0.2;

int nx, time=0, regim=1;

bit KL=0;

void wrc (unsigned char ir) {

unsigned char bf;

do{bf=rd_ir&0x80;}

while (bf!=0);

wr_ir =ir; }

unsigned char rdc (void) {

unsigned char bf;

do{bf=rd_ir&0x80;}

while (bf!=0);

return rd_ir;}

void wrd (unsigned char dr) {

unsigned char bf;

do{bf=rd_ir&0x80;}

while (bf!=0);

wr_dr =dr; }

unsigned char rdd (void) {

unsigned char bf;

do{bf=rd_ir&0x80;}

while (bf!=0);

returnrd_dr;}

// вывод одного символа

void putchar(unsigned char cm) {

if((cm & 0xC0) == 0xC0)

cm = tcod[cm & 0x3F];

wrd (cm);}

// подпрограмма вывода строки по-русски

void puts ( const unsigned char *str ) {

unsigned char i = 0;

while(str[i] != 0) {putchar(str[i]); i++;}}

The main C function. Program execution starts

here after stack initialization.

unsigned char klav(void) {

scan=0xFE;

while (scan!=0xF7){

P4=scan;

key=P4;

if ((key&0x78)!=0x78)

{return key;}

scan=scan<<1;

scan++;

return 0;}

float C (void){

chan=0x00;

ADCON=(ADCON&0xF8)|(chan&0x07);

while (ADCON&0x08);

if (ADCON&0x10){nx=(ADCH<<2)|(ADCON>>6);

Ux=2.5*nx/1024;

Cx=Ux*5.6/(18.56+0.57*Ux);

if (Cx>1) Cx=1;

if (Cx<0) Cx=0;

wrc(0xC0);

printf("Cx=%02.3f",Cx);

ADCON=ADCON&0xEF;}

else

ADCON=ADCON|0x08;

return Cx;}

void INT_1(void) interrupt 1 {time++; TH0=0x4С;TL0=0x50;}

void main (void) {

// инициализация HD44780

wrc (0x38); //2 строки, 5*8 точек,

wrc (0x06); // вывод слева-направо

wrc (0x01); // очистка

wrc (0x0c); // экран вкл., курсор выкл.

IEN0=0x82;

TMOD=0x01;

TR0=1;

while (1) {wrc(0x80);

printf("измерение концентрации:");

while (regim==1) {wrc(0xCB); printf("ожидание "); KL=0; P1=0x00;

if (klav()==0xF5){regim=2;}

while (regim==2) {wrc(0xCB); printf("рабочийрежим "); C();KL=1; time=0; P1=0x00;

if (klav()==0xF6) {regim=1;}

while ((C()>C0)&(regim==2)) {P1=0x02;

wrc(0xCB);

printf("cигнализация");

if (time>200) {regim=3;}

while (regim==3) {wrc(0xCB); printf("блокировка"); KL=0;

if (C()>C0) {P1=0x06;}

else {P1=0x04;}

if ((klav()==0xB4)&(C()<C0)){regim=2;}


СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

1. Архитектура микроконтроллеров семейства MCS-51: конспект лекций/ Бояринов А.Е., Дьяков И.А. Тамбов: Изд-во Тамб. гос. тех. ун-та, 2005. 64с.

2. Микропроцессоры в системах контроля: методические указания/ Бояринов А.Е. Тамбов: Изд-во Тамб. гос. тех. ун-та, 2005. 44с.