Upload
deepak-kuttath
View
248
Download
0
Embed Size (px)
DESCRIPTION
From sourced
Citation preview
CONSTRUCTION
J U N E 2 0 0 7 W W W . E F Y M A G . C O M
JAYARAMAN KIRUTHI VASAN
MICROCONTROLLER-BASEDINDUSTRIAL TIMER
SUNIL KUMAR
I ndustrial timers can be con-structed using discrete compo-nents including up/downcounters and timers. However, to in-corporate various facilities like settingthe count, start, stop, reset and dis-play, these circuits would require toomany ICs and discrete components.
A microcontroller-based industrialtimer can be programmed and usedas a timer, counterand time totaliser.Here is a simple de-sign based on 40-pinAtmel AT89S52microcontroller thatperforms count-downoperation up to 9999minutes/second withfour 7-segment dis-plays showing the ac-tual time left. The re-lay energises as youpress the start switchand remains on till thecountdown reaches0000. Four tactile,push-to-on switchesare used to start/stop,select either minutesor seconds, and set theinitial value for count-down operation (us-ing up and downkeys).
CircuitdescriptionFig. 1 shows the cir-cuit of themicrocontroller-basedindustrial timer. Themicrocontroller isAtmel AT89S52 (IC1),which is a 40-pin de-
is configured for segments of the 7-segment display. Port 0 is an 8-bitopen-drain bidirectional I/O port. Port0 is pulled up with 10-kilo-ohm resis-tor network RNW1. Port pins P0.0through P0.6 are connected to pins ofsegments a through g via resistorsR2 through R8, respectively. Port P0.7is connected to decimal via resistor R9.Resistors R2 through R9 are used ascurrent limiter for various segments ofdisplays, respectively.
vice with 8 kB of program flashmemory, 256 bytes of RAM, 32 I/Olines, Watchdog timer, two data point-ers, three 16-bit timer/counters, a six-vector two-level interrupt architecture,a full-duplex serial port, on-chip oscil-lator and clock circuitry. The power-down mode saves the RAM contentsbut freezes the oscillator, disabling allother chip functions until the next in-terrupt or hardware reset is activated.
Port P0 of microcontroller AT89S52
CONSTRUCTION
J U N E 2 0 0 7 W W W . E F Y M A G . C O M
Port 2 is used to control DIS1through DIS4. Port 2 is an 8-bit bidi-rectional I/O port with internal pull-ups. When port-2 pin is low, the tran-sistor conducts and provides supplyto the common pin of 7-segment dis-play. Port pins P2.5 through P2.2 con-trol DIS1 through DIS4 with the helpof transistors T1 through T4, respec-tively.
The microcontroller drives the 7-segment displays in multiplex mode.This helps in reducing current con-sumption while maintaining thebrightness of the display. For drivingthe displays, timer 2 inside themicrocontroller is used. It enables dis-play of each digit every two millisec-onds.
For driving the dis-plays, the microcontrolleruses port-0 to send thesegment outputs. It se-lects the correspondingunits, tens, hundredsand thousands displaysthrough P2.5, P2.4, P2.3and P2.2, respectively.
Four pins of port 1 areused for various switcheslike select, up, down andstart/stop. Port 1 is an 8-bit bidirectional I/O portwith internal pull-ups.Switches S1 through S4are connected to pins 5through 8 of themicrocontroller and usedfor select, up, down andstart/stop functions, re-spectively.
Pin P3.7 controls re-lay RL1. When pin P3.7goes high, transistor T5 isdriven into saturation
and relay RL1energises. Diode D1serves as a free-wheel-ing diode. Any appli-ance can be connectedwith contacts of relayRL1.
Power-on-reset isachieved by connect-ing resistor R1 and ca-pacitor C1 to pin 9 ofthe microcontroller.
Other ends of the capacitor and resis-tor are connected to Vcc and ground,respectively. Switch S5 is used formanual reset. The microcontroller isoperated with the clock derived froma 20MHz crystal oscillator.
Power supply. Fig. 2 shows the cir-cuit of the power supply. The ACmains is stepped down by transformerX1 to deliver a secondary output of7.5V at 350 mA. The transformer out-put is rectified by a full-wave bridgerectifier BR1, filtered by capacitor C5and regulated by IC2. Capacitor C6 by-passes any ripple present in the regu-lated output. Unregulated power sup-ply is used for relay RL1.
An actual-size, single-side PCB lay-out for the microcontroller-based in-
dustrial timer (Fig. 1) including powersupply (Fig. 2) is shown in Fig. 3 andits components layout in Fig.4.
OperationSwitch on the circuit using using ON/
OFF switch S6. Themicrocontroller is resetby power-on-reset andthen timer is in secondsmode. The select key se-lects the mode betweenseconds and minutes.This is displayed as 0for seconds and 1 forminutes on thehundreds digit display(DIS3), respectively.
Up key incrementsthe time setting in sec-onds and minutes.
Down key decre-ments the time setting inseconds and minutes.
After setting the de-sired time with the helpof up and down keys,press start key. Thisenergises the relay. Thetimer counts down forthe set time and once thedisplay becomes zero,
PARTS LISTSemiconductor:IC1 - AT89S52 micrcontrollerIC2 - 7805 5V regulatorT1-T4 - BC557 pnp transistorT5 - BC547 npn transistorBR1 - 1A bridge rectifierD1 - 1N4007 rectifier diodeDIS1-DIS4 - LTS542 common-anode
display
Resistors (all -watt, 5% carbon):R1, R14-R18 - 8.2-kilo-ohmR2-R9 - 270-ohmR10-R13 - 470-ohmRNW1 - 10-kilo-ohm resistor
network
Capacitors:C1 - 10F,16V electrolyticC2, C3 - 33pF ceramic diskC4, C6 - 0.1F ceramic diskC5 - 1000F, 25V electrolytic
Miscellaneous:X1 - 230V AC primary to 6V,
350mA secondarytransformer
XTAL - 20MHz crystalRL1 - 6V, 1C/O relayS1-S5 - Push-to-on switchS6 - On/off switch
CONSTRUCTION
J U N E 2 0 0 7 W W W . E F Y M A G . C O M
the relay de-energises.The timer will stop be-fore preset time by press-ing start key again.
SoftwareThe source program iswritten in C languageand compiled with KeilMicrovision 3 IDE. It iswell commented andeasy to understand.D o w n l o a dC51V808A.EXE fromwww.keil.com/demo/eval/c51.htm. This file isa freely available andself-extracting setup pro-gram for KeilMicrovision 3 IDE.
Normally, when thereis no interrupt, themicrocontroller executeswhile loop in the mainfunction. Here it scansthe keys and acts according to the keypressed.
Two interrupts are enabled in thesoftware, namely, timer 0 and timer 2.Timer 0 counts milliseconds, which arethen accumulated to seconds or min-utes according to the user selection.Timer 2 drives the displays in multi-plex mode.
For time counting, timer 0 is
initialised by the voidTimer0_init(unsigned charTimer0h,unsigned char Timer0l) func-tion. Timer 0 interrupts themicrocontroller every millisecond.
When interrupted by timer 0, themicrocontroller executes the voidisr_t0(void) function wherein it incre-ments two counter variables, namely,Timer0Counter and LedCounter.
Timer0Counter is re-sponsible for countingthe number of millisec-onds elapsed and incre-ments the minutes/sec-onds counter accordingto the mode selected(seconds or minutescount). Once the setvalue is reached, thetimer-0 interrupt is dis-abled and time countingstops.
The LED countermakes the dot LED of theunits digit flash everysecond once.
Display-driving pro-cess is taken care of bythe built-in timer 2. Timer2 is initialised by the voidTimer2_init(unsignedchar Timer2h,unsignedchar Timer2l) function.
Timer 2 gives an in-terrupt to the microcontroller toswitch on the common pin of each 7-segment display for every two milli-seconds. When an interrupt occurs, thevoid isr_t2(void) function is executedand the microcontroller returns towhile loop in the main function.
EFY note. The software and otherrelevant files of this article have beenincluded in this months EFY-CD.
SOURCE PROGRAM/*** Include Files ***/#include
/*** RENAMING OF PORTS ****/#define SegPort P0#define DigPort P2
/* CODE FOR LIGHTING EACH SEGMENT OFTHE SEVEN SEGMENT LED DISPLAY */#define seg_a 0xfe#define seg_b 0xfd#define seg_c 0xfb#define seg_d 0xf7#define seg_e 0xef#define seg_f 0xdf#define seg_g 0xbf#define seg_dot 0x7f/* SEVEN SEGMENT CODE FOR EACH NUM-BER FROM 0 TO 9 ,DOT AND SPACE */#define NUM_0 (seg_a & seg_b & seg_c & seg_d& seg_e & seg_f)#define NUM_1 (seg_b & seg_c)#define NUM_2 (seg_a & seg_b & seg_d & seg_e& seg_g)#define NUM_3 (seg_a & seg_b & seg_c & seg_d& seg_g)#define NUM_4 (seg_b & seg_c & seg_f & seg_g)#define NUM_5 (seg_a & seg_c & seg_d & seg_f
& seg_g)#define NUM_6 (seg_a & seg_c & seg_d & seg_e& seg_f & seg_g)#define NUM_7 (seg_a & seg_b & seg_c)#define NUM_8 (seg_a & seg_b & seg_c & seg_d& seg_e & seg_f & seg_g)#define NUM_9 (seg_a & seg_b & seg_c & seg_d& seg_f & seg_g)#define NUM_DOT (seg_dot)#define NUM_SPACE 0Xff;
const unsigned char hex_table[] ={NUM_0,NUM_1,NUM_2,NUM_3,NUM_4,NUM_5,NUM_6,NUM_7, NUM_8,NUM_9,NUM_DOT};/* ADDRESS FOR SELECTING THE COMMONPIN OF THE DISPLAY FOR EACH DIGIT */#define UNITS 0xdf#define TENS 0xef#define HUNDS 0xf7#define THS 0xfb/* RELOAD VALUE FOR TIMER2 FOR INTER-RUPT DURATION OF 2 MILLISECONDS */#define TIMER2H_2MS 0xf2#define TIMER2L_2MS 0xfb/* RELOAD VALUE FOR TIMER0 FOR INTER-
RUPT DURATION OF 1 MILLISECOND */#define TIMER0H_1MS 0xf9#define TIMER0L_1MS 0x7e/* VECTOR VALUE FOR TIMER INTERRUPT*/#define TIMER0VECTOR 1#define TIMER2VECTOR 5/* MINUTES AND SECONDS CONSTANTS */#define SEC 999#define MIN (60 * SEC)/* VARIABLES DEFINITION */unsigned char Units;unsigned char Tens;unsigned char Hunds;unsigned char Ths;unsigned int Timer0Counter=0;unsigned char DisplayCounter=0;unsigned int LedCounter=0;unsigned char TimeDig;unsigned int OneSecCount=0;unsigned int SetSec=0;unsigned char OneMinCount;unsigned char key;unsigned char KeyCount;unsigned char Mode;/* FUNCTION PROTOTYPES */void Timer0_init(unsigned charTimer0h,unsigned char Timer0l);
CONSTRUCTION
J U N E 2 0 0 7 W W W . E F Y M A G . C O M
void Timer2_init(unsigned charTimer2h,unsigned char Timer2l);void Display(unsigned char Digit);void IntToSevSeg(unsigned int TimeTemp);void KeyDebounce(unsigned char dly);void Keyscan(void);/* RENAMING PORT PINS FOR EASY USAGE*/sbit RELAY = P3^7;sbit SEL = P1^4;sbit UP = P1^5;sbit DN = P1^6;sbit STRT = P1^7;/* MAIN FUNCTION */void main(void){RELAY = 0;Timer2_init(TIMER2H_2MS,TIMER2L_2MS);Timer0_init(TIMER0H_1MS,TIMER0L_1MS);TR0=0;EA=1;while(1)
{if(TR0==0)IntToSevSeg(SetSec);else if( (TR0==1)&& (Timer0Counter==0) )
IntToSevSeg(OneSecCount);Keyscan();
switch(key){case 4:
if(SetSec>0){if(TR0==0)
{OneSecCount
= SetSec;RELAY = 1;TR0=1;}
else{TR0=0;}
}key=0;break;
case 3:SetSec;if(SetSec>9999)
SetSec=9999;key=0;break;
case 2:SetSec++;if(SetSec>9999)
SetSec=0;key=0;break;
case 1:Mode++;if(Mode>1)Mode=0;Hunds=hex_table[Mode];Tens = NUM_SPACE;Units = NUM_SPACE;key=0;KeyDebounce(10);break;
}}
}
/* TIMER INITIALISATION FUNCTIONS */void Timer0_init(unsigned charTimer0h,unsigned char Timer0l){TMOD &= 0xf0;TMOD |= 0x01;TH0 = Timer0h;TL0 = Timer0l;ET0=1;TR0=1;}
void Timer2_init(unsigned char
Timer2h,unsigned char Timer2l){T2CON = 0x04;T2MOD = 0x00;TH2 = Timer2h;RCAP2H=Timer2h;TL2 = Timer2l;RCAP2L=Timer2l;ET2=1;TR2=1;}
/* KEYSCAN FUNCTIONS */void Keyscan(void){while( (SEL==0) || (STRT==0) )
{KeyDebounce(1);if(SEL==0)key=1;else if(STRT==0)key=4;
}if ((UP==0) || (DN==0) )
{KeyCount;if(KeyCount0)
{dly;for(z=0;z3)DisplayCounter=0;Display(DisplayCounter);TF2 = 0;
}
/* Counts Seconds */void isr_t0(void) interrupt TIMER0VECTOR{TH0 = TIMER0H_1MS;TL0 = TIMER0L_1MS;TF0=0;Timer0Counter++;//Counts every 1msec.LedCounter++;
if(LedCounter=200) && (LedCounterSEC)
{Timer0Counter=0;OneSecCount;if(OneSecCount==0)
{//OneSecCount=0;TR0=0;RELAY = 0;}
}}
else if(Mode==1){
if(Timer0Counter>MIN){Timer0Counter=0;OneSecCount;if(OneSecCount>MIN)
{OneSecCount=0;TR0=0;RELAY = 0;}
}}
}
/****************** END *****************/ z