พฤษภาคม 20, 2019, 04:44:57 am *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: สอบถามเรื่องการรับค่าสวิตช์ เพื่อนำไปตั้งเวลาเปิดปิด แทนการกำหนดค่าตายตัว  (อ่าน 5969 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
aot253569
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 7


| |
« เมื่อ: มิถุนายน 26, 2013, 05:17:37 am »

รบกวนผู้รู้ช่วยตอบคำถามต่อไปนี้ทีครับ

1.จะรับค่าจากการกดสวิตช์ เพื่อนำไปตั้งเวลาเปิดปิด ต้องทำยังไงบ้าง(เพราะตอนนี้ผมกำหนดค่าตายตัวไว้ในโค๊ด ซึ่งจะอัพให้ดูนะครับ)
Code:
/*
   CLOCK CONTROLLER V2.0
   89C2051 + 4-digit 7-SEG led + 2-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.
  
 
           *    ****       ****    ****
           *   *    *  *  *    *  *    *
           *   *    *     *    *  *    *
           *    ****      *    *  *    *
           *   *    *     *    *  *    *
           *   *    *  *  *    *  *    *
           *    ****       ****    ****

              set                 set
             HOUR                 MIN  


   Copyright (c) 2006 WICHIT SIRICHOTE, kswichit@kmitl.ac.th
*/

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

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

#define onHour1 8
#define onMin1 30
#define onSec1 01
#define offHour1 8
#define offMin1 30
#define offSec1 05
#define onHour2 9
#define onMin2 30
#define onSec2 01
#define offHour2 9
#define offMin2 30
#define offSec2 05
#define onHour3 10
#define onMin3 30
#define onSec3 01
#define offHour3 10
#define offMin3 30
#define offSec3 05
#define onHour4 11
#define onMin4 30
#define onSec4 01
#define offHour4 11
#define offMin4 30
#define offSec4 05
#define onHour5 12
#define onMin5 30
#define onSec5 01
#define offHour5 12
#define offMin5 30
#define offSec5 05
#define onHour6 13
#define onMin6 30
#define onSec6 01
#define offHour6 13
#define offMin6 30
#define offSec6 05
#define onHour7 14
#define onMin7 30
#define onSec7 01
#define offHour7 14
#define offMin7 30
#define offSec7 05
#define onHour8 15
#define onMin8 30
#define onSec8 01
#define offHour8 15
#define offMin8 30
#define offSec8 05
#define onHour9 16
#define onMin9 30
#define onSec9 01
#define offHour9 16
#define offMin9 30
#define offSec9 05
#define onHour10 17
#define onMin10 30
#define onSec10 01
#define offHour10 17
#define offMin10 30
#define offSec10 05

unsigned  char sec100,sec,sec5,min,hour,flag1,command,temp,opto;
unsigned char i,digit, buffer[4];
char cputick,key,delay,count1;
unsigned char convert[10] = {0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void pause(int);
void scanLED();


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 |= 0xd8;  // reload timer 0 with d8f0h
TL0 |= 0xf0;
    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 = 07;
  min = 30;
  sec = 0;
  key = -1;
  flag1 = 0;
 
  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 ------*/

    timeToBuffer();
    blink();
    offmsd();
    keyexe();
    keydelay();
    comparetime();
  
/*-----------------------------------------------------------*/
   }
}

/* update real-time clock  */
void time ()

