ADC0832+8951做电压表.显示为0000
用ADC0832和8951做了一个电压表.但数码管只是显示0000,不能显示当前电压值.请高人指点.
#include"reg52.h"
sbit DO =P1^2;
sbit CS =P1^0;
sbit CLK =P1^1;
unsigned char adval; //AD值
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阴
unsigned char code tab1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阳
unsigned char A_D(bit CH)
{
unsigned char i;
CS=0; //片选
CLK=0; //时钟拉低
CLK=1; //时钟拉高
DO=1; //启动信号
if(CH==0)
{
CLK=0;
CLK=1;
DO=1; //通道0的第1位
CLK=0;
CLK=1;
DO=0; //通道0的第2位
}
else
{
CLK=0;
CLK=1;
DO=1; //通道1的第1位
CLK=0;
CLK=1;
DO=1; //通道1的第2位
}
CLK=1;
CLK=0;
for(i=0;i<8;i++)
{
CLK=1;
CLK=0;
if(DO)
adval=(adval>>1)|0x80;
else
adval=(adval>>1)|0x00;
}
CS=1;
return(adval);
}
void delay(void)
{
int k;
for(k=0;k<600;k++);
}
void display(int k)
{
P2=0xfe; //1111 0111
P0=tab1;
delay();
P2=0xfd;
P0=tab1;
delay();
P2=0xfb;
P0=tab1;
delay();
P2=0xf7;
P0=tab1;
delay();
P2=0xff;
}
void main(void)
{
P2=0xff;
P0=0xff;
while(1)
{
A_D(0x00);
display(adval);
}
} proteus? 网上有许多实例,下载看看。 楼主的图不怎么清晰啊,能不能放大一点 楼主弄出来了吗 还不行..折腾了好久了..ADC0832的CLK也对的..通道也是对的..就是出不来电压显示.总感觉程序不对.
这个程序是在书上照着用的.. 中国的教科书上程序你也敢相信啊!
看看.ADC0832的PDF文档 6# lhkjg
不信与否..但是我在网上找了N多.也还是不行...CS.CLK.DIO定义都接对了.
看了PDF...工作时钟都对的.就是好像少了点什么..数据处理? DI呢,好像没有定义吧 首先,你的图不正确,即ADC0832的DI和DO,最好不要连在一起,而是单独控制。其次,就是操作ADC0832的时序不正确,具体请看ADC0832的datasheet。再次就是,ADC0832的DO是先输出高位,所以你位操作时可以直接左移就行,而不用右移。最后,你那个读AD位的程序不正确。 9# anycrying
DI与DO是可以连在一起的..DI只是在AD启动时.未开始数据转换时.在他们之间存在有意义...也就是在前三个周期下降沿时.才有效..这时可以选择AD的通道.或者AD的输入CH0 CH1的功能.
所以接在一起是OK的..
是因为少了数据处理..虽然转换完成了.但是如果没有处理转换后的数据.MCU不知道拿什么显示出来.
页:
[1]