Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

Часы на на Микроконтроллере Семейства Mcs-51

Сб дек 07, 2013 16:14:04

Помогите пожалуйста!
Нужно, используя микроконтроллер семейства MCS-51, построить схему самых простых часов(4 семисегментных индикатора(часы,минуты) и две кнопки для их установки) и код программы. Все облазил, везде на AVR(

Re: Часы на на Микроконтроллере Семейства Mcs-51

Сб дек 07, 2013 16:25:01

Плохо искали, в сети миллион проектов, особенно на at89c2051. Есть даже с термометрами.

Re: Часы на на Микроконтроллере Семейства Mcs-51

Сб дек 07, 2013 17:09:06

Я впервые решил собрать(спаять) схему. И не могу найти ни одного примера где была бы схема и код. Схему то смогу составить, но вот код не осилю(
Последний раз редактировалось aen Сб дек 07, 2013 17:16:35, всего редактировалось 1 раз.
Причина: Исправил. Нарушение Правил форума п. 2.7

Re: Часы на на Микроконтроллере Семейства Mcs-51

Сб дек 07, 2013 21:23:18

Поищите здесь тему "in vino veritas" . там идет монолог одного индивида, который как раз на этом семействе специализируется. В той теме и схемы и исходники.

Re: Часы на на Микроконтроллере Семейства Mcs-51

Сб дек 07, 2013 21:48:26

На выбор:
вот это-
democlock.pdf
(44.85 KiB) Скачиваний: 669

ежли склероз не изменяет, то исходник вроде этот (но не факт... архив большой и старый, возможно не тот файл вытянул...):
PCT7.rar
(14.21 KiB) Скачиваний: 455

или первый проект из этой темы:
viewtopic.php?f=62&t=94201
:beer:

for ibiza11
Вообще-то вышеуказанная тема посвящена не столько mcs51, сколько сравнительному анализу программ одного устройства для 4-х различных семейств (пока готовы только at89s52 и atmega8515 - я ж не профи с мелкософта, а проги пишу в свободное время под ассемблером, в планах еще PIC16 и PIC18 ).
Конечно понимаю, что крутым современно мыслящим товарищам я не слишком по нраву, но у каждого есть право на свою точку зрения.
8)
Я ж Вам ее вроде не навязываю... :sleep:

Re: Часы на на Микроконтроллере Семейства Mcs-51

Сб дек 07, 2013 22:48:09

Не знаю о каких современных программистах, выказывающих негатив в Вашу сторону Вы говорите, я не из их числа.
То что тема посвящена анализу одного и того же устройства на различных архитектурах и микроконтроллерах - я знаю и ничего против не говорил, но это совершенно не относилось к тем е этой ветки, поскольку тут спрашивали только часы, собственно поэтому я не стал здесь это упоминать.
И я совершенно никоим образом не хотел задеть Ваше личное мнение. Разве я что-то писал по этому поводу? Каждый занимается тем, что ему нравится.

Re: Часы на на Микроконтроллере Семейства Mcs-51

Вс дек 08, 2013 07:21:01

Спасибо всем кто откликнулся!

Re: Часы на на Микроконтроллере Семейства Mcs-51

Вс дек 08, 2013 08:20:40

http://www.kmitl.ac.th/~kswichit/clock/clock.htm
по просьбе ruddim23 весь проект скопировал с сайта, ибо антивирь пишет, что сайт атакует, а вообще сайт интересный.
[size=150]Clock ControllerV1.1[size]
Wichit Sirichote, kswichit@kmitl.ac.th

Builda digital clock that turns AC load on/off with preset time. sourcecode with sdcc for 8051.
The Clock Controller V1.1was designed to be an exemplary of using 'C' language to control timer0interrupt, 7-segment LED and keypad scanning. It provides 1-bit sink currentdriving output, for driving a relay, opto-triac, say. Many projects requiring7-segment display and keypad interfacing may get the idea from the Clockcircuit and software.

Hardware

Figure 1 shows a circuitdiagram of the Clock Controller V1.1. P10-P1.7 drives 7-segment commonanode LED with sink current. P3.0-P3.3 also drives a base pin of 4-PNPtransistor, 2n2907 with sink current. As shown in the figure, the 2nd 2-digitLED that connected to P3.2 and P3.3 is rotated 180 degrees to the 1st 2-digitallowing the pt. segment to be used for 1 second blinking. P3.0-P3.3 alsoconnects four momentary switches while the other legs are tied to inputport P3.4. During display and key switch scanning, a logic '0' is shiftedfrom P3.0 to P3.3, if there was a key pressed, P3.4 then became low.P3.7 is a 1-bit sink current driving, an example in the circuit uses a2n2907 to drive a small electromechanical relay 5V, say.
Изображение
Figure 1: Schematic Diagramof the Clock V1.1
Software
The program clock.c was
Спойлер
Код:
/*
   CLOCK V1.0
   89C2051 + 4-digit 7-SEG led + 4-key switch
   Simple Digital Clock demostrates scanning LED and key switch.
   The clock has 1-bit output port P3.7 for driving AC load through MOC3040+triac.
   The source program was compiled by Micro-C with optimize option.

           *    ****       ****    ****
           *   *    *  *  *    *  *    *
           *   *    *     *    *  *    *
           *    ****      *    *  *    *
           *   *    *     *    *  *    *
           *   *    *  *  *    *  *    *
           *    ****       ****    ****

              set   set  time    manual
             HOUR   MIN  ON/OFF  ON/OFF


   Copyright (c) 1999 W.SIRICHOTE
*/

#include c:\mc51\8051io.h
#include c:\mc51\8051reg.h

extern register char cputick;
unsigned register char sec100,sec,sec5,min,hour,flag1,command,ACC,temp,opto;
/* above must be defined as register for tiny model */
unsigned register char i,digit,buffer[4],onHour1,onMin1,offHour1,offMin1;
register char key,delay,count1;
char convert[10] = {0x3F,0x0c,0x76,0x5e,0x4d,0x5b,0x7b,0x0e,0x7f,0x5f};

main()
{
  opto = 0xff;
  cputick = 0;
  hour = 18;
  min = 0;
  sec = 0;
  key = -1;
  flag1 = 0;
  onHour1 = 18;   /* 18:30 turn lamp on */
  onMin1 = 01;
  offHour1 = 18;   /* 21:30 turn off */
  offMin1 = 02;
  count1 = 0;
  buffer[0] = 0x40;
  buffer[1] = 0x40;
  buffer[2] = 0x40;
  buffer[3] = 0x40;

  serinit(9600);     /* must be invoked for tiny model */

  while(1)
  {
    while ( cputick < 1)
    scanLED();

    cputick = 0;

/*---------- the following tasks execute every 10ms ------*/

    time();
    timeToBuffer();
    blink();
    offmsd();
    keyexe();
    keydelay();
    comparetime();

/*----------*/
   }
}

/* ****************** change constant below for other X-tal ********/
time ()
/* update real-time clock  */
{
   sec100++;
   if (sec100 >= 100)       /* 100 * 10 ms = 1 s */
   {sec100 = 0;
    flag1 |= 0x05;   /* set bit 0, bit 2 */
    temp = 50;
    sec++;
    if (sec >= 60)
    {sec = 0;
     flag1 |= 0x02; /* set bit 1 */
     min++;
     if (min >= 60)
     {min = 0;
     hour++;
     if (hour >= 24)
     {hour = 0;

    }
  }
 }
}
}

scanLED() /* scan 4-digit LED and 4-key switch, if key pressed key = 0-3
else key = -1 */

{
    int i;
    digit = 0x08;
    key = -1;
    for( i = 0; i < 4; i++)  /* 4-DIGIT scanning */
    {
        P3 = ~digit & opto;  /* send complement[digit] */
        P1 = ~buffer[i];  /* send complement[segment] */
        pause(1);         /* delay a while */
        P1 = 0xff;        /* off LED */
        if ((P3 & 0x10) == 0) /* if key pressed P3.4 became low */
           key = i;       /* save key position to key variable */
        digit>>=1;        /* next digit */
    }
}


timeToBuffer()
{
    buffer[0] = convert[min%10];
    buffer[1] = convert[min/10];
    buffer[2] = convert[hour%10];
    buffer[3] = convert[hour/10];

}

blink()
{
    if((flag1 & 0x04) != 0) /* check bit 2 if set decrement temp until zero */
     {temp--;
        if (temp != 0)
                {
                buffer[1] |= 0x80;
                buffer[2] |= 0x80;
                }
                else( flag1 &= ~0x04);
      }
}


keyexe()
{
    if (key != -1)
    {
        if ((flag1 & 0x80) == 0)  /* within 0.5 sec after 1st press
                                    the following execution is not allowed */
            {
                flag1 |= 0x80;
                delay = 50;

      switch(key){
        case (0): /* key position 0 */
        manualOnOff();    /* service key 0 */
        break;
        case (1): /* key position 1 */
        savetimeOnOff1();  /* service key 1 */
        break;
        case (2): /* key position 2 */
        setmin(); /* service key 2 */
        break;
        case (3): /* key position 3 */
        sethour();
                  }
                }

    }
}

sethour()
{
    hour++;
    if ( hour== 24)
    hour = 0;

}

setmin()
{
    min++;
    sec = 0;
    if( min == 60 )
    min = 0;
}

savetimeOnOff1()

{
    count1++;
    if (count1 == 1)
    {
    onHour1 = hour;
    onMin1 = min;
    buffer[0] = 0x00;
    buffer[1] = 0x68;
    buffer[2] = 0x78;
    buffer[3] = 0x71;
    showOnce();
    }
    else
    {
        count1 = 0;
        savetimeOff1();
    }
}

savetimeOff1()

{
    offHour1 = hour;
    offMin1 = min;
    buffer[0] = 0x63;
    buffer[1] = 0x63;
    buffer[2] = 0x78;
    buffer[3] = 0x71;
    showOnce();
}

manualOnOff()

{
    opto= ~opto | 0x7f;  /* complement bit 7 which in turn activates P3.7 */
    if ((opto & 0x80) == 0)
    {
        buffer[0] = 0;
        buffer[1] = 0;
        buffer[2] = 0x68;
        buffer[3] = 0x78;
        showOnce();
    }
    else
    {
        buffer[0] = 0;
        buffer[1] = 0x63;
        buffer[2] = 0x63;
        buffer[3] = 0x78;
        showOnce();
    }
}

showOnce()
{
    int i;
    for(i=0;i<500;i++)
    scanLED();
}
keydelay()
{
    if ((flag1 & 0x80) !=0)
        {
            delay--;
        if(delay == 0)
            flag1 &= ~0x80;
        }
}

comparetime()
{
    if((flag1 & 0x01) != 0 )
    {
        flag1 &= ~0x01;
    if(hour == onHour1 && min == onMin1)
            opto = 0x7f; /* clear P3.7 turning opto on   */
    if(hour == offHour1 && min == offMin1)
            opto = 0xff; /* set bit P3.7 turning opto off */
    }
}

offmsd()

{
    if (buffer[3] == 0x3f)    /* if msd = '0' then put blank unstead */
       buffer[3] = 0x00;
}

pause(j)
int j;
{
   int i;
   for (i = 0; i < j; i++)
   ;
}


written in ‘C’ language and was complied by Micro-C Compiler from DunfiledDevelopment Systems. The memory model is TINY. The hex file of clock.csuitable for downloading by Easy-Downloaderis
(Это программатор для серии 89с2051, 89с4051 находится на этом же сайте проект копировать не буду, кому надо посмотрят)
clock.hex.
Спойлер:0300000002000EED
:0300030002019F58
:20000B0002019675811FD2AFD2A91201A280FE12001B80FBC82581C822C92581C97A002224
:20002B00D083D082CF2581F581CFC082C08322CF2581F581CF22FBE493CB22FCE493FB7492
:20004B000193CC22FAE493F9740193CA2229F9E5F03AFA227C00CB30E7011CCB2275F0009B
:20006B0030E70215F022FDE493FF7401934F7004A3A3800C740293B50510740393B5F00A99
:20008B00E493C0E0740193C0E022A3A3A3A380D7FEEBA4FD8EF0ECA4FCEB8EF0A4C5F02C0F
:2000AB002DC5F02211B58EF0ED22C002C001AAF0F97E007D007F11C3E933F9EA33FADF0867
:2000CB00F5F0E9D001D00222ED33FDEE33FEC3ED9BF5F0EE9C40E0ADF0FED380DBBB0001E7
:2000EB0022C333C5F033C5F0DBF722BB000122C3C5F013C5F013DBF722240280022401C595
:20010B00F03400C5F022C394028003C39401C5F09400C5F0223116F4C5F0F4C5F02245F095
:20012B007022042231784024801A3178401E7014801A3178400E7014800A3178500E8004A0
:20014B00318C6008E4F5F022318C60F8E4F5F00422318C40F780ED318C40F170E780ED313C
:20016B008C40E170E780DD318C50E180D7C39BC5F09C20E70720D207C345F02220D2F9D340
:20018B0022C5F0C39C7003E5F09B22758CDC758A0005083205083274FFF512E4F5087412DE
:2001AB00F50DE4F50CE4F50A74FFF51DE4F50E7412F5197401F51A7412F51B7402F51CE4E5
:2001CB00F51FE4F5F079157A001200587440F7740175F00079157A001200587440F77402AD
:2001EB0075F00079157A001200587440F7740375F00079157A001200587440F7748075F020
:20020B0025C0E0C0F012079E15811581740175F00045F07003020256E5081200687B0112AA
:20022B00005F12012F700302023B1202C8020223E4F50812025712036F12042612072A12FC
:20024B0004781206961206C602021722E5090509E50975F0007B647C0012017270030202A8
:20026B00C7E4F509E50E4405F50E7432F511E50A050AE50A75F0007B3C7C00120172700362
:20028B000202C7E4F50AE50E4402F50EE50C050CE50C75F0007B3C7C0012017270030202E2
:2002AB00C7E4F50CE50D050DE50D75F0007B187C0012017270030202C7E4F50D22058105C7
:2002CB00817408F51474FFF51DE4F5F078FD12001FF608A6F078FD12001FE60886F07B04FC
:2002EB007C0012012F701902036A78FD12001FE60886F012010818F608A6F012011680D5EE
:20030B00E514F45512F5B078FD12001FE60886F079157A00120058E7F4F590740175F00023
:20032B00C0E0C0F01207551581158174FFF590E5B054101200687B0012005F12014B7003A0
:20034B0002035978FD12001FE60886F0F51DE51475F0007B017C001200F6F5140202F515A3
:20036B0081158122E4F5F079157A00120058E50C75F0007B0A7C001200AFC001C00279C129
:20038B007A0712005889828A83E493D007D000F6740175F00079157A00120058E50C75F099
:2003AB00007B0A7C001200B5C001C00279C17A0712005889828A83E493D007D000F6740220
:2003CB0075F00079157A00120058E50D75F0007B0A7C001200AFC001C00279C17A071200D2
:2003EB005889828A83E493D007D000F6740375F00079157A00120058E50D75F0007B0A7CC8
:20040B00001200B5C001C00279C17A0712005889828A83E493D007D000F622E50E54047554
:20042B00F0007B007C001201537003020477E5111511E51175F0007B007C0012015370032D
:20044B00020471740175F00079157A00120058E74480F7740275F00079157A00120058E7F8
:20046B004480F7020477E50E54FBF50E22E51D1200687BFF12005F12015370030204DEE5C9
:20048B000E548075F0007B007C0012014B70030204DEE50E4480F50E7432F51EE51D1200D7
:2004AB00689004CA0200711205BD0204DE1205140204DE1204F80204DE1204DF0204DEC4A2
:2004CB00040300BE040200B8040100B20400000000DE0422E50D050DE50D75F0007B187C65
:2004EB000012014B70030204F7E4F50D22E50C050CE4F50AE50C75F0007B3C7C0012014B4F
:20050B007003020513E4F50C22E51F051FE51F1200687B0112005F12014B7003020571E57B
:20052B000DF519E50CF51AE4F5F079157A00120058E4F7740175F00079157A0012005874BF
:20054B0068F7740275F00079157A001200587478F7740375F00079157A001200587471F7D7
:20056B00120650020577E4F51F12057822E50DF51BE50CF51CE4F5F079157A00120058742E
:20058B0063F7740175F00079157A001200587463F7740275F00079157A001200587478F7AC
:2005AB00740375F00079157A001200587471F7020650E512F4447FF512548075F0007B0045
:2005CB007C0012014B7003020613E4F5F079157A00120058E4F7740175F00079157A00129E
:2005EB000058E4F7740275F00079157A001200587468F7740375F00079157A0012005874DB
:20060B0078F712065002064FE4F5F079157A00120058E4F7740175F00079157A001200583F
:20062B007463F7740275F00079157A001200587463F7740375F00079157A0012005874788C
:20064B00F71206502205810581E4F5F078FD12001FF608A6F078FD12001FE60886F07BF486
:20066B007C0112012F701902069178FD12001FE60886F012010818F608A6F012011680D53F
:20068B001202C80206751581158122E50E548075F0007B007C0012015370030206C5E51EDC
:2006AB00151EE51E1200687B0012005F12014B70030206C5E50E547FF50E22E50E5401754D
:2006CB00F0007B007C001201537003020729E50E54FEF50EE50D75F000AB197C0012014BE0
:2006EB00600CE50C75F000AB1A7C0012014B45F07003020704747FF512E50D75F000AB1BC2
:20070B007C0012014B600CE50C75F000AB1C7C0012014B45F0700302072974FFF5122274A7
:20072B000375F00079157A00120058E775F0007B3F7C0012014B7003020754740375F00048
:20074B0079157A00120058E4F72205810581E4F5F078FD12001FF608A6F078FD12001FE684
:20076B000886F078F912001F860308860412012F701902079978FD12001FE60886F01201A9
:20078B000818F608A6F012011680CF020780158115812278FB12001F860308860474807523
:2007AB00F0701200B5120120758921F58DF58B758859759852223F0C765E4D5B7B0E7F5FAE
:00000001FF



The Clock1.c
Спойлер
Код:
/*
   CLOCK V1.0
   89C2051 + 4-digit 7-SEG led + 4-key switch
   Simple Digital Clock demostrates scanning LED and key switch.
   The clock has 1-bit output port P3.7 for driving AC load through MOC3040+triac.
   
   The source program was modified for Proview32 C51 Compiler.
   3 November 2542

           *    ****       ****    ****
           *   *    *  *  *    *  *    *
           *   *    *     *    *  *    *
           *    ****      *    *  *    *
           *   *    *     *    *  *    *
           *   *    *  *  *    *  *    *
           *    ****       ****    ****

              set   set  time    manual
             HOUR   MIN  ON/OFF  ON/OFF


   Copyright (c) 1999 W.SIRICHOTE
*/

#include <reg52.h>               /* special function register declarations   */
                                  /* for the AT89C52       */
#include <stdio.h>     


unsigned  char sec100,sec,sec5,min,hour,flag1,command,temp,opto;
/* above must be defined as register for tiny model */
unsigned char i,digit,buffer[4],onHour1,onMin1,offHour1,offMin1;
char cputick,key,delay,count1;
char convert[10] = {0x3F,0x0c,0x76,0x5e,0x4d,0x5b,0x7b,0x0e,0x7f,0x5f};


void pause(int);
void scanLED();
void manualOnOff();
void savetimeOnOff1();
void setmin();
void sethour();
void showOnce();
void savetimeOff1();

void time();
void timeToBuffer();
void blink();
void offmsd();
void keyexe();
void keydelay();
void comparetime();


void timer0int (void)  interrupt 1  using 1  {
   TH0 |= 0xdc;  // reload timer 0 with 0DC00H
   cputick++;
   time();       // update realtime clock
           
}

void main()
{
  EA = 1;
  ET0 = 1;  // or IE |= 0x82;   /* set bit EA and Timer0 enable */
  TMOD |= 0x01; /* timer 0 run 16 bit counter */
  TR0 = 1; //or TCON |= 0x10; /* run timer 0 */
  opto = 0xff;
  cputick = 0;
  hour = 18;
  min = 0;
  sec = 0;
  key = -1;
  flag1 = 0;
  onHour1 = 18;   /* 18:30 turn lamp on */
  onMin1 = 01;
  offHour1 = 18;   /* 21:30 turn off */
  offMin1 = 02;
  count1 = 0;
  buffer[0] = 0x40;
  buffer[1] = 0x40;
  buffer[2] = 0x40;
  buffer[3] = 0x40;

 // serinit(9600);     /* must be invoked for tiny model */

  while(1)
  {
    while ( cputick < 1)
    scanLED();

    cputick = 0;

/*---------- the following tasks execute every 10ms ------*/

   // time();
    timeToBuffer();
    blink();
    offmsd();
    keyexe();
    keydelay();
    comparetime();

/*----------*/
   }
}

/* ****************** change constant below for other X-tal ********/
void time ()
/* update real-time clock  */
{
   sec100++;
   if (sec100 >= 100)       /* 100 * 10 ms = 1 s */
   {sec100 = 0;
    flag1 |= 0x05;   /* set bit 0, bit 2 */
    temp = 50;
    sec++;
    if (sec >= 60)
    {sec = 0;
     flag1 |= 0x02; /* set bit 1 */
     min++;
     if (min >= 60)
     {min = 0;
     hour++;
     if (hour >= 24)
     {hour = 0;

    }
  }
 }
}
}

void scanLED() /* scan 4-digit LED and 4-key switch, if key pressed key = 0-3
else key = -1 */

{
    int i;
    digit = 0x08;
    key = -1;
    for( i = 0; i < 4; i++)  /* 4-DIGIT scanning */
    {
        P3 = ~digit & opto;  /* send complement[digit] */
        P1 = ~buffer[i];  /* send complement[segment] */
        pause(5);         /* delay a while */
        P1 = 0xff;        /* off LED */
        if ((P3 & 0x10) == 0) /* if key pressed P3.4 became low */
           key = i;       /* save key position to key variable */
        digit>>=1;        /* next digit */
    }
}


void timeToBuffer()
{
    buffer[0] = convert[min%10];
    buffer[1] = convert[min/10];
    buffer[2] = convert[hour%10];
    buffer[3] = convert[hour/10];

}

void blink()
{
    if((flag1 & 0x04) != 0) /* check bit 2 if set decrement temp until zero */
     {temp--;
        if (temp != 0)
                {
                buffer[1] |= 0x80;
                buffer[2] |= 0x80;
                }
                else( flag1 &= ~0x04);
      }
}


void keyexe()
{
    if (key != -1)
    {
        if ((flag1 & 0x80) == 0)  /* within 0.5 sec after 1st press
                                    the following execution is not allowed */
            {
                flag1 |= 0x80;
                delay = 50;

      switch(key){
        case (0): /* key position 0 */
        manualOnOff();    /* service key 0 */
        break;
        case (1): /* key position 1 */
        savetimeOnOff1();  /* service key 1 */
        break;
        case (2): /* key position 2 */
        setmin(); /* service key 2 */
        break;
        case (3): /* key position 3 */
        sethour();
                  }
                }

    }
}

void sethour()
{
    hour++;
    if ( hour== 24)
    hour = 0;

}

void setmin()
{
    min++;
    sec = 0;
    if( min == 60 )
    min = 0;
}

void savetimeOnOff1()

{
    count1++;
    if (count1 == 1)
    {
    onHour1 = hour;
    onMin1 = min;
    buffer[0] = 0x00;
    buffer[1] = 0x68;
    buffer[2] = 0x78;
    buffer[3] = 0x71;
    showOnce();
    }
    else
    {
        count1 = 0;
        savetimeOff1();
    }
}

void savetimeOff1()

{
    offHour1 = hour;
    offMin1 = min;
    buffer[0] = 0x63;
    buffer[1] = 0x63;
    buffer[2] = 0x78;
    buffer[3] = 0x71;
    showOnce();
}

void manualOnOff()

{
    opto= ~opto | 0x7f;  /* complement bit 7 which in turn activates P3.7 */
    if ((opto & 0x80) == 0)
    {
        buffer[0] = 0;
        buffer[1] = 0;
        buffer[2] = 0x68;
        buffer[3] = 0x78;
        showOnce();
    }
    else
    {
        buffer[0] = 0;
        buffer[1] = 0x63;
        buffer[2] = 0x63;
        buffer[3] = 0x78;
        showOnce();
    }
}

void showOnce()
{
    int i;
    for(i=0;i<2000;i++)
    scanLED();
}
void keydelay()
{
    if ((flag1 & 0x80) !=0)
        {
            delay--;
        if(delay == 0)
            flag1 &= ~0x80;
        }
}

void comparetime()
{
    if((flag1 & 0x01) != 0 )
    {
        flag1 &= ~0x01;
    if(hour == onHour1 && min == onMin1)
            opto = 0x7f; /* clear P3.7 turning opto on   */
    if(hour == offHour1 && min == offMin1)
            opto = 0xff; /* set bit P3.7 turning opto off */
    }
}

void offmsd()

{
    if (buffer[3] == 0x3f)    /* if msd = '0' then put blank unstead */
       buffer[3] = 0x00;
}


void pause(j)
int j;
{
   int i;
   for (i = 0; i < j; i++)
   ;
}




was modified for C51 compiler. The function that updates real-time clockwas moved into timer0 interrupt service routine. The HEX file is Clock1.hex
Спойлер:10007400C0E0C0F0C083C082C0D075D008438CDC1F
:10008400858C8C05231200F4D0D0D082D083D0F09C
:03009400D0E03287
:10009700D2AFD2A9438901858989D28C7518FFE42B
:1000A700F523751412F513F5117524FFF515751F52
:1000B70012752001752112752202F526751B4075F0
:0800C7001C40751D40751E4030
:1000CF00E5236480B48100500512012E80F2E4F51F
:1000DF002312016B12019C1202AA1201B2120278B2
:0500EF0012028780DB16
:0900F4000510E510B46400403071
:1000FD00E4F5104315057517320511E511B43C00F3
:02010D00401E92
:0F010F00E4F5114315020513E513B43C00400F4E
:0C011E00E4F5130514E514B418004003C8
:04012A00E4F51422C2
:0B012E00751A087524FFE4F533F53462
:10013900E51AF4FAE5185AF5B0E534241BF8E6F4A3
:10014900F590E4FE7F051202B37590FFE5B020E457
:1001590003853424E51AC313F51A0534E534B404C8
:02016900CF22A3
:10016B0075F00AE51384E5F02427F8861B75F00A71
:10017B00E513842427F8861C75F00AE51484E5F052
:10018B002427F8861D75F00AE514842427F8861EAB
:01019B002241
:05019C00E51530E21042
:0601A1001517E5176007C9
:0B01A700431C80431D80225315FB22E7
:0501B200E524F46028C3
:0501B700E51520E7231F
:1001BC00431580752532E524600A14600B14600C1D
:0401CC0014600D228C
:1001D000120233221201F9221201EB221201E02253
:0B01E0000514E514B41803E4F5142224
:0E01EB000513E4F511E513B43C03E4F513220B
:0701F9000526E526B40116FE
:1002000085141F851320751B00751C68751D787576
:060210001E7112025D22C6
:07021600E4F52612021D228F
:10021D00851421851322751B63751C63751D7875F7
:06022D001E7112025D22A9
:0A023300E518F4447FF51820E710E9
:10023D00751B00751C00751D68751E7812025D22F8
:10024D00751B00751C63751D63751E7812025D228A
:10025D00E4F531F53212012E0532E5327002053129
:0B026D00E531B407F0E532B4D0EB221D
:05027800E51530E70967
:0A027D001525E525700353157F22B7
:05028700E51530E01D4B
:10028C005315FEE514B51F08E513B5200375187F4B
:0E029C00E514B52108E513B522037518FF22FD
:0902AA00E51EB43F03751E00229D
:1002B300E4FCFD8EF0B2F7EC6480B5F004EDB50715
:0B02C3000050070DED70EC0C80E922EC
:0C02CE0028273F0C765E4D5B7B0E7F5FA7
:03000B000200747C
:0300000002000EED
:10000E00758135E4787FF6D8FD9002CEE4937002C8
:10001E00804EC31392D5C31392D1FFA3E493F8B0CD
:10002E00D5402130D505E4A393F5A0E420D102A359
:10003E009320D507F608DFF3A380D1F208B800F6B7
:10004E0005A080F2E8030303541F2420F9E85407A7
:10005E00F8E4D333B80002800333D8FD47F780D8D5
:06006E0075A0FF020097DF
:0102DA000023
:00000001FF

smaller than compiled by Micro-C.

I got many requests askingmodification of the source code. Now you can modify the source code byyourself with the free compiler sdcc for 8051. Here is the source codeof new firmware, clock2.c
Спойлер
Код:
/*
   CLOCK V1.0
   89C2051 @11.0592MHz + 4-digit 7-SEG led + 4-key switch
   Simple Digital Clock demostrates scanning LED and key switch.
   The clock has 1-bit output port P3.7 for driving AC load through MOC3040+triac.
   
   The source program was modified for sdcc for 8051
   January 27, 2004

           *    ****       ****    ****
           *   *    *  *  *    *  *    *
           *   *    *     *    *  *    *
           *    ****      *    *  *    *
           *   *    *     *    *  *    *
           *   *    *  *  *    *  *    *
           *    ****       ****    ****

              set   set  time    manual
             HOUR   MIN  ON/OFF  ON/OFF


  Copyright(C) 2004 WICHIT SIRICHOTE, kswichit@kmitl.ac.th

  This program is free software; you can redistribute it and/or modify it
  under the terms of the GNU General Public License as published by the
  Free Software Foundation; either version 2, or (at your option) any
  later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

*/

#include <at89x51.h>
#include <stdio.h>
 
unsigned  char sec100,sec,sec5,min,hour,flag1,command,temp,opto;
unsigned char i,digit,buffer[4],onHour1,onMin1,offHour1,offMin1;
char cputick,key,delay,count1;

char code convert[10] = {0x3F,0x0c,0x76,0x5e,0x4d,0x5b,0x7b,0x0e,0x7f,0x5f};


void pause(int);
void scanLED();
void manualOnOff();
void savetimeOnOff1();
void setmin();
void sethour();
void showOnce();
void savetimeOff1();

void time();
void timeToBuffer();
void blink();
void offmsd();
void keyexe();
void keydelay();
void comparetime();

void timer_isr (void)  interrupt 1  using 1  {
   TH0 |= 0xdc;  // reload timer 0 with 0DC00H
   cputick++;
   time();       // update realtime clock
         
}

void main()
{
  EA = 1;
  ET0 = 1;  // or IE |= 0x82;   /* set bit EA and Timer0 enable */
  TMOD |= 0x01; /* timer 0 run 16 bit counter */
  TR0 = 1; //or TCON |= 0x10; /* run timer 0 */
  opto = 0xff;
  cputick = 0;
  hour = 18;
  min = 0;
  sec = 0;
  key = -1;
  flag1 = 0;
  onHour1 = 18;   /* 18:30 turn lamp on */
  onMin1 = 01;
  offHour1 = 18;   /* 21:30 turn off */
  offMin1 = 02;
  count1 = 0;
  buffer[0] = 0x40;
  buffer[1] = 0x40;
  buffer[2] = 0x40;
  buffer[3] = 0x40;

  while(1)
  {
    while ( cputick < 1)
    scanLED();

    cputick = 0;

/*---------- the following tasks execute every 10ms ------*/

   // time();
    timeToBuffer();
    blink();
    offmsd();
    keyexe();
    keydelay();
    comparetime();

/*----------*/
   }
}

/* ****************** change constant below for another X-tal ********/
void time ()
/* update real-time clock  */
{
   sec100++;
   if (sec100 >= 100)       /* 100 * 10 ms = 1 s */
   {sec100 = 0;
    flag1 |= 0x05;   /* set bit 0, bit 2 */
    temp = 50;
    sec++;
    if (sec >= 60)
    {sec = 0;
     flag1 |= 0x02; /* set bit 1 */
     min++;
     if (min >= 60)
     {min = 0;
     hour++;
     if (hour >= 24)
     {hour = 0;

    }
  }
 }
}
}

void scanLED() /* scan 4-digit LED and 4-key switch, if key pressed key = 0-3
else key = -1 */

{
    int i;
    digit = 0x08;
    key = -1;
    for( i = 0; i < 4; i++)  /* 4-DIGIT scanning */
    {
        P3 = ~digit & opto;  /* send complement[digit] */
        P1 = ~buffer[i];  /* send complement[segment] */
        pause(5);         /* delay a while */
        P1 = 0xff;        /* off LED */
        if ((P3 & 0x10) == 0) /* if key pressed P3.4 became low */
           key = i;       /* save key position to key variable */
        digit>>=1;        /* next digit */
    }
}


void timeToBuffer()
{
    buffer[0] = convert[min%10];
    buffer[1] = convert[min/10];
    buffer[2] = convert[hour%10];
    buffer[3] = convert[hour/10];

}

void blink()
{
    if((flag1 & 0x04) != 0) /* check bit 2 if set decrement temp until zero */
     {temp--;
        if (temp != 0)
                {
                buffer[1] |= 0x80;
                buffer[2] |= 0x80;
                }
                else( flag1 &= ~0x04);
      }
}


void keyexe()
{
    if (key != -1)
    {
        if ((flag1 & 0x80) == 0)  /* within 0.5 sec after 1st press
                                    the following execution is not allowed */
            {
                flag1 |= 0x80;
                delay = 50;

      switch(key){
        case (0): /* key position 0 */
        manualOnOff();    /* service key 0 */
        break;
        case (1): /* key position 1 */
        savetimeOnOff1();  /* service key 1 */
        break;
        case (2): /* key position 2 */
        setmin(); /* service key 2 */
        break;
        case (3): /* key position 3 */
        sethour();
                  }
                }

    }
}

void sethour()
{
    hour++;
    if ( hour== 24)
    hour = 0;

}

void setmin()
{
    min++;
    sec = 0;
    if( min == 60 )
    min = 0;
}

void savetimeOnOff1()

{
    count1++;
    if (count1 == 1)
    {
    onHour1 = hour;
    onMin1 = min;
    buffer[0] = 0x00;
    buffer[1] = 0x68;
    buffer[2] = 0x78;
    buffer[3] = 0x71;
    showOnce();
    }
    else
    {
        count1 = 0;
        savetimeOff1();
    }
}

void savetimeOff1()

{
    offHour1 = hour;
    offMin1 = min;
    buffer[0] = 0x63;
    buffer[1] = 0x63;
    buffer[2] = 0x78;
    buffer[3] = 0x71;
    showOnce();
}

void manualOnOff()

{
    opto= ~opto | 0x7f;  /* complement bit 7 which in turn activates P3.7 */
    if ((opto & 0x80) == 0)
    {
        buffer[0] = 0;
        buffer[1] = 0;
        buffer[2] = 0x68;
        buffer[3] = 0x78;
        showOnce();
    }
    else
    {
        buffer[0] = 0;
        buffer[1] = 0x63;
        buffer[2] = 0x63;
        buffer[3] = 0x78;
        showOnce();
    }
}

void showOnce()
{
    int i;
    for(i=0;i<2000;i++)
    scanLED();
}
void keydelay()
{
    if ((flag1 & 0x80) !=0)
        {
            delay--;
        if(delay == 0)
            flag1 &= ~0x80;
        }
}

void comparetime()
{
    if((flag1 & 0x01) != 0 )
    {
        flag1 &= ~0x01;
    if(hour == onHour1 && min == onMin1)
            opto = 0x7f; /* clear P3.7 turning opto on   */
    if(hour == offHour1 && min == offMin1)
            opto = 0xff; /* set bit P3.7 turning opto off */
    }
}

void offmsd()

{
    if (buffer[3] == 0x3f)    /* if msd = '0' then put blank unstead */
       buffer[3] = 0x00;
}


void pause(int j)
{
   int i;
   for (i = 0; i < j; i++)
   ;
}




and the hex
Спойлер:040000000203313294
:03000B00020038B8
:0100130032BA
:01001B0032B2
:0100230032AA
:01002B0032A2
:1003310075810F12032DE582600302003302003341
:1000330012007E80FEC0E0C0F0C082C083C002C058
:1000430003C004C005C006C007C000C001C0D0750E
:10005300D008438CDC054375D0001200DD75D00851
:10006300D0D0D001D000D007D006D005D004D00323
:10007300D002D083D082D0F0D0E032D2AFD2A94325
:100083008901D28C7538FF754300753412753300BE
:100093007531007544FF753500753F127540017564
:1000A3004112754202754600753B40753C40753DF3
:1000B30040753E40C3E543648094815005120117A7
:1000C30080F27543001201681201A31202FB1201B0
:1000D300C51202BD1202D380DB220530C3E5309482
:1000E3006440307530004335057537320531C3E55B
:1000F30031943C401E7531004335020533C3E5336B
:10010300943C400F7533000534C3E5349418400321
:1001130075340022753A087544FF7A007B00C3EA00
:100123009404EB64809480503BE53AF4FCE5385C3E
:10013300F5B0EA243BF88604ECF4F590900005C092
:1001430002C003120304D003D0027590FF7410554C
:10015300B0FCBC00028A44E53AC313F53A0ABA007C
:10016300010B80BA2275F00AE53384AAF0EA900302
:100173002393FA8A3B75F00AE5338490032393FAB9
:100183008A3C75F00AE53484AAF0EA90032393FAD3
:100193008A3D75F00AE5348490032393FA8A3E225C
:1001A30074045535FABA000280171537E537600E27
:1001B3007480453CF53C7480453DF53D80035335E3
:1001C300FB22E544B4FF02804874805535FABA0037
:1001D30040433580754532E54420E735C374838554
:1001E30044F063F08095F04028E54425E0254490F1
:1001F30001F67302020202020702020C020211124A
:100203000269800D12022E8008120220800312025E
:1002130015220534E534B41803753400220533750B
:100223003100E533B43C03753300220546E546B49B
:10023300011785343F853340753B00753C68753D38
:1002430078753E7112029B80067546001202532296
:10025300853441853342753B63753C63753D7875E1
:100263003E7112029B22E538F4FA747F4AF5387422
:10027300805538FABA0011753B00753C00753D682E
:10028300753E7812029B800F753B00753C63753D8C
:1002930063753E7812029B227A007B00C3EA94D0F6
:1002A300EB648094875012C002C003120117D0037D
:1002B300D0020ABA00E60B80E32274805535FABAFD
:1002C3000002800B1545E5456002800353357F220C
:1002D30074015535FABA0002801D5335FEE534B575
:1002E3003F08E533B5400375387FE534B54108E58C
:1002F30033B542037538FF22E53EB43F03753E0034
:1003030022AA82AB837C007D00C3EC9AED64808BD0
:10031300F063F08095F050070CBC00ED0D80EA22ED
:0E0323003F0C765E4D5B7B0E7F5F7582002285
:00000001FF

file, clock2.hex.Please test it and let me know the result. I haven't tested my hardwareyet, because I cannot find it now. This project is quite long time ago.You may add your code or modify whatever you like to have using sdcc! Youmay download the sdcc here, sdcc.zip.
Practice

The function time( ) in clock.cwas not put in the timer0 service routine, there's a bit delay at scanLED() function making the clock delay, try write a function that make adjustmentof the clock.
With C51 compiler, there's aspace for more functions to put in, write a function that saves a secondtime on and off.

Heavy Load Driving
I suggest to use a zero switchsolid-state relay for driving heavy loads (>10A). Most solid state relay'sinput can be driven with 3-30Vdc without any problems.

Contribution to Clock Controller Project

Sridhar Vittalrao designed the PCB layout (Protel), Clock.zip
Petar Timotijevic Pancevo, Serbia made the single sided PCB in Cadsoft Eagle for Clock Controller Ver. 1.1. The clock controller has two PCB. The first board is main circuit and the second board is display module. Connection between them is made with ribbon cable. This makes easier to implement display in the right angle. More detailed in the compressed file, i.e. Eagle3D view of boards, specification, compiler instructions, and PCB print data information. Petar has modified some part based on the original circuit: Transformer and the output are implemented, i.e. selectable 220V or 110V. The output is optocoupler with manual on/off, and switch for pin11 output, relay on 12V with signal led diode, 78S05 is used instead of 78L05 (100mA), 7812 if needed, standard 7-seg display connection. PCB and circuit have been tested. Click here to download it, PCB V1.1.RAR
Petar Timotijevic describes how to modify the time schedule in the HEX code using the freeware HEX EDITOR directly. This eliminates the need of recompilation. Click here for the explanation, Modify Time Schedule with HEX Editor





Clock Controller V2.0

One day I found a small 7-segment LED with multiplex connection. It is nice to be used as the display for clock controller. So I spent my weekend built the board. Below are the pictures for outlook and internal. The board is quite small. The output has small relay for 0.5A AC load.
Изображение
Изображение

This version has only three buttons. We can set current hour and min easily. The preset time on/off for relay control output are defined in the program.

// preset set time on/off are predefined in rom, user may change it here

#define onHour1 19
#define onMin1 00
#define offHour1 21
#define offMin1 30

Also if you need more period to turn on/off you can add, say onHour2, onMin2, offHour2, and offMin2. And provide the function that compares such period. It will be the same as function comparetime. Or you may insert at if statements. When reset, the board will turn output off, until user set current time, the clock will run again. This prevent improper output firing.

void comparetime()
{
if(flag1 & 0x40) // compare time only when user enter new time
{
if(flag1 & 0x01)
{
flag1 &= ~0x01;
if(hour == onHour1 && min == onMin1)
opto = 0x7f; /* clear P3.7 turning opto on */
if(hour == offHour1 && min == offMin1)
opto = 0xff; /* set bit P3.7 turning opto off */
}
}
}

Download
http://www.kmitl.ac.th/~kswichit/clock/clock2.pdf
Schematic clock2.pdf
Source Code clock3.c
HEX file RTC3.HEX
Вложения
RTC3.HEX
(1.83 KiB) Скачиваний: 552
clock3.c
(5.28 KiB) Скачиваний: 815
clock.zip
(45.23 KiB) Скачиваний: 396

Re: Часы на на Микроконтроллере Семейства Mcs-51

Пн дек 09, 2013 20:09:50

Неплохая схемка, но из-за проблем с добычей программатора я предпочитаю такие не публиковать.
Кстати, вполне повторимо и на AT89S51/52, при соответствующем изменении разводки платы. А вот уже 40-лапки спокойненько с помощюь железяки вида STK200 прошиваются с простенькой оболочкой (на форуме уже многократно выложенной).
:beer:

Re: Часы на на Микроконтроллере Семейства Mcs-51

Ср дек 11, 2013 18:55:49

проблем с "добычей" программатора не вижу вообще. Он не сложнее чем для AVR
download/file.php?mode=view&id=161954
Вложения
ATMEL.GIF
(8.11 KiB) Скачиваний: 3625

Re: Часы на на Микроконтроллере Семейства Mcs-51

Ср дек 11, 2013 21:46:05

Я вообще-то и сам делал железо и проги как под саму приставку, так и ее оболочку в ПК. Да значительно посолиднее. Но это не одно и то же чтоб сделать заведомо рабочее устройство по аналогии с тем же STK200. Тем более, что у AT89C2051 есть небольшой нюанс в режиме парралельного программирования, зато паакостный... 8)

Re: Часы на на Микроконтроллере Семейства Mcs-51

Ср дек 11, 2013 22:09:10

Под какую такую приставку?
Не вижу причины для сложности, накосячить можно с любым контроллером. В устройствах (заведомо работающих) постоянно косячат с фьюзами на пример, так, что это не показатель.
О каком таком ньюансе идет речь? Сколько их пошил, не сталкивался с проблемами.
Изображение
Изображение
не сказал бы что проще...
Вложения
progsch.gif
(10.57 KiB) Скачиваний: 3217

Re: Часы на на Микроконтроллере Семейства Mcs-51

Ср дек 11, 2013 22:41:13

Может заинтересует кого этот проект часов на х51. Индикатор в них не LED а LCD, зато одновременно дату и время показывает.

Re: Часы на на Микроконтроллере Семейства Mcs-51

Сб дек 14, 2013 09:33:20

ссылка не работает.

Re: Часы на на Микроконтроллере Семейства Mcs-51

Сб дек 14, 2013 20:09:50

http://mcs.uwsuper.edu/sb/327/Projects/2011/Clock/

Re: Часы на на Микроконтроллере Семейства Mcs-51

Ср дек 25, 2013 16:36:05

Будет ли работать такая схема?(хотя бы теоретически)
http://img.radiokot.ru/files/92967/medium/7zp2hmr6f.jpg

