51单片机iic写入浮点数
时间: 2024-05-24 19:09:37 浏览: 115
IIC.zip_51单片机IIC
51单片机的IIC总线可以用来进行数字信号和模拟信号的转换,也可以用于传输浮点数等复杂数据。具体的写入浮点数的方法如下:
1. 将需要传输的浮点数转换成字符数组或者整型数组;
2. 将字符数组或整型数组按照IIC协议进行传输;
3. 接收方接收到数据后,将字符数组或整型数组转换成浮点数。
在实际操作中,需要使用到一些51单片机的IIC库函数,比如StartI2C、SendByte、RecvByte等。具体的步骤可以参考以下代码:
```
#include <reg51.h>
#include <stdio.h>
#include <math.h>
#define SCL P2_1 //定义SCL引脚
#define SDA P2_0 //定义SDA引脚
#define I2C_READ 1 //读取
#define I2C_WRITE 0 //写入
#define I2C_ACK 0 //应答
#define I2C_NAK 1 //非应答
sbit LED = P1^0; //定义LED灯
void delay(unsigned int t)
{
while(t--);
}
void StartI2C()
{
SDA = 1; //SDA初始状态为高电平
SCL = 1; //SCL初始状态为高电平
delay(10); //延时一段时间
SDA = 0; //SDA拉低,发送起始信号
delay(10); //延时一段时间
SCL = 0; //SCL拉低,准备发送地址和读写位
}
void StopI2C()
{
SDA = 0; //SDA初始状态为低电平
delay(10); //延时一段时间
SCL = 1; //SCL初始状态为高电平
delay(10); //延时一段时间
SDA = 1; //SDA拉高,发送停止信号
delay(10); //延时一段时间
}
unsigned char SendByte(unsigned char byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(byte & 0x80) SDA = 1; //发送最高位
else SDA = 0;
delay(10); //延时一段时间
SCL = 1; //拉高SCL,发送数据位
delay(10); //延时一段时间
SCL = 0; //拉低SCL,准备发送下一个数据位
byte <<= 1;
}
delay(10); //延时一段时间
SDA = 1; //SDA初始状态为高电平,等待应答信号
delay(10); //延时一段时间
SCL = 1; //拉高SCL,接收应答信号
i = SDA; //读取SDA电平,判断是否应答
delay(10); //延时一段时间
SCL = 0; //拉低SCL,准备接收下一个数据位
return i;
}
unsigned char RecvByte(unsigned char ack)
{
unsigned char i,byte=0;
for(i=0;i<8;i++)
{
byte <<= 1;
SDA = 1; //SDA初始状态为高电平,等待接收数据位
delay(10); //延时一段时间
SCL = 1; //拉高SCL,接收数据位
byte |= SDA;
delay(10); //延时一段时间
SCL = 0; //拉低SCL,准备接收下一个数据位
}
delay(10); //延时一段时间
if(ack) SDA = 1; //非应答信号
else SDA = 0; //应答信号
delay(10); //延时一段时间
SCL = 1; //拉高SCL,发送应答信号或非应答信号
delay(10); //延时一段时间
SCL = 0; //拉低SCL,准备接收下一个字节数据
return byte;
}
void WriteI2C(unsigned char addr,unsigned char reg,unsigned char *data,unsigned char len)
{
unsigned char i;
StartI2C(); //发送起始信号
SendByte(addr<<1 | I2C_WRITE); //发送设备地址和读写位
SendByte(reg); //发送寄存器地址
for(i=0;i<len;i++)
{
SendByte(data[i]); //发送数据字节
}
StopI2C(); //发送停止信号
}
void ReadI2C(unsigned char addr,unsigned char reg,unsigned char *data,unsigned char len)
{
unsigned char i;
StartI2C(); //发送起始信号
SendByte(addr<<1 | I2C_WRITE); //发送设备地址和读写位
SendByte(reg); //发送寄存器地址
StartI2C(); //重新发送起始信号
SendByte(addr<<1 | I2C_READ); //发送设备地址和读写位
for(i=0;i<len-1;i++)
{
data[i] = RecvByte(I2C_ACK); //接收数据字节并应答
}
data[len-1] = RecvByte(I2C_NAK); //接收最后一个字节数据并非应答
StopI2C(); //发送停止信号
}
void main()
{
float f = 3.1415926;
unsigned char buf;
buf = *((unsigned char *)&f+3);
buf = *((unsigned char *)&f+2);
buf = *((unsigned char *)&f+1);
buf = *((unsigned char *)&f+0);
WriteI2C(0x50, 0x00, buf, 4);
while(1)
{
LED =~LED;
delay(50000);
LED =~LED;
delay(50000);
}
}
```
阅读全文