stc15 模拟iic从机代码
时间: 2023-07-10 12:04:04 浏览: 161
以下是stc15单片机模拟IIC从机的代码:
```c
#include <reg52.h>
#include <intrins.h>
sbit SCL = P3^0; //定义SCL引脚
sbit SDA = P3^1; //定义SDA引脚
unsigned char code SlaveAddr = 0xA0; //从机地址
//延时函数
void Delay1ms()
{
unsigned char i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
//开始信号
void I2C_Start()
{
SDA = 1;
SCL = 1;
Delay1ms();
SDA = 0;
Delay1ms();
SCL = 0;
}
//停止信号
void I2C_Stop()
{
SDA = 0;
SCL = 1;
Delay1ms();
SDA = 1;
Delay1ms();
}
//发送应答信号
void I2C_Ack()
{
SDA = 0;
SCL = 1;
Delay1ms();
SCL = 0;
SDA = 1;
}
//发送非应答信号
void I2C_NAck()
{
SDA = 1;
SCL = 1;
Delay1ms();
SCL = 0;
SDA = 1;
}
//写一字节数据
void I2C_Write(unsigned char dat)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
SDA = dat & 0x80;
SCL = 1;
dat <<= 1;
Delay1ms();
SCL = 0;
}
SDA = 1;
SCL = 1;
Delay1ms();
SCL = 0;
}
//读一字节数据
unsigned char I2C_Read()
{
unsigned char i, dat = 0;
SDA = 1;
for (i = 0; i < 8; i++)
{
dat <<= 1;
SCL = 1;
Delay1ms();
dat |= SDA;
SCL = 0;
}
return dat;
}
//处理主机发送的数据
void HandleData(unsigned char dat)
{
//在这里添加你的从机处理代码
}
//模拟IIC从机中断服务函数
void I2C_Slave() interrupt 0
{
unsigned char Addr, dat;
if (SCL == 0) //如果SCL为0,则表示是起始信号或停止信号
{
if (SDA == 0) //如果SDA为0,则表示是起始信号
{
Addr = I2C_Read(); //读取地址
if ((Addr & 0xFE) == SlaveAddr) //判断地址是否匹配
{
I2C_Ack(); //发送应答信号
while(1)
{
if (SCL == 1) //等待主机发送数据
{
dat = I2C_Read(); //读取数据
HandleData(dat); //处理数据
I2C_Ack(); //发送应答信号
}
else //主机发送停止信号
{
I2C_Stop(); //停止信号
break;
}
}
}
}
else //如果SDA为1,则表示是停止信号
{
I2C_Stop(); //停止信号
}
}
}
void main()
{
EA = 1; //开总中断
ES = 1; //开串口中断
while(1);
}
```
注意:以上代码仅供参考,具体实现方式可能会因为硬件平台不同而略有不同。如果你不确定如何实现,请参考你的单片机手册或参考其他相关的资料。