ADC0832差分仿真原理图如下
单片机源程序如下(带详细的注释):
#include
#include
#include<1602.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uchar code num[]={"0123456789*#"};
sbit ADC_DI=P1^2; //通道端CH0,CH1
sbit ADC_DO=P1^2; //数据端
sbit ADC_CLK=P1^1; //时钟端
sbit ADC_CS=P1^0; //片选端
sbit DS=P3^5;
sbit SH_CP=P3^6;
sbit ST_CP=P3^7;
void ADC_init() //ADC0832初始化
{
ADC_CS=1; //片选端关闭,低电平有效
ADC_CLK=1; //时钟端
ADC_DI=1; //数据端
_nop_();_nop_();
}
void ADC_start() //ADC0832启动
{
ADC_CS=0; //打开片选
_nop_();_nop_();
ADC_CLK=0; //第一个时钟脉冲低电平
_nop_();_nop_();
ADC_DI=1; //打开通道设置
_nop_();_nop_();
ADC_CLK=1; //第一个时钟脉冲高电平完成第一个时钟脉冲
_nop_();_nop_();
}
void ADC_select_channel() //ADC0832通道选择:单通道使用CH0
{
ADC_CLK=0; //第二个时钟脉冲低电平
_nop_();_nop_();
ADC_DI=0; //DI为1是选用单端输入(单通道),DI为0是选用单道差分输入(双通道)
_nop_();_nop_();
ADC_CLK=1; //第二个时钟脉冲高电平完成第二个时钟脉冲
_nop_();_nop_();
ADC_CLK=0; //第三个时钟脉冲低电平
_nop_();_nop_();
ADC_DI=0; //第三个脉冲时DI为0选用CH0输入,DI为1是选用CH1输入
_nop_();_nop_();
ADC_CLK=1; //第三个时钟脉冲高电平完成第三个时钟脉冲
_nop_();_nop_();
}
uchar ADC0832()
{
uchar dat1,dat2,i; //定义二个变量dat1存入前8位dat2存入后8位
ADC_CLK=0; //增加一个时钟脉冲低电平
_nop_();_nop_();
ADC_DI=0; //通道端关闭
_nop_();_nop_();
ADC_DO=1; //数据端打开
_nop_();_nop_();
ADC_CLK=1; //增加一个时钟脉冲高电平(完成一个时钟脉冲)
_nop_();_nop_();
for(i=0;i<8;i++) //循环8次时钟脉冲第四次到第十一次
{
ADC_CLK=0; //第四个时钟脉冲低电平
_nop_();_nop_();
dat1=dat1<<1; //变量dat1每次循环左移一位,dat1从高位移到低位7位—0位
if(ADC_DO==1) //判断数据端是否高电平
{
dat1=dat1|0x01; //如果数据端为高电平,变量dat1最低位变成1
}
ADC_CLK=1; //第四个时钟脉冲高电平完成第四个时钟脉冲
_nop_();_nop_();
}
for(i=0;i<8;i++) //循环8次时钟脉冲第十一次到第十九次
{
dat2=dat2>>1; //变量dat2每次循环右移一位,因为dat2从低位到高位0位——7位,
if(ADC_DO==1) //判断数据端是否高电平
{
dat2=dat2|0x80; //如果数据端为高电平,变量dat2最高位置1
}
ADC_CLK=0; //第十一个时钟脉冲低电平
_nop_();_nop_();
ADC_CLK=1; //第十一个时钟脉冲高电平完成第十一个时钟脉冲
_nop_();_nop_();
}
ADC_CS=1; //片选端关闭
_nop_();_nop_();
if(dat1==dat2) //判断二个数是否一样
{
return dat1; //如果一样就返回uchar ADC0832()=dat1
}
else
{
return 0; //如果不是那就返回0
}
}
void main()
{
uint tmp;
ADC_init();
lcd_init();
while(1)
{
ADC_start();
ADC_select_channel();
tmp=ADC0832();
wirte_lcd_cmd(0x80);
wirte_lcd_date(num[tmp/1000]);
wirte_lcd_date(num[tmp%1000/100]);
wirte_lcd_date(num[tmp%1000%100/10]);
wirte_lcd_date(num[tmp%10]);
}
}
ADC0832单通道
#include
#include
#include<1602.h>
#define uchar unsigned char
#def
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』