标题:
单片机+ADC0832差分与单通道程序和注解+仿真电路图
[打印本页]
作者:
kc乐乐
时间:
2019-9-26 14:46
标题:
单片机+ADC0832差分与单通道程序和注解+仿真电路图
新手资料如果错误希望谅解。
ADC0832差分仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(14.13 KB, 下载次数: 49)
下载附件
2019-9-27 03:39 上传
单片机源程序如下(带详细的注释):
#include<reg52.h>
#include<intrins.h>
#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<reg52.h>
#include<intrins.h>
#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=1; //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
}
}
/*float get_distance()
{
uchar i;float sum=0.0;
for(i=0;i<10;i++)
{
sum=sum+ADC0832();
}
return ((1388/(sum/10.0-5))-2);
}*/
void main()
{
uint tmp;
// float temp;
ADC_init();
lcd_init();
while(1)
{
ADC_start();
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png
(12.11 KB, 下载次数: 46)
下载附件
2019-9-27 03:40 上传
所有资料51hei提供下载:
ADC0832程序和注解电路图.rar
(194.2 KB, 下载次数: 91)
2019-9-26 14:45 上传
点击文件名下载附件
网上资料
下载积分: 黑币 -5
ADC0832资料.docx
(66.73 KB, 下载次数: 28)
2019-9-26 14:44 上传
点击文件名下载附件
网上资料
下载积分: 黑币 -5
作者:
tieq1952
时间:
2019-9-27 08:37
谢谢分享!!!
作者:
2790759984
时间:
2020-2-5 16:38
正需要!谢谢分享!
作者:
jjwangxu2008
时间:
2020-3-14 12:46
谢谢分享!!!
作者:
longzhihao
时间:
2021-4-20 14:52
你好,请问双通道差分的意思是我可以直接转换2个模拟量吗?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1