Re: Часы на на Микроконтроллере Семейства Mcs-51

Ср дек 25, 2013 17:38:54

Есть сомнения насчёт правильности сопротивления R13.
А также очень советовал бы применить для кнопочек S1 S2 какую-нибудь из схем устранения дребезга контактов.
Да и насчёт Reset тоже есть сомнения... 8)

А вообще откуда дровишки то ? ( в смысле схемка то откуда ? ) :roll:

Re: Часы на на Микроконтроллере Семейства Mcs-51

Ср дек 25, 2013 17:51:00

petrenko писал(а):
А вообще откуда дровишки то ? ( в смысле схемка то откуда ? ) :roll:


Взял здесь
http://sokolsp.at.ua/publ/chasy_budilni ... 51/1-1-0-5
Думал уберу то, что мне не надо и будет работать

Re: Часы на на Микроконтроллере Семейства Mcs-51

Ср дек 25, 2013 22:01:49

В результате Вы изволили убрать например R13 откуда надо и врисовать его туда, куда не надо.
Ну это ладно, нормальное явление при списывании у соседа за партой сзади по диагонали - к его ошибкам добавим свои .. :)
Но ведь и у "оригинала" вопрос дребезга S1 S2 не продуман.
А ещё я подумал было, что Вы с сигналом Reset перемудрили, а оказывается - нет - просто при переписывании не "подали" питание на ИМС .
И это даже хорошо - так она точно не сгорит хотя бы.. :)
В общем сами посмотрите на оба рисунка повнимательнее ещё несколько раз.
Найдите N отличий.. :wink:

Re: Часы на на Микроконтроллере Семейства Mcs-51

Ср дек 25, 2013 23:48:30

Зряаа так насчет непродуманности антидребезга - при программной реализации динамической индикации это "побочный продукт", не говоря уже о прочих программных вариантах... 8)
вот, к примеру дремуче-древняя платформа для счетно/термо и прочей мелочевки, правда несколько прилизанная. Можно и под часики запихнуть. Правда кноп и индикаторов там "с избытком". :)))
box20_схема.pdf
(25.32 KiB) Скачиваний: 378

и печатка, еще в пайнте рисованная:
Box20_pp.pdf
(87.96 KiB) Скачиваний: 345

:sleep:
Ответить