历史上的今天
今天是:2025年02月06日(星期四)
2020年02月06日 | 单片机+ADC0832差分与单通道程序和注解
2020-02-06 来源:51hei
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 #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_(); }
史海拾趣
|
是BPB还是FAT或FDT的损坏? 除了硬件损坏,文件系统突然断电会有什么样的写入错误造成存贮设备不可用吗? 一般的文件系统如果是先写数据,再记录FAT和FDT会提高保护的可能性吗。… 查看全部问答> |
|
在这里向EEWORLD的论坛好友们推荐一款软件,我曾经学习过一段时间,个人感觉不错。只是我尚未学到家,所以没能很好的运用到我的学习中来。希望感兴趣的和有需要的论坛好友们可以学习学习。下面我粘贴一些Mathcad的大致介绍。 Mathcad是一种工程计 ...… 查看全部问答> |
|
本人想用quartusII9.0绘制原理图,可按步骤打开后就这样的老是提醒我要安装打印机。绘制不了原理图,求解决方法。我把它卸载了,在安装了,也破解了(用文本方式编辑就可以,不管是verilog还vhdl)。所以按道理是破解了的。可原理图绘制不了。。。 ...… 查看全部问答> |
|
若贝2.0 是世界上最小的国产EDA仿真工具 (只有不到5M),拥有非常现代化的界面,非常简洁的操作模式和可视化与代码设计的融合。简化硬件设计是若贝的宗旨,这款软件可以让用户在15分钟内上手,无需培训。虽然若贝2.0非常的小,但是却拥有了大部分E ...… 查看全部问答> |
|
最近在看一份富士通半导体的产品选型文件中出现的名词ECO不解,在百度上找到的结果是:Engineering Change Order。还有的说是在与环保相关的概念和资料中,ECO 是ECOLOGICAL的缩写,用来表示生态环保的意思。小弟就是想知道ECO到底是个什么技术?还 ...… 查看全部问答> |
|
AVR LED闪烁程序 为什么LED一直亮着 不会闪烁? 软件:ICCAVR Progisp #include #include void delay(void) { unsigned char a,b; for(a=0;a… 查看全部问答> |




