โดยส่วนตัวชอบนาฬิกาที่จับเวลาได้เป็นหลักอยู่แล้ว นาฬิกาที่สะสมส่วนมากจะเป็นนาฬิกาแบบนี้ พอดีเขียน Blog ที่วิชาการ.คอมเกี่ยวกับวิธีทำนาฬิกา ซึ่งได้ยกวงจรจับเวลา 99 วินาทีนี้เป็นตัวอย่างในการทำความเข้าใจ ซึ่ง จุดเด่นของวงจรนี้คือ ไม่มีปุ่มกดจับเวลา หรือว่า หยุดจับเวลา และก็ไม่มีปุ่ม Reset อิ อิ :)
วงจรเป็นดังรูปข้างล่างนี้
ส่วนโปรแกรมที่เป็นภาษาซี เขียนด้วย 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 ได้ตามภาพข้างล่าง
Friday, November 14, 2008
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment