用打印机端口做可编程频率发生器电路
![](/UpLoadFiless/Article/pic/2008-07/20080726201625526.gif)
#include<stdio.h> #include<conio.h> #include<math.h> #include<bios.h> #include<dos.h>
#define CLK1 0x04 /* Clock Pulse High*/ #define CLK0 0xfb /* Clock Pulse Low*/ #define CS1 0x01 /* Chip Select high to deactivate DAC*/ #define CS0 0xfe /* Chip Select low to activate DAC*/ #define DATA1 0x02 /* Data Pulse High*/ #define DATA0 0xfd /* Data Pulse low*/
int c[16],dport,ACTUALDATA,out,k; /*Global Declarations*/ float VOUT;/*DAC OUTPUT*/
void d2b(unsigned int x, int*c)/*Routine for Decimal to Binary Conversion*/ { int i; for(i=0;i<=15;i++) *(c++)=(x>>i) & 0x1; }
float ftov() /*Hertz to DAC output Conversion Routine*/ { int HERTZ; printf("\n \nEnter the frequency within 0 to 10000Hz:"); scanf("%d",&HERTZ); VOUT=0.00040955*HERTZ; printf("\n VOUT=%f\n",VOUT); return VOUT; }
void CLOCK_DAC(void)/*Routine for clocking the DAC*/ { out|=CLK1; outportb(dport,out);/*Setting the clock high*/ delay(1); out&=CLK0; outportb(dport,out);/*Setting the clock low*/ delay(1); }
void LOAD_DACDATA(int*c)/*Routine for loading actual data into the DAC*/ { out|=CS1; outportb(dport,out);/*Chip Select high to disable DAC*/ delay(1); out&=CS0; outportb(dport,out);/*Chip Select low to enable DAC*/ delay(1); printf("\nDATA loaded into the DAC="); for(k=15;k>=0;k--) { out|=c[k]; outportb(dport,out); printf("%d",c[k]); delay(1); CLOCK_DAC(); } out|=CS1; outportb(dport,out); delay(1); }
main() { int v,inc; float y; unsigned int x; double fraction, integer, number; clrscr(); printf("\tUse Your Printer Port as a Programmable Frequency Generator"); printf("\n\t\t\t by\n"); printf("\tK.Suresh,MSD,IGCAR,Kalpakkam,TamilNadu-603102,India"); dport= peek(0x40,8);/*Check up for availability of Printer Port*/ if (dport==0) { printf("\n\n LPT NOT AVIAILABLE! EXITING........"); exit(1); } printf("\n\nAddress of the printer port found =0x%X",dport); ftov(); y=(VOUT*8192)/(2.5*1.6384); v=y/1; number=y; fraction = modf(number, &integer); if (fraction<0.44) inc=0; else inc=1; ACTUALDATA=16384+v+inc; /*Actual data including the Control Word for DAC*/ d2b(ACTUALDATA,c); LOAD_DACDATA(c); return 0; } |