#include <reg51.H>
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char
//ADC0832的引脚
sbit ADCS =P1^0; //ADC0832 chip seclect
sbit ADDI =P1^2; //ADC0832 k in
sbit ADDO =P1^2; //ADC0832 k out
sbit ADCLK =P1^1; //ADC0832 clock signal
unsigned char dispbitcode[8]={0xf7,0xfb,0xfd,/*0xfe,0xef,0xdf,0xbf,0x7f*/}; //位扫描
unsigned char dispcode[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff}; //共阳数码管字段码
unsigned char dispbuf[3];
uint temp;
uchar getdata; //获取ADC转换回来的值
void delayms(void) //12mhz delay 1.01ms
{
unsigned char x,y;
x="10";
while(x--)
{
y="4";
while(y--);
}
}
void display(void) //数码管显示函数
{
char k;
for(k=0;k<3;k++)
{
P0 = dispbitcode[k];
P2 = dispcode[dispbuf[k]];
delayms();
if(k==2) //加上数码管的dp小数点
P2&=0x7f;
delayms();
P0=0xff;
}
}
/************
读ADC0832函数
************/
//采集并返回
unsigned int Adc0832(unsigned char channel) //AD转换,返回结果
{
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="channel"&0x1;
_nop_();
_nop_();
ADCLK="0";//拉低CLK端,形成下降沿2
_nop_();
_nop_();
ADCLK="1";//拉高CLK端
ADDI=(channel>>1)&0x1;
_nop_();
_nop_();
ADCLK="0";//拉低CLK端,形成下降沿3
ADDI="1";//控制命令结束
_nop_();
_nop_();
dat="0";
for(i=0;i<8;i++)
{
dat|=ADDO;//收数据
ADCLK="1";
_nop_();
_nop_();
ADCLK="0";//形成一次时钟脉冲
_nop_();
_nop_();
dat<<=1;
if(i==7)dat|=ADDO;
}
for(i=0;i<8;i++)
{
j="0";
j="j|ADDO";//收数据
ADCLK="1";
_nop_();
_nop_();
ADCLK="0";//形成一次时钟脉冲
_nop_();
_nop_();
j="j"<<7;
ndat="ndat|j";
if(i<7)ndat>>=1;
}
ADCS="1";//拉低CS端
ADCLK="0";//拉低CLK端
ADDO="1";//拉高数据端,回到初始状态
dat<<=8;
dat|=ndat;
return(dat); //return ad k
}
void main(void)
{
while(1)
{
getdata="Adc0832"(0);
temp="getdata"*1.0/255*500; //电压值转换,5V做为参考电压,分成256份。
dispbuf[0]=temp%10; //个位
dispbuf[2]=temp/10%10; //十位
dispbuf[1]=temp/100; //百位
display();
}
}
文章评论(0条评论)
登录后参与讨论