Основной файл
Unsigned char input; регистра. Unsigned char M0DJSIM1; unsigned char M0D_SIM2; unsigned char REL_SIM; |
Tinclude <picl6f62xa. h> #include <stdio. h> #include "reley_c. h"
// Для считывания приемного
// Первый символ адреса модуля. // Второй символ адреса модуля. // Символ реле, unsigned char command_reciev [6]; // Массив для полученной команды.
Int MOD_ADDR; // Заданный адрес модуля, как число,
Int sim_end_num =0; // Полный символьный номер
Модуля.
Int MOD_NUM; // Полученный адрес модуля, как число,
Int REL_NUM; // Номер реле.
Unsigned char RELSTAT =0; // Статус реле (позиционно): 1 - вкл, 0 - выкл. int і;
// Получение байта.
Unsigned char getch() {
While(!RCIF) // Устанавливается, когда регистр не пуст.
Continue; return RCREG;
}
// Вывод одного байта.
Void putch(unsigned char byte) {
While(!TXIF) // Устанавливается, когда регистр пуст.
Continue; TXREG = byte;
}
// Преобразуем символьный адрес в число.
Int sim_num_adr() {
Sim_end_num = 0;
M0D_SIM1 = command__reciev [1]; // Первый символ номера. MOD_SIM2 = command_reciev [2]; // Второй символ номера. M0D_SIM1 = MODJ3IM1 - 0x30; //В виде числа. MOD_SIM2 = MODJ3IM2 - 0x30; sim_end_num = MOD_SIMl*OxOA + MOD_SIM2 ; return sim_end_num;
}
// Получение и выполнение команды.
Int cmd() {
REL_SIM = command_reciev [4] ; REL_NUM = REL_SIM - 0x30; switch (command_reciev [5])
{
Case "N": rel_on(REL_NUM) ; break;
Case "F": rel_off (REL_NUM) ; break;
Case "S": rel_stat(REL_NUM); break;
}
// Выполнение команды включения заданного реле.
Int rel_on(int num) {
Bitset (RELSTAT, REL_NUM); PORTA = RELSTAT;
EEADR =0x0; // Запишем состояние реле в EEPROM.
EEDATA = - RELSTAT;
WREN = 1;
GIE = 0;
EECON2 = 0x55;
EEC0N2 = ОхАА; WR =1; while (WR); GIE = 1; WREN = 0;
}
//Выполнение команды выключения заданного реле.
Int rel_off(int num) {
Bitclr (RELSTAT, REL_NUM); PORTA = RELSTAT;
EEADR =0x0; // Запишем состояние реле в EEPROM.
EEDATA = - RELSTAT;
WREN = 1;
GIE = 0;
EECON2 = 0x55;
EECON2 = OxAA;
WR =1;
While (WR);
GIE = 1;
WREN = 0;
}
// Выполнение команды передачи состояния заданного реле.
Int rel_stat(int num) {
Command_reciev[0] = "R" ; command_reciev[l] = MOD_SIMl+0x30; command_rec і ev[2] = MOD_SIM2+0x30; command_reciev[3] = и#и; command_reciev[4] = REL_SIM;
If ((RELSTAT»REL_NUM) &0x01) command_reciev[5] = "N"; if (! ((REL$TAT»REL_NUM) &0x01)) command_reciev[5] = "F" CREN =0; // Запрещаем прием.
RB0 = 1; //Переключим драйвер RS485 на передачу.
TXEN = 1; // Разрешаем передачу.
For (i=0; i<6; ++i) putch(command_reciev[i]);
For (i=0;i<1000;i++); // Задержка для вывода
For (i=0; i<6; ++i) commandereciev [i] = " ";
RB0 = 0; // Выключаем драйвер RS485 на передачу.
TXEN = 0; // Запрещаем передачу.
CREN =1; // Разрешаем прием.
}
Int init_comms() // Инициализация модуля. {
|
// Прочитаем состояние реле из EEPR0M.
EEADR = 0x0; RD = 1;
RELSTAT = - EEDATA;
PORTA = RELSTAT; }
Void main (void) {
Init_comms (); // Инициализация модуля,
For (i=0; i<6; ++i) command__reciev [і] = " "; command_reciev [0] = "R";
//Прочитаем и преобразуем номер модуля. MOD_ADDR = PORTB; // Номер модуля в старших битах. MOD_ADDR=MOD_ADDR»4; // Сдвинем на четыре бита. // Начинаем работать.
Start: CREN =1;
Input = getch();
Switch (input) {
Case "R": // Если обращение к релейному модулю.
For (i=l; i<6; ++i) // Запишем команду в массив. {
Input = getch();
Command_reciev [і] = input; }
MOD__NUM = sim_num_adr(); // Чтение из сети.
If (M0D_NUM!= MOD_ADDR) break; // Если не наш адрес, else
If (command_reciev [3] = "$") cmd(); // Если команда.
Default: goto start;
}
Goto start;
}