MOVR6,#00H;
CALLWRITE; устанавливаем данные на шине данных ЖКИ
MOVR5,#05H; 0-й бит C_IND отвечает за строб, 1-й бит –
;запись/чтение , 2-й бит за данные/команды, 05H=0000 0101B - запись данных и;установка строба
CALLSTROBE; строб
RET;
STROBE:; подача сигнала Е интерфеса ПЛИС <-> ЖКИ на; время не менее 500 нс, одновременно подается; сигнал R/W=0 запись, RS=1 - данные
MOVR7,#06H; C_IND ( 080006H)
MOVR6,#00H;
CALLWRITE; установкастроба
MOVR5,#0FEH
MOVR7,#06H; C_IND ( 080006H)
MOVR6,#00H;
CALLWRITE; сброс строба
CALLDELAY; задержка на время исполнения команды
RET;
DELAY:; процедура задержки
MOVR0,#100;
L1:
MOVR1,#100;
L2:
DJNZR1,L2;
DJNZR0,L1;
RET;
CLEAR:; очистка дисплея
MOVR5,#01H;
MOVR7,#01H; DATA_IND ( 080001H)
MOVR6,#00H;
CALLWRITE; устанавливаем данные на шине данных ЖКИ
MOVR5,#01H; команда очистки дисплея
CALLSTROBE; строб
MOVR7,#07H; нам нужен 7-й байт 8-й страницы 0800"07"Н
MOVR6,#00H; 08"00"07
MOVR5,#00000000B; инициализация светодиодов через один
CALLWRITE;
CLRF0;
RET;
POSL_PORT:; наступило прерывание, бит TI или RI равен 1
JBRI,WAIT_IN; если бит RI - принимаем данные
JBTI,WAIT_OUT; если бит TI - пересылаем данные
WAIT_IN:
CLRRI; сбрасываем флаг
MOVR5,SBUF; записываем в буфер значение R5
CJNER5,#61H,E1; если пришел символ 'a', то
MOVR3,#1; записать в R3 1
JMPE; переход на метку Е
E1:
CJNER5,#70H,E2; если пришел символ 'р', то
MOVR3,#2; записать в R3 2
JMPE; переход на метку Е
E2:
CJNER5,#73H,E3; если пришел символ 's', то
CALLCLEAR; очистить дисплей и погасить светодиоды
JMPE; переход на метку Е
E3:; если не пришел ни символ 'a', ни 'p', ни 's', то
MOVA,R5; это означает, что последовательно начали передаваться
MOVR4,A; значения, составляющие разность между текущим и заданным значениями деформаций
JBF0,E3a; если бит F0=0, тогда однократный
CALLSTOP; вывод информации: "Деформация Превышение: %"
E3a:
SETBF0;
CALLLCD_NA; вывод символов, определяющих отклонение от; заданной деформации
E:
RETI;
WAIT_OUT:; подпрограмма пересылки значения в послед. порт
CLR TI;
RETI;
DAC_ADC:
CALLDELAY;
MOVDACCON,#01101101B; настройка регистра ЦАП; 0-12 битный режим,; 11-бит выбора диапазона, 0-Vdd(в); 01-выход ЦАП1=0 в, выход ЦАП0-; соответствует коду; 1-выходы ЦАПов изменяются сразу, как; только данные попадают в регистры; 01-ЦАП1 выключен, ЦАП0 включен
MOVADCCON1,#10101100B;10-дежурный режим, если не выполняется; преобразование; 10-коэф. деления тактовой частоты на 4; 11-число тактов задержки=4; 0-Бит запуска преобразования от Таймера 2; 0-бит разрешения внешнего запуска АЦП
MOVDAC0H,#00000011B;переслать значение в старший байт ЦАП
MOVDAC0L,#10000100B;переслать значение в мл. байт; (т.е. 1.1/5*4095 = 909, т.е. 00000011 10000100)
MOVADCCON2,#00010000B;SCONV=1-Бит однократного преобразования; После того, как цикл завершился, бит; автоматически сбрасывается в 0
ADC_WAIT:
MOVA,ADCCON3;
JBACC.7,ADC_WAIT;Флаг занятости ЦАП (только для чтения).; Устанавливается аппаратно на; время цикла преобразования или; калибровки. Автоматически сбрасывается; ядром в конце преобразования или; калибровки.
MOV A, ADCDATAH; записать данные из старшего регистра АЦП в А
ANL A,#00001111B;стереть код канала АЦП, хранящегося; в старшем байте
MOV SBUF, A; переслать значение
CALL DELAY; задержка
MOV A,ADCDATAL; записать данные из младшего регистра АЦП в А
MOV SBUF, A; переслать значение
CALL DELAY; задержка
RET;
STOP:; подпрограмма окончания процесса
MOV R5,#11100000B; Д
CALLLCD_Putch;
MOV R5,#01100101B; е
CALLLCD_Putch;
MOV R5,#11100100B; ф
CALLLCD_Putch;
MOV R5,#01101111B; о
CALLLCD_Putch;
MOV R5,#01110000B; р
CALL LCD_Putch;
MOV R5,#10111100B; м
CALLLCD_Putch;
MOV R5,#01100001B; а
CALLLCD_Putch;
MOVR5,#11100101B; ц
CALLLCD_Putch;
MOVR5,#10111000B; и
CALLLCD_Putch;
MOVR5,#11000111B; я
CALLLCD_Putch;
MOVR5,#0C0H; сдвиг курсора на следующую строку
MOVR7,#01H; DATA_IND ( 080001H)
MOVR6,#00H;
CALLWRITE; устанавливаем данные на шине данных ЖКИ
MOVR5,#01H; команда очистки дисплея
CALLSTROBE; строб
MOVR5,#10101000B; П
CALLLCD_Putch;
MOVR5,#01110000B; р
CALLLCD_Putch;
MOVR5,#01100101B; е
CALLLCD_Putch;
MOVR5,#10110011B; в
CALLLCD_Putch;
MOVR5,#11000011B; ы
CALLLCD_Putch;
MOVR5,#11000001B; ш
CALLLCD_Putch;
MOVR5,#01100101B; е
CALLLCD_Putch;
MOVR5,#10111101B; н
CALLLCD_Putch;
MOVR5,#10111000B; и
CALLLCD_Putch;
MOVR5,#01100101B; е
CALLLCD_Putch;
MOVR5,#00111010B;:
CALLLCD_Putch;
MOVR5,#0CFH;; установка крайнего правого положения во второй строке ЖКИ
MOVR7,#01H; DATA_IND ( 080001H)
MOVR6,#00H;
CALLWRITE; устанавливаем данные на шине данных ЖКИ
MOVR5,#01H; команда очистки дисплея
CALLSTROBE; строб
MOVR5,#00100101B; %
CALLLCD_Putch;
MOVR5,#0CBH;установка положения после ':' во второй строке ЖКИ
MOVR7,#01H; DATA_IND ( 080001H)
MOVR6,#00H;
CALLWRITE; устанавливаем данные на шине данных ЖКИ
MOVR5,#01H; команда очистки дисплея
CALLSTROBE; строб
MOVR7,#07H; нам нужен 7-й байт 8-й страницы 0800"07"Н
MOVR6,#00H; 08"00"07
MOVR5,#10101010B; инициализация светодиодов через один
CALLWRITE;
CALL BUZZ; звуковойсигнал
RET;
LCD_NA:; вывод символов на дисплей, составляющий отклонение текущей деформации от заданного значения
MOVR7,#01H; DATA_IND ( 080001H)
MOVR6,#00H;
MOVA,R4;
MOVR5,A;
CALLWRITE; устанавливаем данные на шине данных ЖКИ
MOVR5,#05H; 0-й бит C_IND отвечает за строб, 1-й бит –; запись/чтение , 2-й бит за данные/команды,; 05H=0000 0101B - запись данных и;; установка строба
CALLSTROBE; строб
RET;
WRITE:; запись значения по адресу передаваемому в;R6 и R7, записываемое значение находится в R5
MOV DPL,R7; загружаем адрес в младший байт DPTR
MOV DPH,R6; загружаем адрес в старший байт DPTR
MOV R7,DPP; временно сохраним содержимое dpp в R7
MOV DPP,#08H; переключаемся на 8-ю страницу - 080007Н
MOV A,R5;
MOVX@DPTR,A; записываем значение
MOV DPP,R7; возвращаем страницу
RET;
READ:; чтение значения по адресу передаваемому в; регистрах R6 и R7, прочитанное значение записываем в А
MOV DPL,R7; загружаем адрес в младший байт DPTR
MOV DPH,R6; загружаем адрес в старший байт DPTR
MOV R7,DPP; временно сохраним содержимое dpp в R7
MOV DPP,#08H; переключаемся на 8-ю страницу - 080007Н
MOVX A,@DPTR; пересылаем в аккумулятор значение ячейки
MOV DPP,R7; возвращаем страницу
RET;
END.
6. Программа для персонального компьютера на языке с++ в среде Borland C++Builder 6
//--------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <iomanip>
#include "Kursovik.h"
//--------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CPort"
#pragma link "CPortCtl"
#pragma resource "*.dfm"
TForm1 *Form1;
int connect=0, N_vhod=0, N_vyhod=0, vhod=0, vyhod=0, process=0, ADC_H=0, ADC_L=0, v_vhod=15, P=50;
float ADC, e, h2, delta_e, zad_e=3, v_vyhod=0;
AnsiString Str,delta_es;
//--------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (connect==1)
{
zad_e=StrToFloat(Edit6->Text); //считывание заданного значения деформации
process=1; //переменная, отвечающая за начало процесса подсчтеа и анализа параметров
vhod=0; //переменная, отвечающая за формирование входных импульсов
vyhod=0; //переменная, отвечающая за формирование выходных импульсов
ComPort1->WriteStr('p'); //отправляемсимвол 'p'
ComPort1->ClearBuffer(true,true); //очисткабуфера
}
}
//--------------------------------------------------------------
void __fastcall TForm1::ComPort1RxChar(TObject *Sender, int Count)
{
ComPort1->ReadStr(Str,1); //читаем полученные данные
ComPort1->ClearBuffer(true,true); // записываемв Str
if (vhod==1)
{
if (Str == 'x') {N_vhod=N_vhod+1; Edit1->Text=N_vhod;}
else if (Str == 'y') {N_vhod=N_vhod+10; Edit1->Text=N_vhod;}
else if (Str == 'z') {N_vhod=N_vhod+100; Edit1->Text=N_vhod;}
}
else if (vyhod==1)
{
if (Str == 'x') {N_vyhod=N_vyhod+1; Edit2->Text=N_vyhod;}
else if (Str == 'y') {N_vyhod=N_vyhod+10; Edit2->Text=N_vyhod;}
else if (Str == 'z') {N_vyhod=N_vyhod+100; Edit2->Text=N_vyhod;}
}
if (process == 1)
{
if (ADC_H == 0) ADC_H = Str[1];
else
{
ADC_L = Str[1];
if (ADC_L<0) ADC_L=255+ADC_L;
ADC=(float)(ADC_H<<8|ADC_L)*5/4095; //Данные с АЦП используются как толщина на входе
if (N_vhod!=0 && N_vyhod>=N_vhod) //Проверка корректности данных по импульсам (количество импульсов на входе < кол-ва импульсов на выходе)
{
Edit3->Text=ADC; //Выводим толщину на входе
e=(float)(N_vyhod-N_vhod)/N_vhod*100; //Расчет текущего значения относительной деформации
Edit5->Text=e; //Выводим текущее значение относительной деформации
h2=ADC-e*ADC/100; //Расчет толщины на выходе
Edit4->Text=h2; //Выводим толщину на выходе
Edit7->Text=v_vhod; //Выводим скорость на входе
v_vyhod=(float)v_vhod*ADC/h2; //Расчет скорости на выходе
Edit8->Text=v_vyhod; //Выводим скорость на выходе
Edit9->Text=P; //Выводим усилие обжатия
ADC_H = 0;
ADC_L = 0;
process=0;
}
else Label5->Visible=true; //Если данные некорректны, вывод необходимой информацию
}
}
if (e>zad_e) //Если текущее значение деформации больше заданного,то
{
delta_e=e-zad_e; //вычисляем разность между текущим значением и заданным
delta_es=(AnsiString)delta_e; //Преобразуем данную разность в строку
ComPort1->WriteStr(delta_es[1]);ComPort1->ClearBuffer(true,true); //иотправляемпервыйбайтразности
Sleep(1000);
ComPort1->WriteStr(delta_es[2]);ComPort1->ClearBuffer(true,true); //отправляемвторойбайтразности
Sleep(500);
ComPort1->WriteStr(delta_es[3]);ComPort1->ClearBuffer(true,true); //отправляемтретийбайтразности
Sleep(500);
ComPort1->WriteStr(delta_es[4]);ComPort1->ClearBuffer(true,true); //отправляемчетвертыйбайтразности
e=0;
}
}
//--------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (connect==1)
{
ComPort1->WriteStr('s');
ComPort1->ClearBuffer(true,true); //Очисткабуфера
ComPort1->Connected=false; //Завершениесоединения
ComPort1->Close(); //Закрытиепорта
connect=0;
Edit1->Text=0;
Edit2->Text=0;
Edit3->Text=0;
Edit4->Text=0;
Edit5->Text=0;
Edit6->Text=0;
Edit7->Text=0;
Edit8->Text=0;
Edit9->Text=0;
N_vhod=0;
N_vyhod=0;
vhod=0;
vyhod=0;
process=0;
v_vyhod=0;
ADC_H=0;
ADC_L=0;
Edit6->Text=zad_e;
}
}
//--------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
Edit6->Text=zad_e; //Вывод заданного значения деформации
ComPort1->Open(); //Открытиепорта
ComPort1->Connected=true; //Установлениесоединения
connect=1;
}
//--------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
if (connect==1)
{
process=0;
vhod=1;
vyhod=0;
Label5->Visible=false;
ComPort1->WriteStr('a');
ComPort1->ClearBuffer(true,true);
}
}
//--------------------------------------------------------------
void __fastcall TForm1::Button7Click(TObject *Sender)
{
if (connect==1)
{
process=0;
vyhod=1;
vhod=0;
Label5->Visible=false;
ComPort1->WriteStr('a');
ComPort1->ClearBuffer(true,true);
}
}
//--------------------------------------------------------------
7. Графическая часть
А. Электрическая принципиальная схема микропроцессорной системы