微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > pcf8591采集电压 1602显示 数字在零和2.3之间跳动

pcf8591采集电压 1602显示 数字在零和2.3之间跳动

时间:10-02 整理:3721RD 点击:

#include <reg52.h>      
#include<intrins.h>         
#define  _Nop()  _nop_()  //定义空指令
#define AddWr 0x90   //写数据地址
#define AddRd 0x91   //读数据地址
#define uint unsigned int                         //宏定义
#define uchar unsigned char                          //宏定义
#define ulong unsigned long                          //宏定义
bit ack;                                                   //应答标志位
sbit lcdrs=P2^6;//1602寄存器选择
sbit lcdrw=P2^5;//1602读写
sbit lcden=P2^7;//1602使能   
sbit SDA=P2^0;
sbit SCL=P2^1;
uchar num1;
unsigned char TempData[11]=" ch1= .  v ";
void DelayUs2x(unsigned char t)
{   
while(--t);
}
void DelayMs(unsigned char t)
{
while(t--)
{
     DelayUs2x(245);
         DelayUs2x(245);
}
}
void Start_I2c()
{
  SDA=1;   //发送起始条件的数据信号
_Nop();
  SCL=1;
  _Nop();    //起始条件建立时间大于4.7us,延时
  _Nop();
  _Nop();
  _Nop();
  _Nop();   
  SDA=0;     //发送起始信号
  _Nop();    //起始条件锁定时间大于4μ
  _Nop();
  _Nop();
  _Nop();
  _Nop();      
  SCL=0;    //钳住I2C总线,准备发送或接收数据
  _Nop();
  _Nop();
}
void Stop_I2c()
{
  SDA=0;    //发送结束条件的数据信号
  _Nop();   //发送结束条件的时钟信号
  SCL=1;    //结束条件建立时间大于4μ
  _Nop();
  _Nop();
  _Nop();
  _Nop();
  _Nop();
  SDA=1;    //发送I2C总线结束信号
  _Nop();
  _Nop();
  _Nop();
  _Nop();
}
void  SendByte(unsigned char c)
{
unsigned char BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++)  //要传送的数据长度为8位
    {
     if((c<<BitCnt)&0x80)SDA=1;   //判断发送位
       else  SDA=0;               
     _Nop();
     SCL=1;               //置时钟线为高,通知被控器开始接收数据位
      _Nop();
      _Nop();             //保证时钟高电平周期大于4μ
      _Nop();
      _Nop();
      _Nop();         
     SCL=0;
    }
    _Nop();
    _Nop();
    SDA=1;               //8位发送完后释放数据线,准备接收应答位
    _Nop();
    _Nop();   
    SCL=1;
    _Nop();
    _Nop();
    _Nop();
    if(SDA==1)ack=0;     
       else ack=1;        //判断是否接收到应答信号
    SCL=0;
    _Nop();
    _Nop();
}

unsigned char  RcvByte()
{
  unsigned char retc;
  unsigned char BitCnt;
  retc=0;
  SDA=1;             //置数据线为输入方式
  for(BitCnt=0;BitCnt<8;BitCnt++)
      {
        _Nop();           
        SCL=0;       //置时钟线为低,准备接收数据位
        _Nop();
        _Nop();      //时钟低电平周期大于4.7us
        _Nop();
        _Nop();
        _Nop();
        SCL=1;       //置时钟线为高使数据线上数据有效
        _Nop();
        _Nop();
        retc=retc<<1;
        if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中
        _Nop();
        _Nop();
      }
  SCL=0;   
  _Nop();
  _Nop();
  return(retc);
}
void NoAck_I2c(void)
{
  SDA=1;
  _Nop();
  _Nop();
  _Nop();      
  SCL=1;
  _Nop();
  _Nop();              //时钟低电平周期大于4μ
  _Nop();
  _Nop();
  _Nop();  
  SCL=0;                //清时钟线,钳住I2C总线以便继续接收
  _Nop();
  _Nop();   
}
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}
void write_com(uchar com)
{
        lcdrs=0;
        lcdrw=0;
        P0=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
/****************************************************/
void write_data(uchar date)
{
        lcdrs=1;
        lcdrw=0;
        P0=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
/*****************液晶初始化函数***********************************/
void init1()
{
        lcden=0;
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);                                                                                                                                                                                                                       
        write_com(0x01);
       
         
}
unsigned char ReadADC(unsigned char Chl)
{
   unsigned char Val;
   Start_I2c();               //启动总线
   SendByte(AddWr);             //发送器件地址
     if(ack==0)return(0);
   SendByte(0x40|Chl);            //发送器件子地址
     if(ack==0)return(0);
   Start_I2c();
   SendByte(AddWr+1);
      if(ack==0)return(0);
   Val=RcvByte();
   NoAck_I2c();                 //发送非应位
   Stop_I2c();                  //结束总线
  return(Val);
}
/*------------------------------------------------
              主程序
------------------------------------------------*/
main()
{
unsigned char num=0;
init1();
while (1)         //主循环
  {
  num=ReadADC(1)*196;
TempData[5]=num/100+'0';   
TempData[7]=num%100/10+'0';
TempData[8]=num%100%10+'0';
        write_com(0x80);
        for(num1=0;num1<10;num1++)
        {
                write_data(TempData[num1]);
                delay(200);
                }
         DelayMs(100);
  }
}


已退回5积分

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top