⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datapeek.c

📁 基于at89s52单片机的模数转换c51源程序。单片机与模数转换模块PCF859相连
💻 C
字号:
#include<reg52.h>
#include<intrins.h>

#define PCF8591_WRITE	0x90
#define PCF8591_READ 	0x91

sbit SDA = P1 ^ 1; // P1.1口模拟数据口
sbit SCL = P1 ^ 0; // P1.0口模拟时钟口

unsigned char data receivebuf[4]; //数据接收缓冲区

char code reserve[3]_at_ 0x3b; //保留0x3b开始的3个字节


/**********************************************************

us延时函数    (4.34us)

 **********************************************************/
void delayNOP()
{
  _nop_();
  _nop_();
  _nop_();
  _nop_();
}

/**********************************************************

ms延时函数

 **********************************************************/
void delayms(unsigned int ms)
{
  unsigned char i;
  while (ms--)
  {
    for (i = 0; i < 114; i++)
      ;
  }
}

/**********************************************************/

void iic_start(void)
{
  SDA = 1;
  SCL = 1;
  delayNOP(); // 延时5us
  SDA = 0;
  delayNOP();
  SCL = 0;
}

/**********************************************************

函数名称: iic_stop()
函数功能: 停止I2C总线数据传送子程序
时钟保持高,数据线从低到高一次跳变,I2C通信停止

 **********************************************************/
void iic_stop(void)
{
  SDA = 0;
  SCL = 1;
  delayNOP();
  SDA = 1;
  delayNOP();
  SCL = 0;
}

/**********************************************************

函数名称: iicInit_()
函数功能: 初始化I2C总线子程序

 **********************************************************/
void iicInit(void)
{
  SCL = 0;
  iic_stop();
}

/**********************************************************

函数名称: slave_ACK
函数功能: 从机发送应答位子程序

 **********************************************************/
void slave_ACK(void)
{
  SDA = 0;
  SCL = 1;
  delayNOP();
  SCL = 0;
  SDA = 1;
}

/**********************************************************

函数名称: slave_NOACK
函数功能: 从机发送非应答位子程序,迫使数据传输过程结束

 **********************************************************/
void slave_NOACK(void)
{
  SDA = 1;
  SCL = 1;
  delayNOP();
  SDA = 0;
  SCL = 0;
  SDA = 0;
}

/**********************************************************

函数名称: check_ACK
函数功能: 主机应答位检查子程序,迫使数据传输过程结束

 **********************************************************/
void check_ACK(void)
{
  SDA = 1; //置成输入
  SCL = 1;
  F0 = 0;
  delayNOP();
  if (SDA == 1)
  //若SDA=1表明非应答
    F0 = 1;
  //置位非应答标志F0
  SCL = 0;
}

/**********************************************************

函数名称: IICSendByte
入口参数: indata
函数功能: 发送一个字节

 **********************************************************/
void IICSendByte(unsigned char indata)
{
  unsigned char n = 8; //发送一字节数据,共八bit

  while (n--)
  {
    SDA = (bit)(indata &0x80);
    SCL = 1;
    delayNOP();
    SCL = 0;

    indata = indata << 1; //数据左移一位
  }
}

/**********************************************************

函数名称: IICreceiveByte
返回接收的数据  tdata
函数功能: 接收一字节子程序

 **********************************************************/
unsigned char IICreceiveByte(void)
{
  unsigned char n = 8; //读取一字节数据,共八bit
  unsigned char tdata = 0;

  while (n--)
  {
    SDA = 1;
    SCL = 1;
    tdata = tdata << 1; //左移一位
    if (SDA == 1)
      tdata = tdata | 0x01;
    //若接收到的位为1,则数据的最后一位置1
    else
      tdata = tdata &0xfe;
    //否则数据的最后一位置0
    SCL = 0;
  }

  return (tdata);
}

/**********************************************************

函数名称: ADC_PCF8591

函数功能: A/D转换,结果存入receivebuf

 **********************************************************/
void ADC_PCF8591(unsigned char controlbyte)
{
  unsigned char i = 0;


  iic_start();
  IICSendByte(PCF8591_WRITE); //控制字0x90
  check_ACK();

  IICSendByte(controlbyte); //通道控制字
  check_ACK();

  iic_start(); //重新发送开始命令
  IICSendByte(PCF8591_READ); //控制字0x91
  check_ACK();


  IICreceiveByte(); //空读一次
  slave_ACK(); //收到一个字节后发送一个应答位

  while (i < 3)
  //采集0,1,2通道
  {
    receivebuf[i++] = IICreceiveByte();
    slave_ACK();
  }
  receivebuf[3] = IICreceiveByte(); //采集第3通道
  slave_NOACK(); //收到最后一个字节后发送一个非应答位
  iic_stop();
}


/*********************************************************

发送数据子函数

 *********************************************************/
void txdata(unsigned char dat)
{
  SBUF = dat; //发送数据
  while (!TI)
    ;
  //等待数据发送完中断
  TI = 0; //清中断标志
}

/*********************************************************

接收数据子函数

 *********************************************************/
unsigned char rxdata()
{
  unsigned char dat;

  while (!RI)
    ;
  //等待数据接收完
  dat = SBUF; //接收数据
  RI = 0; //清中断标志
  return (dat);
}

/********************************************************

传送字符串函数

/********************************************************/
void send_str(unsigned char str[])
{
  unsigned char i = 0;

  while (str[i] != '\0')
  {
    SBUF = str[i++];
    while (!TI)
      ;
    //等待数据传送完毕
    TI = 0; //清中断标志
  }
}

/*********************************************************/

void main()
{
	unsigned char buff;
  	P1 = 0xff;


  	SCON = 0x50; //设定串口工作方式1,接收使能
  	PCON = 0x00; //波特率不倍增

  	TMOD = 0x20; //定时器1工作于8位自动重载模式, 用于产生波特率
  	EA = 1;
 	TL1 = 0xfd;
 	TH1 = 0xfd; //波特率9600
  	TR1 = 1;
	while(1)
	{
			delayms(10); //延时
			buff=rxdata();
 			while (buff==0x30)
  			{
    			iicInit(); //I2C总线初始化
    			ADC_PCF8591(0x04); //4通道转换
    			while (F0)
    			//有错误,重新来
    			{
      				iicInit(); //I2C总线初始化
      				ADC_PCF8591(0x04); //4通道转换
    			}
				txdata(receivebuf[0]);
				buff=rxdata();

			}
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -