• I






      
           

Научно-популярный образовательный ресурс для юных и начинающих радиолюбителей - Popular science educational resource for young and novice hams

Основы электричества, учебные материалы и опыт профессионалов - Basics of electricity, educational materials and professional experience

КОНКУРС
language
 
Поиск junradio

Радиодетали
ОК
Сервисы

Stock Images
Покупка - продажа
Фото и изображений


 
Выгодный обмен
электронных валют

Друзья JR



JUNIOR RADIO





6-канальный контроллер на 8051



Статьи публикуются по мере поступления. Для упорядоченного тематического
поиска воспользуйтесь блоком  "Карта сайта"







Чип 7407 имеет 6-канальный TTL вход и 6-канальный NPN выход. Драйвер вывода имеет максимальный ток 30 мА при напряжении 30V. Я использовал его во многих микроконтроллерных схемах. Обеспечивает простой драйвер для порта микроконтроллера при сопряжении с высокими силовыми цепями.

 

 

Контроллер имеет 6-канальный выход с открытым коллектором. Не имеет батареи для резервного питания.  При включении питания до сброса, все выходные биты будут отключены. Когда часы будут установлены, выхода начнут функционировать отключая или включая нагрузку в определенные промежутки. Устройство можно использовать для управления бытовой техникой твердотельными реле. Ниже, на диаграмме показано, как использовать твердотельные реле для управления домашней техникой. 

Каждое устройство будет управляться

с помощью настройки времени

(для кондиционера порог срабатывания установлен на 22: 00-5: 30).

 

Выходы с открытым коллектором предназначены для подключения твердотельного реле напрямую. Port0 резисторами 10k обеспечивает питание сегментов светодиодного дисплея. P3.4 - P3.7 общие контакты катода.  KEYIN линия входного бита из P3.2.  SW5 это дополнительный ключ используется для включения одного выходного бита. Я использовал его для включения кондиционера вручную. U4 обязательный EEPROM для дальнейшего программирования.

 

Рисунок 1: Схема (Скачать полный вид) .

 

Прошивки была написана с использованием языка C. Исходный код был скомпилирован на Micro-C для 8051 версии 2.2. 

КОД

