วันพุธที่ 25 กรกฎาคม พ.ศ. 2555


วงจรจับเวลา 99 วินาที ใช้ Microcontroller

โดยส่วนตัวชอบนาฬิกาที่จับเวลาได้เป็นหลักอยู่แล้ว นาฬิกาที่สะสมส่วนมากจะเป็นนาฬิกาแบบนี้ พอดีเขียน Blog ที่วิชาการ.คอมเกี่ยวกับวิธีทำนาฬิกา ซึ่งได้ยกวงจรจับเวลา 99 วินาทีนี้เป็นตัวอย่างในการทำความเข้าใจ ซึ่ง จุดเด่นของวงจรนี้คือ ไม่มีปุ่มกดจับเวลา หรือว่า หยุดจับเวลา และก็ไม่มีปุ่ม Reset อิ อิ :)
วงจรเป็นดังรูปข้างล่างนี้
99 Second Timer Counter Chronograph

ส่วนโปรแกรมที่เป็นภาษาซี เขียนด้วย MikroC ก็เป็นดังข้างล่างนี้ครับ
//PIC16F627A //4MHz Internal OSC // Two Digit Counter // 13/11/2008 // Punkky@gmail.com #define Digit1 PORTA.F0 #define Digit2 PORTA.F1 
unsigned short tick;
unsigned short x1;
unsigned short x2;
void interrupt () //Interrupt จะถูกเรียกทุกครั้งที่ Timer1 เกิดการ Overflow นั่นคือจะถูกเรียกทุกวินาทีนั่นเอง
{
        PIR1.TMR1IF = 0;        // clears TMR1IF         TMR1H = 0x80//ตั้งค่าเริ่มต้นของ Timer1 เป็น 0x8000 โดยตั้งเฉพาะสองบิตแรก        tick = 1//tick เป็น 1 ทุก 1 วินาที
}

void main(){
  CMCON = 0x07;   //Digital I/O for PORTA   TRISA = 0x00;
  PORTA = 0x00;
  TRISB = 0x00;
  PORTB = 0x00;
  T1CON = 0x0F;
       
  // Prescaler 1:1   external clock   PIE1.TMR1IE = 1;  // enable interupt to start the clock   INTCON = 0xC0;   // Set GIE, PEIE   TMR1L = 0x00;
  TMR1H = 0x80;
  PCON.OSCF = 1//Internal Clock 4MHz   x1 = 0//หลักสิบของวินาที   x2 = 0//หลักหน่วยของวินาที
  tick = 0;

  while(1){
    if(tick){ //เมื่อเวลาผ่านไป 1 วินาที ค่า tick จะเป็น 1 
       tick = 0;
       x2++; //เพิ่มหลักหน่วยของวินาทีขึ้น 1
       if(x2>9){ //ถ้าหลักหน่วยมากกว่า เก้า ก็ให้เซ็ตเป็น ศูนย์ และนับหลักสิบขึ้น 1
          x2 =0;
          x1++;
          if(x1>9){ //ถ้าหลักสิบมากกว่า เก้า ก็ให้เซ็ตเป็น ศูนย์ เพื่อกลับไปนับจาก 00 ใหม่
             x1 = 0;
          }
          PORTB = x1//นำค่าของหลักสิบไปแสดงผล          Digit1 = 1//สั่งให้ CD4543 นำข้อมูลจาก PORTB ไปแสดงบน 7-Segment
          Digit1 = 0//สั่งให้ CD4543 คงค่าของตัวเลขไว้ โดยไม่ต้องสนใจค่าของ PORTB อีก
       }
       PORTB = x2//นำค่าของหลักหน่วยไปแสดงผล
       Digit2 = 1//สั่งให้ CD4543 นำข้อมูลจาก PORTB ไปแสดงบน 7-Segment
       Digit2 = 0//สั่งให้ CD4543 คงค่าของตัวเลขไว้ โดยไม่ต้องสนใจค่าของ PORTB อีก
   }
  }


จำลองการทำงานด้วย Proteus ได้ตามภาพข้างล่าง
Simulation of 99 second counter timer
อ้างอิงจาก   http://punkky.blogspot.com/2008/11/99-microcontroller.html

ไม่มีความคิดเห็น:

แสดงความคิดเห็น