打印

数据经过AD转换再送到液晶显示上错误

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

使用特权

评论回复
沙发
yufe| | 2020-6-27 18:01 | 只看该作者
不懂,帮顶?

使用特权

评论回复
板凳
wangpe| | 2020-6-27 18:04 | 只看该作者
有代码吗

使用特权

评论回复
地板
zhanglli| | 2020-6-27 18:07 | 只看该作者

#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/51+48;
   str[3]=ch2;


   ch3=date%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=read(i);
         
     

  }
         dis(vot);
}
}

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

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

使用特权

评论回复
5
lium| | 2020-6-27 18:11 | 只看该作者
看代码看了半天

使用特权

评论回复
6
llia|  楼主 | 2020-6-28 21:54 | 只看该作者
已经自己解决,不用了。呵呵呵!

使用特权

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

本版积分规则

961

主题

8893

帖子

4

粉丝