基于proteus的c51单片机的DA数模转换双通道例程.doc
文本预览下载声明
基于proteus的c51单片机adc0832D/A数模转换双通道例程
#include reg51.h
#include intrins.h
#define uint unsigned int
#define uchar unsigned char
#define delay4us(){_nop_();_nop_();_nop_();_nop_();}
sbit ADCS =P3^0; //ADC0832 chip seclect
sbit ADDI =P3^2; //ADC0832 data in
sbit ADDO =P3^2; //ADC0832 data out
sbit ADCLK =P3^1; //ADC0832 clock signal
void delay(); //延时函数
sbit RS=P1^0;
sbit RW=P1^1;
sbit E=P1^2;
//一位整数,两位小数的数字电压显示缓冲
void DelayMS(uint ms)
{
uchar t;
while(ms--)
for(t=0;t120;t++);
}
//--------------------------------------------------
//定义四线制接口
//-------------------------------------------------
sbit clk=P1^3;
sbit cs=P1^4; //片选
sbit din=P1^5; //数据入口
sbit k1=P2^0;
sbit k2=P2^1;
//sbit dout = P3^5; //数据出口
//---------------------------------------------------
//主函数
uchar readad[2];
void DA_Conver(uint DA_Value);
void DAC(); //AD转换
void Adc0832( uchar channel);
//****************************//
/************
读ADC0832函数
************/
//采集并返回
void Adc0832( uchar channel)
{
uchar i=0;
uchar j;
uint dat=0;
uchar ndat=0;
if(channel==0)channel=2;
if(channel==1)channel=3;
ADDI=1;
_nop_();
_nop_();
ADCS=0;//拉低CS端
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿1
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=channel0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿2
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=(channel1)0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿3
ADDI=1;//控制命令结束
_nop_();
_nop_();
dat=0;
for(i=0;i8;i++)
{
dat|=ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
dat=1;
if(i==7)dat|=ADDO;
}
for(i=0;i8;i++)
{
j=0;
j=j|ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
j=j7;
ndat=ndat|j;
if(i7)ndat=1;
}
ADCS=1;//拉高CS端
ADCLK=0;//拉低CLK端
显示全部