| 
 | 
 
用打印机端口做可编程频率发生器电路  
 
 
 
 
#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(" 
  
Enter the frequency  within 0 to 10000Hz:"); 
scanf("%d",&HERTZ); 
VOUT=0.00040955*HERTZ; 
printf(" 
 VOUT=%f 
",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(" 
DATA 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("        Use Your Printer Port as a Programmable Frequency Generator"); 
printf(" 
                         by 
"); 
printf("        K.Suresh,MSD,IGCAR,Kalpakkam,TamilNadu-603102,India"); 
dport= peek(0x40,8);/*Check up for availability of Printer Port*/ 
if (dport==0) 
{ 
printf(" 
 
 LPT NOT AVIAILABLE! EXITING........"); 
exit(1); 
} 
printf(" 
 
Address 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; 
} |   
 
 
 
 |