#include <intrins.h>
#include <reg51.h>
#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;
}
#include<absacc.h>
#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);
}
}