Sie sind auf Seite 1von 9

First this was just an idea we saw one day on the internet ,it was Bob Blick who

made it first using the PIC 16C84, but I was not having the same microcontroller so I decided making the same from the 8051 microcontrollers. Firstly select a high speed motor, you can select the one from your old tape recorders, that would be sufficient enough to drive this clock.

Schematic Then coming to the circuitry part our at89S52 microcontroller ,8 bright red 8 resistances (220 ), a photo diode, a motor,a pull up ladder,a 10f cap, clock just consist of the led, a perforated PCB, an infrared transmitter, 12 volt battery .

The clock is on a spinning piece of pcb, but it must get power so to give the required power a 9 volt battery is applied which works very fine as u can see the results are super fine. The circuit can be made either by designing the pcb or it can be made on a zero pcb as we have done , because doing it on a zero pcb was very much easy.Firstly a 20 pin socket for the AT89C2051 was

attatched,then connecting the power supplies leds and resistances. The circuit is very easy as it took me only 2 hours and by evening the clock was running. For the leds I used the 220 ohms resisors for proper brightness. A crystal of 11.0592 Mhz was selected to provide the clock to the microcontroller. Connect the motor properly between the pcb so as to maintain the centre of gravity so that the clock does not wobble and the display is crystal clear. So much done, now only thing left is programming the microcontroller. I used the at89s52 microcontroller which belongs to the 8051 family of microcontrollers.so I used the kiel compiler to write the program code. The code is written in c language and the code finally burned to the controller and the clock is running.

Software
For programming the microcontroller you will require a programmer. You can use a parallel port programmer or make a serial port programmer as per your requirements and availability. Use keil compiler to compile the code. Code have no logic to set the clock variable it will be updated soon. we are also looking for scrolling message display. Now as we see what runs this clock.yes the code. Firstly we generated the look up table for the digits we want to display on our clock . These values will be stored in a double dimensional array and timely called to generate the display. The clock works using interrupts and timers. The external interrupt used tells the microcontroleer that a single revolution is completed and tells the timer to generate the display and then stop after displaying. One timer i.e. the timer 1 is used to generate the clock internally And the external interrupt call the values of this timer everytime to display the time. We also use priority , that is priorities are assigned to the interrupts and timers. Timer1 keeps the count of the time and timer0 performs the task of

displaying maintaining appropriate frames that would be displayed and create a persistence of vision. Here is the CODE #include<at89x52.h> const unsigned char code flook [][5] = { { 0x3E, 0x51, 0x49, 0x45, 0x3E }, // 0 { 0x00, 0x42, 0x7F, 0x40, 0x00 }, // 1 { 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2 { 0x21, 0x41, 0x45, 0x4B, 0x31 }, // 3 { 0x18, 0x14, 0x12, 0x7F, 0x10 }, // 4 { 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5 { 0x3C, 0x4A, 0x49, 0x49, 0x30 }, // 6 { 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7 { 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8 { 0x06, 0x49, 0x49, 0x29, 0x1E } // 9 }; const unsigned char code colon[]={0x00,0x18,0x00}; unsigned char a,b,c,d,e,f; bit tog; void Int0(void) interrupt 0 using 2 { EX0=0; TH0=0xA4; TR0=1; } void timer0(void) interrupt 1 { static unsigned char i,k; using 3 // Start timer 0 // Avoid another INT1* until we are completely finished... k*

k++; if(k==12) { k=0; if(i<5) { P0=~(flook[f][i]); i++; } else if(i==5)//space { P0=0xFF; i++; } else if(i<11)//space { P0=~(flook[(e%10)][i-6]); i++; } else if(i<14)//colon { if(tog==1) { P0=~(colon[i-11]); } else { P0=0xFF; } //hours ten digit

i++; } else if(i<19)//min tens { P0=~(flook[d][i-14]); i++; } else if(i==19)//space { P0=0xFF; i++; } else if(i<25)//min one { P0=~(flook[c][i-20]); i++; } else if(i<28)//colon { if(tog==1) { P0=~(colon[i-25]); } else { P0=0xFF; } i++; } else if(i<33)//sec tens

{ P0=~(flook[b][i-28]); i++; } else if(i==33)//space { P0=0xFF; i++; } else if(i<39)//sec ones { P0=~(flook[a][i-34]); i++; } else {TR0=0; P0=0xFF; EX0=1; i=0; } } } void delay() { int fi,fj; for(fi=0;fi<160;fi++) { for(fj=0;fj<1250;fj++) ; }

} void main() { TMOD=0x02; TH0=0xA4; EX0 */ IT0 */ ET0 */ PT0 */ PX0 */ = 1; = 1; = 1; = 1; = 1; /* External interrupt 0 enable /* External interrupt 0 Edge sesitive /* Enable Timer 0 interrupts /* Timer 0 high priority /* External interrupt 0 high priority

/*----------------------------------------------Configure INT0 (external interrupt 0) to generate an interrupt on the falling-edge of /INT0 (P3.2). Enable the EX0 interrupt and then enable the global interrupt flag. -----------------------------------------------*/ EX0 = 1; EA = 1; P0=0xFF; P3=0xFF; a=0; b=0; c=0; d=0; e=0; f=0; //sec one's //sec ten's //min one's //min ten's //hr one's //hr ten's // Enable EX0 Interrupt // Enable Global Interrupt Flag

tog=0; while(1) { delay(); tog=~tog; a++; if(a>9) { a=0; b++; } if(b>5) { b=0; c++; } if(c>9) { c=0; d++; } if(d>5) { d=0; e++; } if(e>12) {

e=0; } if(e>9) { f=1; } else { f=0; } } }

Das könnte Ihnen auch gefallen