为什么我的数据经过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采样标志位
} |