專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

ADC0832采集數(shù)據(jù)1602液晶顯示

作者:未知   來(lái)源:不詳   點(diǎn)擊數(shù):  更新時(shí)間:2014年07月29日   【字體:

#include <intrins.h>

#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit cs=P3^0;//對(duì)ADC0832進(jìn)行位定義
sbit DI=P3^2;
sbit DO=P3^2;
sbit clk=P3^1;
uchar readad[2];
void adc0832(unsigned char channel);
void adc0832(uchar channel)//對(duì)0832的操作:首先進(jìn)行傳輸數(shù)據(jù)前的定義,嚴(yán)格按照時(shí)序,
{                              // 其次開(kāi)始傳數(shù)據(jù),如果達(dá)到了8位,從新開(kāi)始傳
  uchar i=0;                   //最后開(kāi)始收數(shù)據(jù)  ,不管是傳數(shù)據(jù)還是收數(shù)據(jù),都要有一個(gè)完整的時(shí)鐘脈沖
  uchar j;//對(duì)數(shù)據(jù)值的定義     //數(shù)據(jù)每次只能傳輸一位
  uint dat=0;                 //傳數(shù)據(jù)是從最高位開(kāi)始將寄存器的數(shù)據(jù)發(fā)送完,接著從低位開(kāi)始發(fā),比較2次發(fā)送的數(shù)據(jù)是否一樣
  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;  //控制指令結(jié)束
      _nop_();
      _nop_();
      dat=0;  //將dat初始化
      for(i=0;i<8;i++)            //從高位開(kāi)始發(fā)數(shù)據(jù)
      {
        dat|=DO;//接收數(shù)據(jù)
        clk=1;
          _nop_();
           _nop_();
        clk=0;
            _nop_();
            _nop_();//形成一次時(shí)鐘脈沖,數(shù)據(jù)傳一位
        dat<<=1;//將所收到的數(shù)據(jù)進(jìn)行左移一位
        if(dat==7) //如果所收到的數(shù)據(jù)達(dá)到了8位。
          dat|=DO;//接著收數(shù)據(jù)
      }
     for(i=0;i<8;i++)            //從低位開(kāi)始發(fā)數(shù)據(jù)
       {
         j=0;
         j=j|DO;//或者是j|=DO....開(kāi)始收數(shù)據(jù)
         clk=1;
         _nop_();
         _nop_();
         clk=0;  //形成一次時(shí)鐘脈沖
         _nop_();
         _nop_();
         j=j<<7;
         ndat=ndat|j;
         if(j<7)
          ndat>>=1;//得到的這位數(shù)據(jù)向左移7位
        }
      cs=1;
      clk=0;
      DO=1;     //回到初始狀態(tài)
      readad[0]=dat;
      readad[1]=ndat;  
       
}
 
 
#include<absacc.h>
#define REG0 XBYTE[0x0000]//通過(guò)宏定義將液晶的初始化設(shè)置,寫指令,寫數(shù)據(jù)
#define REG1 XBYTE[0x0001]//讀指令,讀數(shù)據(jù)代替,可以直接調(diào)用
#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();//檢測(cè)液晶是否處于工作狀態(tài)
  REG0=wcon; //寫指令
 
}  
void wrd(uchar wdat)
{
  busy();
  REG2=wdat;//寫數(shù)據(jù)
}
void rdd()//讀數(shù)據(jù)
{
  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()  //數(shù)字的轉(zhuǎn)換
{
  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);
  }
 
 
}
 
關(guān)閉窗口

相關(guān)文章