/*
6-channel Realtime controller with clock display and keys
MikroC for 8051 V2.2
Copyright (C) 2015 Wichit Sirichote, wichit.sirichote@gmail.com
MCU: 89S52
Output: open collector 7407
*/
char code convert[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67};
char buffer[4]; // display buffer
char i,j;
char min_key;
char hour_key;
char pressed;
char command;
char sec10,sec,min,hour;
char blink_tick;
char blink;
char state; // state =0 turn off all outputs
// state =1 normal clock running, initiate when any keys were pressed
char temp;
void cout(char n);
void print_time();
/*
/ air.pgm
/ activates four devices by time setting
/ '1' is on and '0' is off
/ OUTPUT [1...8]
/ output 1 is a SSR controlled 12,000btu air conditioner
/ output 2 is a 7W night lamp at bed
/ output 3 is a 10W lamp at bedroom's door
/ output 4 is a 20W fluorescent at kitchen
/ output 5 reserved
/ output 6 high current 12Vdc solenoid driver
/ output 7 reserved
/ output 8 reserved
/line day time output 1...8
:01 24 1900 0 0 1 1 0 0 0 0 / on lamp at bedroom door and kitchen
:02 24 2000 0 1 1 1 1 0 0 0 / also bed lamp, and fan
:03 24 2200 1 0 1 1 1 0 0 0 / off bed lamp, on air conditioner
:04 24 2230 1 0 0 0 1 0 0 0 / off door lamp
:05 24 2310 1 0 0 0 0 0 0 0 / off fan
:06 24 0530 0 0 0 0 1 0 0 0 / off air-conditioner and on fan again
:07 24 0600 0 0 0 0 0 0 0 0 / off all
:00
*/
char pgm[]={ 19,0, 0x30, 20,0,0x78,22,0,0xb8,22,30,0x88,23,10,0x80,5,30,0x08,6,0,0x00};
void scan_pgm()
{
for(i=0; i<7; i++)
{
if(hour == pgm[i*3] && min == pgm[(i*3)+1]) // check time for output
{temp = ~pgm[(i*3)+2]; // write output byte to P2
P2 = temp>>2; // shift to P2.0-P2.5
}
}
}
void scan()
{
P0=buffer[0];
P3=~0x10;
if((P3&8)==0) hour_key=0;
else hour_key=1;
Delay_ms(1);
P3=0xff;
P0=buffer[1];
P3=~0x20;
if((P3&8)==0) min_key=0;
else min_key=1;
Delay_ms(1);
P3=0xff;
P0=buffer[2]; //|0x80;
P3=~0x40;
Delay_ms(1);
P3=0xff;
P0=buffer[3];
P3=~0x80;
Delay_ms(1);
P3=0xff;
if(P3_2_bit==0) P2_0_bit=0; // turn AC on if P3.2 was pressed
}
void release_key()
{
if((min_key&&hour_key)==1) pressed=0;
}
void set_hour()
{
if((hour_key==0) && (pressed==0))
{
if(++hour >=24)hour =0;
print_time();
pressed=1;
state=1;
}
}
void set_min()
{
if((min_key==0) && (pressed==0))
{
sec =0;
if(++min>59) min =0;
print_time();
pressed=1;
state=1;
}
}
void initUART()
{
SCON = 0x52; /* SCON: mode 1, 8-bit UART, enable rcvr */
PCON = 0x80; // SMOD =1
TMOD = 0x21; /* TMOD: timer 1, mode 2, 8-bit reload */
TH1 = 0xfe; /* TH1: reload value for 9600 baud */
TR1_bit = 1; /* TR1: timer 1 run */
}
char cin_ready()
{
if(RI_bit)
{
RI_bit=0; // clear when set
return SBUF;
}
else
return 0xff;
}
car cin()
{
while(RI_bit==0)
continue;
RI_bit=0;
return SBUF;
}
void cout(char n)
{
while(TI_bit==0) continue;
TI_bit=0;
SBUF = n;
}
// receive HH:MM from RTC chip
// format is \rHH:MM
void get_time()
{
if(cin_ready()==0x0d)
{
buffer[3]= convert[cin()-0x30];
buffer[2]= convert[cin()-0x30];
cin(); // dummy read for colon
buffer[1]= convert[cin()-0x30];
buffer[0]= convert[cin()-0x30];
}
}
void print_time()
{
buffer[0]= convert[min%10];
buffer[1]= convert[min/10];
buffer[2]= convert[hour%10]|0x80;
buffer[3]= convert[hour/10];
if(buffer[3]== 0x3F) buffer[3]=0; // turn off zero
}
void time()
{
if(++sec10==100)
{
sec10 =0;
//P3 ^= 0x80;
print_time(); // print time every second
blink=1;
if ( ++sec >= 60)
{
sec = 0;
scan_pgm(); // scan program every minute
if ( ++min >= 60)
{
min = 0;
if ( ++hour >= 24)
hour = 0;
}
}
}
}
void Timer0InterruptHandler() org IVT_ADDR_ET0
{
TH0 |= 0xdc; // reload timer 0 for 10ms tick 0xDC00 with 11.0592MHz
time(); // update realtime clock
if(blink)
{
if(++blink_tick >50)
{
blink=0;
blink_tick=0;
buffer[2]&= ~0x80;
}
}
}
void main() {
EA_bit = 0;
ET0_bit = 1; // or IE |= 0x82; /* set bit EA and Timer0 enable */
SCON = 0x52; // 8-bit UART mode
TMOD = 0x21; // timer 1 mode 2 auto reload
TH1= 0xfe; // 9600 8n1 with 3.579545MHz XTAL
PCON = 0x80; //smod = 1
TR1_bit = 1;
TR0_bit = 1; // run timer0 and timer1
hour = 8; // when reset set current time to 8:00
min = 0;
sec = 0;
state=0;
buffer[0]=0x40;
buffer[1]=0x40;
buffer[2]=0x40;
buffer[3]=0x40;
initUART();
pressed=0;
while(1)
{
switch(state)
{
case 0:
P2 =0xFF; // turn output off all bits
scan();
set_hour();
set_min();
release_key();
break;
case 1:
EA_bit = 1; // run clock
scan();
set_hour();
set_min();
release_key();
break;
}
}
}

Часы реального времени генерирует Timer0 (10 мс прерывания). Часы обновляются каждую секунду.  Каждая программа состоит из трех байт. Первые два HR: ММ и третий контрольный выходной байт. После сброса рабочего состояния будет 0 (часы и выход будут отключены). После нажатия любого ключа, появляется 1, часы и выход будут функционировать.

 

Печатная плата

 

Я сделал PCB контроллера с помощью лазерного принтера. Для некоторых линий, которые не пропечатались, использовал небольшой провод для подключения.

 







Просмотров: 1680 | Добавил: Chinas | Рейтинг: 0.0/0








Необходимо добавить материалы...
Результат опроса Результаты Все опросы нашего сайта Архив опросов
Всего голосовало: 371



          

Радио для всех© 2024