这是我写的ADC0832的采样和数码管显示程序 24M晶振 通过按键切换采样通道,调了很久都不行 真心求助高手
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit CS = P1^3;
sbit Clk = P1^0;
sbit DATI = P1^1;
sbit DATO = P1^2;
sbit xsd=P0^7;
sbit s1=P2^2;
sbit we1=P2^7;
sbit we2=P2^6;
sbit we3=P2^5;
sbit we4=P2^4;
uchar tab[]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90};//显示0-9段码
uint i,ge,shi,bai,qian,getdata,number;
unsigned char dat;
void delayms(uint x); //可控延时函数
void display0();
void AD();
void key();
void key()
{
P2=0xff;
if(s1==0)
{
delayms(5);//延时判断5ms
if(s1==0)
{
number++;
if(number==3)
number=0;
while(!s1);// 松手检测
}
}
}
main()
{
number=0;
while(1)
{
AD();
display0();
key();
}
}
void delayms(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=240;j>0;j--);
}
void AD()
{
unsigned char i,test,adval;
adval=0x00;
test=0x00;
Clk=0; //初始化
DATI=1;
_nop_();
_nop_();
CS=0;
_nop_();
_nop_();
Clk=1;
_nop_();
_nop_();
if(number==1)//通道选择
{
Clk=0;
DATI=1;//通道0的第一位
_nop_();
_nop_();
Clk=1;
_nop_();
_nop_();
Clk = 0;
DATI = 0; //通道0的第二位
_nop_();
_nop_();
Clk = 1;
_nop_();
}
else
{
Clk=0;
DATI=1; //通道1的第一位
_nop_();
_nop_();
Clk=1;
_nop_();
_nop_();
Clk=0;
DATI=1; //通道1的第二位
_nop_();
_nop_();
Clk=1;
_nop_();
}
Clk=0;
DATI=1;
for(i=0;i<8;i++ ) //从高位向低位读取8位AD值
{
_nop_();
adval<<=1;
Clk=1;
_nop_();
_nop_();
Clk=0;
if(DATO)
adval|=0x01;
else
adval|=0x00;
}
for(i=0;i<8;i++) //从低位向高位读取8位AD值
{
test>>=1;
if(DATO)
test|=0x80;
else
test|=0x00;
_nop_();
_nop_();
Clk=1;
_nop_();
_nop_();
Clk=0;
}
dat=test;
_nop_();
_nop_();
CS = 1; //释放ADC0832
DATO = 1;
Clk = 1;
getdata=dat;
}
void display0()
{
qian=(getdata*49*5/25)/1000;//读得的数据乘以2再乘以98%,再乘以5倍的分压除以1000得千位
bai=((getdata*49*5/25)%1000)/100;//数值对1000求余后的得剩下几位,对100整除后得百位
shi=(((getdata*49*5/25)%1000)%100)/10;//分出十位
ge=(((getdata*49*5/25)%1000)%100)%10;//分出个位
P0=tab[qian];//送千位显示
we1=0;//选择第一个数码管
delayms(1);
P0=tab[bai];//送百位显示
xsd=0;
we2=0;//选择第二个数码管
delayms(1);
P0=tab[shi];//送十位显示
we3=0;//选择第三个数码管
delayms(1);
P0=tab[ge];//送各位显示
we4=0;//选择第四个数码管
delayms(1);
} |