📄 datapeek.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 + -