{
   if (++sec100 >= 100)       /* 100 * 10 ms = 1 s */
   {sec100 = 0;
    flag1 |= 0x05;   /* set bit 0, bit 2 */
    temp = 50;
    if (++sec >= 60)
    {sec = 0;
     flag1 |= 0x02; /* set bit 1 */
       if (++min >= 60)
     {min = 0;
         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 segment */
        pause(10);         /* delay a while */
        P1 = 0x00;        /* 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()
{
  if(flag1&0x40) // run only when any key was pressed
  {
    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) /* check bit 2 if set decrement temp until zero */
     {temp--;
        if (temp != 0)
                {
                  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 */
        ;
        break;
        case (1): /* key position 1 */
        ;
        break;
        case (2): /* key position 2 */
        setmin(); /* service key 2 */
        break;
        case (3): /* key position 3 */
        sethour();
                  }
                }

    }
}

void sethour()
{
    flag1 |= 0x40; // enable time upldate
    if ( ++hour== 24) hour = 0;

}

void setmin()
{
     flag1 |= 0x40; // enable time upldate
    sec = 0;
    if( ++min == 60 ) min = 0;
}


void keydelay()
{
    if (flag1 & 0x80)
        {
          delay--;
        if(delay == 0) flag1 &= ~0x80;
        }
}

void comparetime()
{
  if(flag1 & 0x40) // compare time only when user enter new time
  {
    if(flag1 & 0x01)
    {
        flag1 &= ~0x01;
    if(hour == onHour1 && min == onMin1 && sec == onSec1)
            opto = 0x7f; /* clear P3.7 turning opto on   */
    if(hour == offHour1 && min == offMin1 && sec == offSec1)
            opto = 0xff; /* set bit P3.7 turning opto off */
if(hour == onHour2 && min == onMin2 && sec == onSec2)
            opto = 0x7f; /* clear P3.7 turning opto on   */
    if(hour == offHour2 && min == offMin2 && sec == offSec2)
            opto = 0xff; /* set bit P3.7 turning opto off */
if(hour == onHour3 && min == onMin3 && sec == onSec3)
            opto = 0x7f; /* clear P3.7 turning opto on   */
    if(hour == offHour3 && min == offMin3 && sec == offSec3)
            opto = 0xff; /* set bit P3.7 turning opto off */
if(hour == onHour4 && min == onMin4 && sec == onSec4)
            opto = 0x7f; /* clear P3.7 turning opto on   */
    if(hour == offHour4 && min == offMin4 && sec == offSec4)
            opto = 0xff; /* set bit P3.7 turning opto off */
if(hour == onHour5 && min == onMin5 && sec == onSec5)
            opto = 0x7f; /* clear P3.7 turning opto on   */
    if(hour == offHour5 && min == offMin5 && sec == offSec5)
            opto = 0xff; /* set bit P3.7 turning opto off */
if(hour == onHour6 && min == onMin6 && sec == onSec6)
            opto = 0x7f; /* clear P3.7 turning opto on   */
    if(hour == offHour6 && min == offMin6 && sec == offSec6)
            opto = 0xff; /* set bit P3.7 turning opto off */
if(hour == onHour7 && min == onMin7 && sec == onSec7)
            opto = 0x7f; /* clear P3.7 turning opto on   */
    if(hour == offHour7 && min == offMin7 && sec == offSec7)
            opto = 0xff; /* set bit P3.7 turning opto off */
if(hour == onHour8 && min == onMin8 && sec == onSec8)
            opto = 0x7f; /* clear P3.7 turning opto on   */
    if(hour == offHour8 && min == offMin8 && sec == offSec8)
            opto = 0xff; /* set bit P3.7 turning opto off */
if(hour == onHour9 && min == onMin9 && sec == onSec9)
            opto = 0x7f; /* clear P3.7 turning opto on   */
    if(hour == offHour9 && min == offMin9 && sec == offSec9)
            opto = 0xff; /* set bit P3.7 turning opto off */
if(hour == onHour10 && min == onMin10 && sec == onSec10)
            opto = 0x7f; /* clear P3.7 turning opto on   */
    if(hour == offHour10 && min == offMin10 && sec == offSec10)
            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++) continue;
}
ผมได้กำหนดไว้ใน #define แล้ว หลักการทำงานคือ เมื่อถึงเวลาไว้มันก็จะเปิดให้รีเลย์ทำงาน พอถึง5วิก็จะดับ

2.ผมจะสามารถให้มันทำงานตามวัน/เดือน/ปี ได้หรือไม่ ถ้าได้ต้องเพิ่มหรือทำวิธีไหนครับ

รูปภาพจำลองโปรเจ๊ค
ภาพเมื่อเริ่มต้นการทำงาน



ภาพเมื่อกดสวิตช์ Hour เวลาจะเริ่มที่ 8 : 30


ภาพเมื่อถึงเวลาที่กำหนด รีเลย์ทำงาน


ภาพเมื่อถึงเวลาที่กำหนด รีเลย์ไม่ทำงาน(หัลงจากรีเลย์ทำงานไปแล้ว 5วิ)


3.ถ้ามีข้ออะไรเพิ่มเติม โปรดช่วยแนะนำทีนะครั
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #1 เมื่อ: มิถุนายน 26, 2013, 08:14:23 am »

อ้างถึง
1.จะรับค่าจากการกดสวิตช์ เพื่อนำไปตั้งเวลาเปิดปิด ต้องทำยังไงบ้าง(เพราะตอนนี้ผมกำหนดค่าตายตัวไว้ในโค๊ด ซึ่งจะอัพให้ดูนะครับ)
รับค่าจาก Switch แล้วให้ทำอะไรบางอย่าง ไม่มีอะไรมากไปกว่า if/else ครับ คิดว่าเป็นเรื่องพื้นฐาน คุณเขียน code มาได้ขนาดนี้แล้วคงไม่ใช่เรื่องยาก หรือว่าความหมายของคำถามนี้มีนัยมากกว่านี้

อ้างถึง
2.ผมจะสามารถให้มันทำงานตามวัน/เดือน/ปี ได้หรือไม่ ถ้าได้ต้องเพิ่มหรือทำวิธีไหนครับ
ได้ครับ if/else เช่นกัน


** เปลี่ยนจากการ #define เป็นตัวแปรที่ถูกเปลี่ยนค่าได้โดยการกดสวิตซ์ ก็น่าจะตอบโจทย์ของคุณได้แล้วครับ **
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
aot253569
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 7


| |
« ตอบ #2 เมื่อ: มิถุนายน 26, 2013, 02:22:21 pm »

แหะๆ คือผมเขียนไม่ค่อยเก่งครับ เคยเขียนแต่ภาษาษี ใน turbo C ยังไม่เคยเขียนลง MCU ทำให้ผมสับสนบางคำสั่ง ส่วนCode ผมก็มาดัดแปลงเอาทีหลัง เลยไม่รู้จะแทรกคำสั่ง switch กับ คำสั่ง วันที่ เดือน ปีอะครับ พอมีแนวให้ผมบ้างหรือเปล่าครับ แต่ผมก็จะพยายามเกาๆไปให้ได้ อิอิ
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #3 เมื่อ: มิถุนายน 26, 2013, 09:18:31 pm »

ไม่มีแนวทางลัดอื่นแนะนำครับ
การเขียนโปรแกรมใดๆ ถ้ายังใช้ Program Flow Control (if, else, switch, case,...) ไม่เป็น ถือเป็นเรื่องที่ลำบากมากๆ ที่จะดัดแปลง code หรือเขียน code ออกมาให้ได้ดังใจ

ขอแนะนำให้เริ่มศึกษาพื้นฐานครับ นั่นน่าจะเป็นทางออกที่เหมาะสมที่สุดแล้ว

ความจริงมันมีอยู่ว่า.... วงการนี้ไม่มีทางลัด ใครก็ตามที่จะพยายามเดินลัด จะพบกับทางตัน
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
aot253569
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 7


| |
« ตอบ #4 เมื่อ: มิถุนายน 27, 2013, 03:45:01 pm »

อ้อ ขอบคุณมากครับ สงสัยผมต้องไปศึกษา แล้วถ้าผมเขียนโค๊ดแล้วติดตรงไหน ผมขออนุญาติถามท่านอาจารย์นะครับ
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #5 เมื่อ: มิถุนายน 27, 2013, 04:05:44 pm »

ยินดีครับ  smiley
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: