新手求教:关于单片机读取ADC0832数值的问题

新手求教:关于单片机读取ADC0832数值的问题,第1张

你尺配用这个调一下看看

unsigned char A_D()

{

uchar i

CS=1 //一个转换周期开始

CLK=0 //为第一个脉冲作准备

CS=0 //CS置0,片选有效

DIO=1 //斗乱DIO置1,规定的起始信号

CLK=1 //第一个脉冲

CLK=0 //第一个脉冲的下降沿,此前DIO必须是高电平

DIO=1 //DIO置1, 通道选择信号

CLK=1 //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输空困档入两位数据用于选择通道,这里选通道CH0

CLK=0 //第二个脉冲下降沿

DIO=0 //DI置0,选择通道0

CLK=1 //第三个脉冲

CLK=0 //第三个脉冲下降沿

DIO=1 //第三个脉冲下沉之后,输入端DIO失去作用,应置1

CLK=1 //第四个脉冲

for(i=0i<8i++) //高位在前

{

CLK=1//第四个脉冲

CLK=0

dat<<=1 //将下面储存的低位数据向右移

dat|=(uchar)DIO //将输出数据DIO通过或运算储存在dat最低位

}

CS=1 //片选无效

return dat //将读出的数据返回

}

AD0832是8位逐次逼近模数转换器,可支持两个单端输入通道和一个差分输入通道。是8位逐次逼近模数转换器,可支持两个单端输入通道和一个差分输入通道。

当ADC0832未工作时其CS输入端应为高电平,此时芯判闷片禁用,当要进行A/D转换时,

须先将CS使能端置于低电平并且保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。在第1个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号。在第2、3个脉冲下沉之前DI端应输入2位数据用于选择通道功能,

当此2位数据为“1”、“0”时,只对CH0进行单通道转换。

当2位数据为“1”、“1”时,只对CH1进行单通道转换。

当2位数据为“0”、“0”时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。

当2位数据为“0”、“1”时,将CH0作为负输入端IN-,CH1作为正输入端IN+进行输入。

在完成输入启动位、通道选择之后,就可以开始读出数据,转换得到的数据会被送出二次,一次高位在前传送,一次低位在前传送,连续送出。在程序读取二个数据后,我们可以加上检验来看看数据是否被正确读取。

由于ADC0832是8位分辨率,返回的数值在0~255之间,对应模拟数值为0~5V,因此每一档对应的电压值约为0.0196V。大家可以在通道输入端引入模拟信号(0~5V)进行测试,比如可以在通道脚和地之间接入电池来测试电池电压值。为使两位数码管显示电压值大小,在写余销程序是可将对应比值改位0.196,同理,如果想要显示精度更竖冲游高,可用三位或四位显示,那么响应的改一下比值为1.96或19.6,当然,需要注意你所得数据的大小是否超出数据类型的大小。

时序图

兄弟:不知道你玩不玩32 ,有个32 的在工程上用过,直接刷程序,串口连接电脑就可以输出AD 转换的结果。如果不玩32 的话。

首先第一步排查: 排查单片机能不能正确显示 你测试正贺氏到的 AD 信号,显示正确不?

比如给他 3V 电压 ,用数码管显示出来。

第二: 串口发送,找个能正确发送数据的代码 ,直接把 ,你举散检查的数值给这个变量,让串口发送,

一步一步找问题,你绝对能解决的。我把AD0809 的代码给你拍卖用数码管测试

#include <reg52.h>

#define uint unsigned int

#define uchar unsigned char

uchar code LEDData[]=

{

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f

}

sbit OE = P1^0

sbit EOC = P1^1

sbit ST = P1^2

sbit CLK = P1^3

void DelayMS(uint ms)

{

uchar i

while(ms--)

{

for(i=0i<120i++)

}

}

void Display_Result(uchar d)

{

P2 = 0xf7

P0 = LEDData[d%10]

DelayMS(5)

P2 = 0xfb

P0 = LEDData[d%100/10]

DelayMS(5)

P2 = 0xfd

P0 = LEDData[d/100]

DelayMS(5)

}

void main()

{

TMOD = 0x02

TH0 = 0x14

TL0 = 0x00

IE = 0x82

TR0 = 1

P1 = 0x3f

while(1)

{

ST = 0

ST = 1

ST = 0

while(EOC == 0)

OE = 1

Display_Result(P3)

OE = 0

}

}

void Timer0_INT() interrupt 1

{

CLK = !CLK

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12450974.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存