📄 ad0832.c
字号:
#include<reg52.h>
#include<intrins.h>
float dat1,result;
sbit ADDI=P3^5;
sbit ADCLK=P3^6;
sbit ADCS=P3^7;
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int ge,yi,er,san;
/*
unsigned char yi;
unsigned char er;
unsigned char san; */
unsigned long int temp;
unsigned char k;
unsigned char m;
unsigned char n;
unsigned char ndat;
unsigned char dat;
void delay()
{
unsigned char i;
unsigned char j;
for(i=0;i<=200;i++)
for(j=0;j<=20;j++);
}
void display()
{
temp=result*1000.0;
temp=temp*4.99;
temp=temp/255.0;
ge=temp/1000;
yi=temp/100%10;
er=temp%100/10;
san=temp%10;
P2=0x08;
P0=table[ge];
delay();
P2=0x04;
P0=table[yi];
delay();
P2=0x02;
P0=table[er];
delay();
P2=0x01;
P0=table[san];
delay();
}
ADC0832(unsigned char channel) //AD转换,返回结果
{
dat=ndat=0;
if(channel==0)channel=0;//通道号10,只对CH0进行单通道转换
if(channel==1)channel=1;//通道号11,只对CH2进行单通道转换
ADDI=1;//在第1 个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号
ADCLK=0;//拉低CLK端
_nop_();
_nop_();
ADCS=0;//拉低CS端,使能ADC0832,
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿1
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=channel&0x01;//在第2个脉冲下沉之前DI端应输入第1位通道选择数据
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿2
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=channel&0x02;//在第3个脉冲下沉之前DI端应输入第2位通道选择数据
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿3
_nop_();
_nop_();
ADDI=1;
for(m=0;m<8;m++)
{ dat<<=1;
ADCLK=1;//收数据
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
dat|=ADDI;
_nop_();
_nop_();
}
for(m=0;m<8;m++)
{
k=0;
k|=ADDI;//收数据
k<<=7;
ndat|=k;
if(m<7)
ndat>>=1;
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成第12-19次下降沿
_nop_();
_nop_();
}
ADCS=1;//拉低CS端
ADCLK=0;//拉低CLK端
ADDI=1;//拉高数据端,回到初始状态
result=(dat+ndat)/2.0;
// return(result); //return ad k
}
void main()
{
while(1)
{
ADC0832(0);
display();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -