专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

ADC0832采集数据1602液晶显示

作者:未知   来源:不详   点击数:  更新时间:2014年07月29日   【字体:

#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);
  }
 
 
}
 
关闭窗口

相关文章