#include "adc0832.h" sbit CS=P1^1; //ADC0832 控制IO口 使能口 sbit Clk=P1^2; //时钟IO口 sbit DATI=P1^3; //数据输入输出IO口 sbit DATO = P1^3; unsigned int dat = 0x00; //AD值 /**************************************************************************** 函数功能:AD转换子程序 入口参数:CH 0 or 1 出口参数:dat ****************************************************************************/ unsigned char adc0832(unsigned char CH) { unsigned char i,test,adval; adval = 0x00; test = 0x00; Clk = 0; //初始化 DATI = 1; _nop_(); CS = 0; _nop_(); Clk = 1; _nop_(); if ( CH == 0x00 ) //通道选择 { Clk = 0; DATI = 1; //通道0的第一位 _nop_(); Clk = 1; _nop_(); Clk = 0; DATI = 0; //通道0的第二位 _nop_(); Clk = 1; _nop_(); } else { Clk = 0; DATI = 1; //通道1的第一位 _nop_(); Clk = 1; _nop_(); Clk = 0; DATI = 1; //通道1的第二位 _nop_(); Clk = 1; _nop_(); } Clk = 0; DATI = 1; for( i = 0;i < 8;i++ ) //读取前8位的值 { _nop_(); adval <<= 1; Clk = 1; _nop_(); Clk = 0; if (DATO) adval |= 0x01; else adval |= 0x00; } for (i = 0; i < 8; i++) //读取后8位的值 { test >>= 1; if (DATO) test |= 0x80; else test |= 0x00; _nop_(); Clk = 1; _nop_(); Clk = 0; } if(adval == test) //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉 dat = test; nop_(); CS = 1; //释放ADC0832 DATO = 1; Clk = 1; return dat; } 对该程序进行逐句注释
时间: 2023-08-22 09:08:12 浏览: 116
//引入ADC0832头文件
#include "adc0832.h"
//定义控制IO口和时钟IO口以及数据输入输出IO口
sbit CS=P1^1;
sbit Clk=P1^2;
sbit DATI=P1^3;
sbit DATO = P1^3;
//定义一个unsigned int类型的变量dat,用于存储AD值
unsigned int dat = 0x00;
/****************************************************************************
函数功能:AD转换子程序
入口参数:CH 0 or 1
出口参数:dat
****************************************************************************/
unsigned char adc0832(unsigned char CH) {
//定义局部变量i、test和adval
unsigned char i,test,adval;
//初始化变量
adval = 0x00;
test = 0x00;
//将时钟IO口置为0
Clk = 0;
//将数据输入输出IO口置为1
DATI = 1;
//将使能口置为0
CS = 0;
//将时钟IO口置为1
Clk = 1;
//如果通道为0
if ( CH == 0x00 )
{
//将时钟IO口置为0
Clk = 0;
//将数据输入输出IO口置为1,通道0的第一位
DATI = 1;
//延时
_nop_();
//将时钟IO口置为1
Clk = 1;
//延时
_nop_();
//将时钟IO口置为0
Clk = 0;
//将数据输入输出IO口置为0,通道0的第二位
DATI = 0;
//延时
_nop_();
//将时钟IO口置为1
Clk = 1;
//延时
_nop_();
}
//如果通道为1
else
{
//将时钟IO口置为0
Clk = 0;
//将数据输入输出IO口置为1,通道1的第一位
DATI = 1;
//延时
_nop_();
//将时钟IO口置为1
Clk = 1;
//延时
_nop_();
//将时钟IO口置为0
Clk = 0;
//将数据输入输出IO口置为1,通道1的第二位
DATI = 1;
//延时
_nop_();
//将时钟IO口置为1
Clk = 1;
//延时
_nop_();
}
//将时钟IO口置为0
Clk = 0;
//将数据输入输出IO口置为1
DATI = 1;
//循环8次,读取前8位的值
for( i = 0;i < 8;i++ )
{
//延时
_nop_();
//将adval左移1位
adval <<= 1;
//将时钟IO口置为1
Clk = 1;
//延时
_nop_();
//将时钟IO口置为0
Clk = 0;
//如果数据输入输出IO口为1
if (DATO)
adval |= 0x01;
else
adval |= 0x00;
}
//循环8次,读取后8位的值
for (i = 0; i < 8; i++)
{
//将test右移1位
test >>= 1;
//如果数据输入输出IO口为1
if (DATO)
test |= 0x80;
else
test |= 0x00;
//延时
_nop_();
//将时钟IO口置为1
Clk = 1;
//延时
_nop_();
//将时钟IO口置为0
Clk = 0;
}
//如果前8位和后8位相等
if(adval == test)
//将dat的值设为后8位的值
dat = test;
//延时
nop_();
//将使能口置为1,释放ADC0832
CS = 1;
//将数据输入输出IO口置为1
DATO = 1;
//将时钟IO口置为1
Clk = 1;
//返回AD值
return dat;
}
阅读全文