www.pudn.com > adcc.rar > adcc.c


/************************************************************************** 
A/D转换模块演示程序 
来源: 郑州远博科技   王兴民 
0371-6949037  0371-7256036 13949105551 
实验本程序,需要把转换模块上的J2短路 
阅读本程序,需要参照AD0832的使用说明及时序图进行 
***************************************************************************/ 
#include  
#include  
#define CS    P0_0    //ADC0832 的CS端 
#define CLK   P0_1    //ADC0832 的CLK端 
#define DO    P0_2    //ADC0832 的DO端 
#define DI    P0_3    //ADC0832 的DI端 
#define SDA    P2_7    //74LS164 SAD 
#define SCK    P2_6    //74LS164 SCK 
#define BIT5   P2_5    //数码管位1 
#define BIT4   P2_4    //数码管位2 
#define BIT3   P2_3    //数码管位3 
#define BIT2   P2_2    //数码管位4 
#define BIT1   P2_1    //数码管位5 
#define BIT0   P2_0    //数码管位6 
#define uchar unsigned char 
#define uint  unsigned int 
code uchar szdm[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff}; //共阳数码管的显示字模数据 
data uchar displaybuff[6];   //定义显示缓冲区 
uchar CH0=0X10;              //通道0转换数据 
void display(); 
uchar adconvert(sign); 
 
 
void main()  { 
uchar temp; 
DelayMs(2000);                     //延时使芯片复位完成 
CS=1; 
DI=1; 
DO=1; 
CLK=0; 
while(1)  { 
   
temp=adconvert(CH0); 
displaybuff[2]=temp/100; 
displaybuff[1]=(temp-displaybuff[2]*100)/10; 
displaybuff[0]=temp-(displaybuff[2]*100+displaybuff[1]*10); 
display(); 
 
 
           } 
			   } 
 
 
 
void adstart(void) {    //开始条件 
CLK=0; 
CS=0; 
DI=1; 
CLK=1;  
CLK=0;             } 
 
 
 
void adsendsign(uchar signifi) {  //发送信号 
uchar temp; 
temp=signifi&0x03; 
DI=(signifi>>1)&0x01; 
CLK=1; 
CLK=0; 
DI=temp&0x01; 
CLK=1; 
CLK=0;  
                               } 
 
 
uchar adoutdata(void)        {    //数据输出 
uchar mfdata,i,j; 
bit D; 
while(DO); 
CLK=1; 
for(i=0;i<8;i++) 
                { CLK=0; 
				D=DO; 
				mfdata=mfdata|D; 
				CLK=1; 
				mfdata=mfdata<<1; 
				} 
for(j=0;j<7;j++) 
                { 
                CLK=0;CLK=1; 
				} 
CS=1; 
DO=1; 
return(mfdata); 
                            } 
 
 
 
uchar adconvert(sign)         {      //开始转换 
 uchar addata; 
               adstart(); 
			   adsendsign(sign); 
			   addata=adoutdata(); 
			   return(addata); 
			                        
			                   } 
 
                               
                       
void senddata(uchar dd) {          //74HC164移入显示数据 
uchar j; 
for (j=0;j<8;j++) { 
                   SDA=(bit)(dd&0x01); 
				   SCK=1;  SCK=0; 
				   dd=dd>>1; 
				   } 
				         } 
 
 
void display()           {           //在实验板的6位数码管上动态显示缓冲区中的数据 
     senddata(szdm[displaybuff[0]]); 
     BIT0=0; 
     Delay_ms(10); 
     BIT0=1; 
     senddata(szdm[displaybuff[1]]); 
	 BIT1=0; 
     Delay_ms(10); 
     BIT1=1; 
     senddata(szdm[displaybuff[2]]); 
	 BIT2=0; 
     Delay_ms(10); 
     BIT2=1; 
     senddata(szdm[displaybuff[3]]); 
	 BIT3=0; 
     Delay_ms(10); 
     BIT3=1; 
     senddata(szdm[displaybuff[4]]); 
	 BIT4=0; 
     Delay_ms(10); 
     BIT4=1; 
     senddata(szdm[displaybuff[5]]); 
	 BIT5=0; 
     Delay_ms(10); 
     BIT5=1; 
                          }