#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit cs=P3^0;//对ADC0832进行位定义
sbit DI=P3^2;
sbit DO=P3^2;
sbit clk=P3^1;
uchar readad[2];
void adc0832(unsigned char channel);
void adc0832(uchar channel)//对0832的操作:首先进行传输数据前的定义,严格按照时序,
{ // 其次开始传数据,如果达到了8位,从新开始传
uchar i=0; //最后开始收数据 ,不管是传数据还是收数据,都要有一个完整的时钟脉冲
uchar j;//对数据值的定义 //数据每次只能传输一位
uint dat=0; //传数据是从最高位开始将寄存器的数据发送完,接着从低位开始发,比较2次发送的数据是否一样
uchar ndat=0; //如果一样则接收如果不一样则淘汰
if(channel==0)channel=2;
if(channel==1)channel=3;
DI=1;
_nop_();
_nop_();
cs=0; //拉低cs端
_nop_();
_nop_();
clk=1; //拉高clk
_nop_();
_nop_();
clk=0; //拉低clk形成下降沿1
_nop_();
_nop_();
clk=1;
DI=channel&0x1;
_nop_();
_nop_();
clk=0; //形成下降沿2
_nop_();
_nop_();
clk=1;
DI=(channel>>1)&0x1;
_nop_();
_nop_();
clk=0; //形成下降沿3
DI=1; //控制指令结束
_nop_();
_nop_();
dat=0; //将dat初始化
for(i=0;i<8;i++) //从高位开始发数据
{
dat|=DO;//接收数据
clk=1;
_nop_();
_nop_();
clk=0;
_nop_();
_nop_();//形成一次时钟脉冲,数据传一位
dat<<=1;//将所收到的数据进行左移一位
if(dat==7) //如果所收到的数据达到了8位。
dat|=DO;//接着收数据
}
for(i=0;i<8;i++) //从低位开始发数据
{
j=0;
j=j|DO;//或者是j|=DO....开始收数据
clk=1;
_nop_();
_nop_();
clk=0; //形成一次时钟脉冲
_nop_();
_nop_();
j=j<<7;
ndat=ndat|j;
if(j<7)
ndat>>=1;//得到的这位数据向左移7位
}
cs=1;
clk=0;
DO=1; //回到初始状态
readad[0]=dat;
readad[1]=ndat;
}
#define REG0 XBYTE[0x0000]//通过宏定义将液晶的初始化设置,写指令,写数据
#define REG1 XBYTE[0x0001]//读指令,读数据代替,可以直接调用
#define REG2 XBYTE[0x0002]
#define REG3 XBYTE[0x0003]
uchar bdata busyflag;
uchar dat,datn,count;
uchar word1[16]={"CH="};
code uchar word2[16]={"liushuai"};
code uchar word3[16]={"19901001"};
sbit busyflag_7=busyflag^7;
//液晶的初始化//
void busy()
{
do
{
busyflag=REG1;
}while(busyflag_7);
}
void wrc( uchar wcon)
{
busy();//检测液晶是否处于工作状态
REG0=wcon; //写指令
}
void wrd(uchar wdat)
{
busy();
REG2=wdat;//写数据
}
void rdd()//读数据
{
busy();
dat=REG3;
}
void lcdint() //液晶的初始化指令
{
wrc(0x38);
wrc(0x01);
wrc(0x06);
wrc(0x0c);
}
void wrn(uchar word[])
{
uchar i;
for(i=0;i<16;i++)
{
wrd (word[i]);
}
}
void temp() //数字的转换
{
float tt;
tt=readad[0]/255.0*5.0;
word1[4]=(unsigned char)(tt);
word1[5]='.';
word1[6]=(unsigned char)(tt*10-word1[4]*10);
word1[7]=(unsigned char)(tt*100-word1[4]*100-word1[6]*10);
word1[8]=(unsigned char)(tt*1000-word1[4]*1000-word1[6]*100-word1[7]*10);
word1[9]=(unsigned char)(tt*10000-word1[4]*10000-word1[6]*1000-word1[7]*100-word1[8]*10);
word1[4]+=48;
word1[6]+=48;
word1[7]+=48;
word1[8]+=48;
word1[9]+=48;
word1[10]='V';
}
void main()
{
lcdint();//初始化液晶
wrc(0x80);
wrn(word2);
wrc(0xc0);
wrn(word3);
while(1)
{
adc0832(0);//选择通道0
temp() ;
wrc(0x80);
word1[2]='0';
temp() ;
adc0832(0);//选择通道1
temp() ;
wrc(0xc0);
word1[2]='1';
wrn(word1);
}
}