home *** CD-ROM | disk | FTP | other *** search
- 10 ' 555 OSCILLATOR DESIGN
- 20 '
- 30 ' Michael A. Covington
- 40 ' 5339-14 North Rosemead Boulevard
- 50 ' San Gabriel, CA 91776
- 60 '
- 70 ' 24 July 1983
- 80 '
- 110 SCREEN 0,0,0 : WIDTH 80 : CLS : KEY OFF
- 120 LOCATE 10,29: PRINT "555 OSCILLATOR DESIGN"
- 130 LOCATE 13,29: PRINT " by "
- 140 LOCATE 16,29: PRINT " Michael A. Covington"
- 150 LOCATE 25,26: PRINT "(Press any key to continue)";
- 160 IF INKEY$="" THEN 160
- 162 CLS: LOCATE 5,1 : PRINT,"This program helps you design astable multivi-"
- 164 PRINT,"brator circuits using the popular type 555 timer IC." : PRINT
- 166 PRINT,"The circuit diagram is given on the screen and you"
- 168 PRINT,"fill in values for the components; the frequency, "
- 170 PRINT,"period, on time, off time, and duty cycle are computed"
- 172 PRINT,"for you. You can then change values if you wish."
- 174 PRINT
- 176 PRINT,"If you have an IBM Graphics Printer or a graphics"
- 178 PRINT,"screen dump program for your printer, you can get"
- 180 PRINT,"a hard copy of the circuit and its parameters at"
- 182 PRINT,"any time.
- 184 LOCATE 25,26: PRINT "(Press any key to continue)";
- 186 IF INKEY$="" THEN 186
- 200 REM Draw diagram of 555 astable oscillator
- 205 ' outer boundaries of wiring
- 210 CLS : KEY OFF
- 220 LOCATE 1,12 : PRINT STRING$(42,196);
- 230 LOCATE 22,12 : PRINT STRING$(42,196);
- 240 FOR I=1 TO 22 : LOCATE I,12 : PRINT CHR$(179); : NEXT
- 242 LOCATE 1,12 : PRINT CHR$(218);
- 244 LOCATE 22,12 : PRINT CHR$(192);
- 248 ' outline of 555 itself
- 250 LOCATE 5,22 : PRINT STRING$(21,205);
- 260 LOCATE 18,22 : PRINT STRING$(21,205);
- 270 FOR I=5 TO 18 : LOCATE I,22 : PRINT CHR$(186); : NEXT
- 280 FOR I=5 TO 18 : LOCATE I,42 : PRINT CHR$(186); : NEXT
- 290 LOCATE 5,22 : PRINT CHR$(201);
- 300 LOCATE 5,42 : PRINT CHR$(187);
- 310 LOCATE 18,22 : PRINT CHR$(200);
- 320 LOCATE 18,42 : PRINT CHR$(188);
- 325 ' resistor
- 330 LOCATE 3,11 : PRINT CHR$(218);CHR$(193);CHR$(191);
- 340 FOR I=4 TO 5: LOCATE I,11 : PRINT CHR$(179); " "; CHR$(179); : NEXT
- 350 LOCATE 6,11 : PRINT CHR$(192);CHR$(194);CHR$(217);
- 360 ' resistor
- 370 LOCATE 9,11 : PRINT CHR$(218);CHR$(193);CHR$(191);
- 380 FOR I=10 TO 11 : LOCATE I,11 : PRINT CHR$(179);" ";CHR$(179); : NEXT
- 390 LOCATE 12,11 : PRINT CHR$(192);CHR$(194);CHR$(217)
- 400 ' capacitor
- 410 LOCATE 18,11 : PRINT CHR$(196);CHR$(193);CHR$(196);
- 420 LOCATE 19,11 : PRINT CHR$(196);CHR$(194);CHR$(196);
- 430 ' connect pin 1
- 440 LOCATE 17,32 : PRINT "1";
- 450 LOCATE 18,32 : PRINT CHR$(209);
- 460 FOR I=19 TO 21 : LOCATE I,32 : PRINT CHR$(179); : NEXT
- 470 LOCATE 22,32 : PRINT CHR$(193);
- 480 ' pin 2
- 490 LOCATE 16,12 : PRINT CHR$(195);STRING$(9,196);CHR$(182);"2";
- 500 ' pin 6
- 510 LOCATE 14,12 : PRINT CHR$(195);STRING$(9,196);CHR$(182);"6";
- 520 ' pin 7
- 530 LOCATE 8,12 : PRINT CHR$(195);STRING$(9,196);CHR$(182);"7";
- 540 ' pin 8
- 550 LOCATE 1,30 : PRINT CHR$(194);
- 560 FOR I=2 TO 4 : LOCATE I,30 : PRINT CHR$(179); : NEXT
- 570 LOCATE 5,30 : PRINT CHR$(207);
- 575 LOCATE 6,30 : PRINT "8";
- 580 ' pin 4
- 590 LOCATE 1,34 : PRINT CHR$(194);
- 600 FOR I=2 TO 4 : LOCATE I,34 : PRINT CHR$(179); : NEXT
- 610 LOCATE 5,34 : PRINT CHR$(207);
- 620 LOCATE 6,34 : PRINT "4";
- 630 ' pin 3
- 640 LOCATE 9,41 : PRINT "3";CHR$(199);STRING$(11,196);
- 650 ' various labels
- 660 LOCATE 10,30 : COLOR 0,7 : PRINT " 555 ";: COLOR 7,0
- 670 LOCATE 1,55 : PRINT "V+ (5-15v)";
- 680 LOCATE 9,55 : PRINT "Output";
- 690 LOCATE 22,55 : PRINT "V-";
- 700 LOCATE 4, 1 : PRINT "R1";
- 710 LOCATE 10, 1 : PRINT "R2";
- 720 LOCATE 18,1: PRINT "C";
- 800 REM Get values and do calculations
- 805 LOCATE 25,1 : PRINT STRING$(79," ");
- 810 IF R1*R2*C <> 0 THEN LOCATE 25,40: PRINT "(Press RETURN to leave unchanged)";
- 812 ' Get value of R1
- 815 LOCATE 25,1 : PRINT STRING$(39," ");
- 817 IF R1>0 THEN LOCATE 25,10 : PRINT R1;
- 820 LOCATE 25,1 : PRINT "R1 ("+CHR$(234)+") "; : INPUT;RESP
- 830 IF RESP>0 THEN R1=RESP
- 831 ' Verify that R1 is within safe range
- 832 IF R1>999 THEN 835
- 833 BEEP : LOCATE 24,1 : PRINT "R1 should normally be > 1000 ";CHR$(234);" to protect the discharge transistor.";
- 834 GOTO 812
- 835 LOCATE 24,1 : PRINT STRING$(79," "); ' Clear error msg. if any
- 839 LOCATE 5,1 : PRINT STRING$(10," ");CHR$(179);" ";CHR$(179);" ";
- 840 LOCATE 5,1 : PRINT R1;CHR$(234);
- 842 ' Get value of R2
- 845 LOCATE 25,1 : PRINT STRING$(39," ");
- 847 IF R2>0 THEN LOCATE 25,10 : PRINT R2;
- 850 LOCATE 25,1 : PRINT "R2 (";CHR$(234);") "; : INPUT;RESP
- 860 IF RESP>0 THEN R2=RESP
- 869 LOCATE 11,1 : PRINT STRING$(10," ");CHR$(179);" ";CHR$(179);" ";
- 870 LOCATE 11,1 : PRINT R2;CHR$(234);
- 872 ' Get value of C
- 875 LOCATE 25,1 : PRINT STRING$(39," ");
- 877 IF C>0 THEN LOCATE 25,10 : PRINT C;
- 880 LOCATE 25,1 : PRINT "C (";CHR$(230);"F) "; : INPUT;RESP
- 890 IF RESP>0 THEN C=RESP
- 899 LOCATE 19,1 : PRINT STRING$(10," ");CHR$(196);CHR$(194);CHR$(196);" ";
- 900 LOCATE 19,1 : PRINT C;CHR$(230);"F";
- 1000 ' Calculate output frequency, period, and duty cycle
- 1010 TH = 693 * (R1+R2) * (C/1000000!) ' c is in microfarads
- 1020 TL = 693 * R2 * (C/1000000!)
- 1030 PERIOD = TH+TL
- 1031 FREQ = 1000 / PERIOD ' times are in milliseconds
- 1032 IF TH+TL < .001 THEN UNIT$=CHR$(230)+"sec" ELSE UNIT$="msec"
- 1033 IF UNIT$<>"msec" THEN TL=TL*1000 : TH=TH*1000 : PERIOD=PERIOD*1000
- 1035 UNIT$=" "+UNIT$
- 1041 ' Print results
- 1045 RSF.N = 3 ' We will be rounding to 3 sig. figs.
- 1047 RSF.X = FREQ : GOSUB 40000
- 1049 LOCATE 11,45 : PRINT STRING$(35," ")
- 1050 LOCATE 11,45 : PRINT "Frequency ";RSF.X$;" Hz";
- 1052 RSF.X = 100*(TH/PERIOD) : GOSUB 40000
- 1053 LOCATE 12,45 : PRINT STRING$(35," ")
- 1054 LOCATE 12,45 : PRINT "Duty cycle ";RSF.X$;" % high";
- 1057 RSF.X = PERIOD : GOSUB 40000
- 1059 LOCATE 14,45 : PRINT STRING$(35," ")
- 1060 LOCATE 14,45 : PRINT "Period ";RSF.X$;UNIT$ ;
- 1067 RSF.X = TH : GOSUB 40000
- 1069 LOCATE 15,45 : PRINT STRING$(35," ")
- 1070 LOCATE 15,45 : PRINT "Duration (high) ";RSF.X$;UNIT$ ;
- 1077 RSF.X = TL : GOSUB 40000
- 1079 LOCATE 16,45 : PRINT STRING$(35," ")
- 1080 LOCATE 16,45 : PRINT "Duration (low) ";RSF.X$;UNIT$ ;
- 1099 ' Prompt for another try
- 1100 LOCATE 25,1 : PRINT STRING$(79," ");
- 1110 LOCATE 25,1 : PRINT "Another? (Press Y or N)";
- 1120 R$=INKEY$ : IF R$="" THEN 1120
- 1130 IF R$="Y" OR R$="y" THEN 800
- 1140 IF R$<>"N" AND R$<>"n" THEN BEEP: GOTO 1120
- 1150 LOCATE 23,1 : KEY ON
- 1200 END
- 1300 '
- 1400 '
- 2000 GOTO 800
- 40000 ' RSFCONV -- Round to a specified number of significant
- 40010 ' digits and convert to a string
- 40020 '
- 40030 ' Michael A. Covington 7/9/83
- 40040 ' Copyright 1983
- 40050 ' All rights reserved
- 40060 '
- 40070 ' Accepts: rsf.x -- number to be converted
- 40080 ' rsf.n -- desired number of significant digits
- 40090 '
- 40100 ' Returns: rsf.x$ -- number converted to string
- 40110 '
- 40120 ' Return E format numbers without further processing
- 40130 RSF.Y$=STR$(RSF.X)
- 40140 IF INSTR(RSF.Y$,"E")>0 THEN RSF.X$=RSF.Y$ : RETURN
- 40150 '
- 40160 ' Apply correction to produce rounding rather than truncation
- 40170 RSF.ABSVAL = ABS(RSF.X)
- 40180 RSF.EXP=15
- 40190 WHILE 10^RSF.EXP > RSF.ABSVAL : RSF.EXP=RSF.EXP-1 : WEND
- 40200 RSF.EXP=RSF.EXP+1-RSF.N
- 40210 RSF.CORR = SGN(RSF.X) * .5 * 10^RSF.EXP
- 40220 RSF.Y$=STR$(RSF.X + RSF.CORR)
- 40230 '
- 40240 RSF.X$ = ""
- 40250 RSF.FIGCOUNT=0
- 40260 '
- 40270 ' Transfer digits into new string one by one
- 40280 IF RSF.FIGCOUNT = RSF.N THEN 40350
- 40290 RSF.PICK$ = LEFT$(RSF.Y$,1) ' left most character
- 40300 RSF.Y$ = MID$(RSF.Y$,2) ' remainder
- 40310 IF RSF.PICK$ = " " THEN 40280
- 40320 IF RSF.PICK$="." OR RSF.PICK$="-" THEN RSF.X$=RSF.X$+RSF.PICK$ : GOTO 40280
- 40330 RSF.X$=RSF.X$+RSF.PICK$ : RSF.FIGCOUNT=RSF.FIGCOUNT+1 : GOTO 40280
- 40340 '
- 40350 ' Right number of significant digits have now been processed.
- 40360 ' Do any trailing zeroes need to be added?
- 40370 RSF.ABSVAL = ABS(RSF.X + RSF.CORR)
- 40380 WHILE 10^RSF.FIGCOUNT <= RSF.ABSVAL
- 40390 RSF.X$=RSF.X$ + "0"
- 40400 RSF.FIGCOUNT = RSF.FIGCOUNT+1
- 40410 WEND
- 40420 '
- 40430 RETURN
-