当前位置:首页 > 模拟 > 模拟
[导读]前段时间一直在为ADC0832的程序感到疑惑,从网上找了很多的代码,用Proteus仿真,最后都出现了一些奇怪的问题,有的根本没法读取数据,有的数据有错误。当参考电压为5V时,如果把输入电压从0一直调到5V,读取的数据应

前段时间一直在为ADC0832的程序感到疑惑,从网上找了很多的代码,用Proteus仿真,最后都出现了一些奇怪的问题,有的根本没法读取数据,有的数据有错误。

当参考电压为5V时,如果把输入电压从0一直调到5V,读取的数据应该是从0到255,2.5V时应该是128。但是我发现一些源码在输入0~2.5V时读取出来的是0~255,到2.5V时读取的数据为0,从2.5到5V,读出的值又从0增加到255,始终不正确。今天下午特地查阅的ADC0832英文原版的DataSheet,又参考了一篇中文文档,终于写出了其完整的程序,并且先后读取了MSB FIRST DATA和LSB FIRST DATA,进行比较,如果两个数据相等,返回读取的数据,否则返回0,这样可以避免读取发生错误,更稳定可靠。并通过了Proteus仿真。

下图是ADC0832的时序图:

其中T-SetUp为250ns,由于使用的是51单片机,晶振11.0592MHz,机器周期比这个值大,可以不考虑,但为了防止出现异常,还是延时了两个机器周期。注意在第11个时钟下降沿之后,DO上的电平既是MSB FIRST输出的最后一位,又是LSB FIRST输出的第一位。以下是读取ADC0832的代码。

[cpp] view plain copysbit CS_0832 = P1^0;

sbit CLK_0832 = P1^1;

sbit DO_0832 = P1^2; // DI、DO不同时有效,可共用一个接口

sbit DI_0832 = P1^2;

extern void _nop_ ( void );

#define pulse0832() _nop_();_nop_();CLK_0832=1;_nop_();_nop_();CLK_0832=0

//把模拟电压值转换成8位二进制数并返回

unsigned char read0832()

{

unsigned char i, ch = 0, ch1 = 0;

CS_0832=0; // 片选,DO为高阻态

DI_0832=1;

// 此处暂停T-SetUp: 250ns (由pulse0832完成)

pulse0832(); // 第一个脉冲,起始位,DI置高

DI_0832=1;

pulse0832(); // 第二个脉冲,DI=1表示双通道单极性输入

DI_0832=1;

pulse0832(); // 第三个脉冲,DI=1表示选择通道1(CH2)

// 51单片机为准双向IO口:应先写入1再读取

DI_0832=1;

// MSB FIRST DATA

for(i = 0; i < 8; ++i) {

pulse0832();

ch <<= 1;

if(DO_0832==1)

ch |= 0x01;

}

// MSB FIRST输出的最后一位与LSB FIRST输出的第一位是在

// 同一个时钟下降沿之后,故此处先执行读取,后执行pulse

// LSB FIRST DATA

for(i = 0; i < 8; ++i) {

ch1 >>= 1;

if(DO_0832==1)

ch1 |= 0x80;

pulse0832();

}

CS_0832=1; // 取消片选,一个转换周期结束

return (ch==ch1) ? ch : 0; // 返回转换结果

}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

以下四幅图都是关于串口中断的问题,串口中断需要一个接收或者发送数据的触发。

关键字: proteus仿真 串口问题

弄了几天的Proteus仿真,终于觉得自己想做的东西,已经全部用Proteus仿真过了,应该可以动手做了。于是先用Proteus画好原理图,再用ARES画好PCB板图——虽然我只是用洞洞板焊接,但是有个PCB板图做参照,...

关键字: proteus仿真

弄了几天的Proteus仿真,终于觉得自己想做的东西,已经全部用Proteus仿真过了,应该可以动手做了。于是先用Proteus画好原理图,再用ARES画好PCB板图——虽然我只是用洞洞板焊接,但是有个PCB板图做参照,...

关键字: proteus仿真 实际

proteus仿真之DS1302+8位数码管显示试验。仿真效果如下图:源程序如下:/*51单片机:DS1302+数码管 Proteus 仿真程序。功能:数码管时钟显示。仿真结果:(1)8位数码管显示设定的时间与日期。(2...

关键字: ds1302 proteus仿真 数码管显示

继电器(Relay),作用是用弱电控制强电。比如,我们用avr单片控制一个220V电压的灯泡,这就必须用到继电器。本课用avr单片机来控制继电器的吸合与断开。Proteus仿真实验器件:1 atmega128一块2 bu...

关键字: avr单片机 proteus仿真 控制继电器

最近温习一下单片机,通过proteus 7.8仿真了一下,感觉效果不错。单片机程序如下:/*51单片机 按键与数码管实验,用proteus 7.8仿真通过。通过点按键,K1:数码管数字加一,0~F,加上F后再从0开始。K...

关键字: proteus仿真 单片机 按键 数码管

数码管选7SEG-MPX1-CC,共阴极数码管。也就是低电平选通(最右脚),数码管左边8只管脚,从左到右,由低到高,分别接PC0---PC7。c程序如下:#include#include#define int8u uns...

关键字: avr单片机 proteus仿真 数码管

以下四幅图都是关于串口中断的问题,串口中断需要一个接收或者发送数据的触发。图一:因为由串口小助手发送的数据达到了单片机串口,所以引起了串口的中断。图二:图一的大图。图三:因为由串口小助手发送的数据达到

关键字: proteus仿真 串口问题

在用proteus仿真做一个程序,但是51的内存资源太过稀有,使用到较大的数组的时候资源很快就耗尽了,这时需要用到xdata大模式下编译。然而在proteus下默认xdata是必须加上外扩ram才可运行的,需要对prot...

关键字: proteus仿真 xdata c51时

仿真电路图和生成锯齿波的电路图一样。程序用中断来定时。C程序如下:#include sbit CS0=P3^0;sbit WR0=P3^1;bit flag=0;unsigned char i=0;unsigned ch...

关键字: 51 proteus仿真 正弦波
关闭
关闭