打印

求助高手:关于AD转换

[复制链接]
1226|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xf19890224|  楼主 | 2010-5-26 12:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
为什么我的数据经过AD转换再送到液晶显示上,我调节可调电阻,值的实际变化应当是从0——5,而显示值的变化规律是0——0.5,接着直接跳到1,从1——1.5,再接着就跳到2,如此继续下去。
为什么呢??

#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char

sbit SCL=P1^1;//时钟脉冲
sbit SDA=P1^2;//双向输入输出数据端
#define SCL_SET SCL=1
#define SCL_CLR SCL=0
#define SDA_SET SDA=1
#define SDA_CLR SDA=0
#define AddWr 0x90   //写数据地址
#define AddRd 0x91   //读数据地址
#define adCon 0x40   //AD控制字节


sbit RS=P2^4;
sbit RW=P2^5;
sbit E=P2^6;
#define setRS RS=1
#define clrRS RS=0
#define setRW RW=1
#define clrRW RW=0
#define setE E=1
#define clrE E=0


uint time=0;
uchar ADFlag=0;
uchar str[8]="Ci n.mv ";

//延时1US
void delay(uint cnt)
{
while(--cnt);
}
//延时1MS
void delayms(uint time)
{
uint i;
for(i=0; i<time; i++)
  delay(120);
}
//写数据,P0
void writeData(uchar Data)
{
  setRS;
  clrRW;
  delay(1);
  setE;
  delay(1);
  P0=Data;
  delay(5);
  clrE;
}
//写命令,P0
void writeCom(uchar Com)
{
  clrRS;
  clrRW;
  delay(1);
  setE;
  delay(1);
  P0=Com;
  delay(5);
  clrE;
}
//清屏函数
void clear_scr(void)
{
   writeCom(0x01);
   delayms(5);
  }

//写一个字符串在(X,Y )位置
void disStr(uchar x, uchar y, uchar *str)
{
if(y==0) writeCom(0x80+x);//第一行
else writeCom(0xc0+x);//第二行
while(*str)
{
  writeData(*str);
  str++;
}
}
//LCD1602初始化
void lcdInitial()
{
   writeCom(0x38);//显示模式设置
   delayms(5);
   writeCom(0x08);//显示关闭
   clear_scr();//清屏
   writeCom(0x06); //显示光标移动设置
   delayms(5);
   writeCom(0x0C); //显示开及光标设置
}


void start()
{
SDA_SET;
delay(1);
SCL_SET;
delay(5);
SDA_CLR;
}


void stop()
{
SDA_CLR;
delay(1);
SCL_SET;
delay(5);
SDA_SET;  
}


void ack()
{
SDA_CLR;
SCL_SET;
delay(1);
SCL_CLR;
}


void noAck()
{
    SDA_SET;
SCL_SET;
delay(1);
SCL_CLR;
}


void send(uchar Data)
{
uchar i=0;
uchar temp=0;

temp=Data;
for(i=0; i<8; i++)
{
  SCL_CLR;
  delay(1);
  if(temp&0x80) SDA_SET;
  else SDA_CLR;
  delay(1);
  SCL_SET;
  delay(1);
  temp<<=1;
}
   SCL_CLR;
}


uchar recive()
{
  unsigned char temp=0;
           unsigned char temp1=0;
           unsigned char BitCounter=8;

            SDA_SET;
           do
             {
                  SCL_CLR;
          _nop_();
                  SCL_SET;
                  _nop_();
                  if(SDA)
                     temp=temp|0x01;
                  else
                     temp=temp&0xfe;

                  if(BitCounter-1)
                     {
                          temp1=temp<<1;
                          temp=temp1;
                          }
                          BitCounter--;
                         }
                while(BitCounter);
                return(temp);
}


uchar read(uchar ch )
{
uchar temp=0;

start();
send(AddWr);//确认芯片
ack();
send(adCon|ch);//确认通道
ack();
//读出数据,放进temp
start();
send(AddRd);
ack();
temp=recive();
noAck();
stop();
return temp;
}



void dis(uchar *date)
{

uchar i=0;
uchar ch1, ch2, ch3;//ch4;

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

  ch1=i+48;
  str[1]=ch1;
  ch2=date[i]/51+48;
  str[3]=ch2;


   ch3=date[i]%51/10+48;

  str[5]=ch3;

disStr(i*8, 0, str);

}
}


void interrupt_init()
{
ET0=1;//定时器0溢出中断允许
TR0=1;//启动定时器0
TMOD=0X01;
TH0=0Xd8;
TL0=0Xf0;  
EA=1;//开总中断
}



void main()
{
uchar i=0;
uchar vot[4];


interrupt_init();
lcdInitial();


while(1)
{
    if(ADFlag==1)
    {
       for(i=0; i<4; i++) vot[i]=read(i);
         
   

  }
        dis(vot);
}
}

void tim0_() interrupt 1 using 1
{
   TH0=0xd8;  //重新赋值
   TL0=0xf0;

time++;
   if(time==100)
      {  time=0;
      ADFlag=1;
    } //定时置位AD采样标志位
}

相关帖子

沙发
xf19890224|  楼主 | 2010-5-26 13:07 | 只看该作者
已经自己解决,不用了。呵呵呵!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:快乐带来智慧!

13

主题

55

帖子

0

粉丝