adc0832程序

//此函数只为大家学习交流之用,不得用于非法目的。
#include
#include

//////////IO引脚定义//////////////////////////////////////////////////////////
sbit SCL=P1^3; //SCL定义为P1口的第3位脚,连接ADC0832SCL脚
sbit SDA=P1^4; //SDA定义为P1口的第4位脚,连接ADC0832SDA脚
sbit CS=P1^6; //CS定义为P1口的第4位脚,连接ADC0832CS脚
sbit RST = P1^5; // DS1302片选,因这两芯片共用据脚和时钟脚(SDA,SCL),所以我们要定义它,将DS1302片选关掉,否则发生冲突

///////////数据定义////////////////////////////////////////////////////////
code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管段值表: 0-9
unsigned char l_tmpdate[]={0,0,0}; //存放显示内容

////////////////////函数声明/////////////////////////////////////
void ReadKey(void); //扫描键盘 获取键值,并将键值重新编码
void display(unsigned char *lp,unsigned char lc);//显示函数
void delay(unsigned int timer); //延时子函数
unsigned char ad0832read(bit SGL,bit ODD); //读模数转换ADC0832的数据,参数为通道选择


/////////////////////////////主函数开始//////////////////////////////////////
void main(void) //入口函数
{
unsigned char i=0,tmp;
RST=0; //ADC0832与DS1302供用数据线,因此要将DS1302关闭
while(1){
if(i==0){
tmp=ad0832read(1,0); //循环255个周期读取一次0832,因CPU运行比较快,没必要每次循环都去读取,选择通过CH0输入
l_tmpdate[0]=tmp/100; //得到百位
tmp=tmp%100;
l_tmpdate[1]=tmp/10; //十位
l_tmpdate[2]=tmp%10; //个位 ADC0832为8位ADC,数值为0~255,我们将其分开放入l_tmpdate数组中显示
}
i++;
display(l_tmpdate,3); //输出显示
}
}


///////////////////////读数模转换数据///////////////////////////////
//请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的
unsigned char ad0832read(bit SGL,bit ODD)
{
unsigned char i=0,tmp=0,tmp2=0;
SCL=0;_nop_();_nop_();
SDA=1;_nop_();_nop_();
CS=0;_nop_();_nop_(); //开始

SCL=1;_nop_();_nop_(); //第一个上升沿
SCL=0;_nop_();_nop_();

SDA=SGL;_nop_();_nop_();
SCL=1;_nop_();_nop_(); //第二个上升沿
SCL=0;_nop_();_nop_();

SDA=ODD;_nop_();_nop_();
SCL=1;_nop_();_nop_(); //第三个上升沿
SCL=0;_nop_();_nop_(); //第三个下降沿

SDA=1;_nop_();_nop_();
for(i=0;i<8;i++){
SCL=1;_nop_();_nop_();
SCL=0;_nop_();_nop_(); //开始从第四个下降沿接收数据
tmp<<=1;
if(SDA)
tmp++;
}
for(i=0;i<8;i++){ //接收校验数据
tmp2>>=1;
if(SDA)
tmp2+=0x80;
SCL=1;_nop_();_nop_();
SCL=0;_nop_();_nop_();
}
CS=1;_nop_();_nop_(

); //结束
SCL=1;
if(tmp==tmp2) //与校验数据比较,正确就返回数据,否则返回0
return tmp;
return 0;
}


///////////////////////显示函数///////////////////////////////////
void display(unsigned char *lp,unsigned char lc)
{
unsigned char i; //定义变量
P2=0; //端口2为输出
P1=P1&0xF8; //将P1口的前3位输出0,对应138译码器的输入脚,全0为第一位数码管
for(i=0;iP2=table[lp[i]]; //查表法得到要显示数字的数码段
delay(10); //短延时
P2=0; //清0端口,准备显示下位
if(i==7) //检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到P13数据
break;
P1++; //下一位数码管
}
}

////////////////延时子函数 /////////////////////////////////
void delay(unsigned int timer)
{
while(timer--);
}


相关文档
最新文档