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
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)