/*ADC0832模数转换子程序已通过实验*/
/*author 李猛*/
/*单片机at89s52 晶振1100592M*/
/*单位 辽宁工程技术大学研究生学院 QQ:744180121*/
#include<at89x52.h>
#include<intrins.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
//位定义
sbit CS_=P2^0;
sbit CLK=P2^1;
sbit DO =P2^2;
sbit DI =P2^3;
uint8 ad0832_converter(bit channel);
void main(void)
{
while(1)
{
P0=ad0832_converter(0);
}
}
/*adc0832模数转换函数,返回值为转换的数字量,形参为输入通道的选择,0为CH0通道,1为CH1通道。*/
uint8 ad0832_converter(bit channel)
{
uint8 dat0=0,dat1=0,i;
//启动转换
CS_=0;
_nop_();
CLK=0;
DI =1;
CLK=1; //时钟信号来一个上升沿
//通道选择
if(0==channel) //选择通道0
{
CLK=0; //选择单端模式
DI =1;
CLK=1;
_nop_();
CLK=0; //选择通道CH0
DI =0;
CLK=1;
}
else
{
CLK=0; //选择单端模式
DI =1;
CLK=1;
_nop_();
CLK=0; //选择通道CH1
DI =1;
CLK=1;
}
CLK=0;
//读取数据
for(i=0;i<8;i++)
{
dat0<<=1; //数据右移一位
CLK=1;
_nop_();
CLK=0; //时钟信号一个下降沿
if(DO==1)
{
dat0|=0x01;
}
}
for(i=0;i<8;i++)
{
dat1>>=1;
if(DO==1)
{
dat1|=0x80;
}
CLK=1;
_nop_();
CLK=0; //时钟信号一个下降沿
}
CS_=1;
return (dat0==dat1)?dat0:0x01;
} |