在51上用P1口模拟I2C
点击数:7782 次 录入时间:03-04 11:50:53 整理:http://www.55dianzi.com 嵌入式系统-技术
下面是用普通 C51 实现的 I2C 基本电平模拟函数和通用函数。
/* 电平模拟函数和基本读写函数
void IIC_Start(void);
void IIC_Stop(void);
void SEND_0(void);
void SEND_1(void);
bit Check_AcknowLEDge(void);
void Write_Byte(uchar b)reentrant;
bit Write_N_Bytes(uchar *buffer,uchar n)reentrant;
bit Read_N_Bytes(uchar SlaveAdr,uchar n,uchar *buffer);
uchar Read_Byte(void)reentrant;
*/
#include
#include
#include
#include"aiic_51.h"
sbit SCL=P1^6;
sbit SDA=P1^7;
void DELAY(uint t)
{
while(t!=0)
t--;
}
void IIC_Start(void)
{
//启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变
SDA=1;
SCL=1;
DE
www.55dianzi.com
LAY(DELAY_TIME);
SDA=0;
DELAY(DELAY_TIME);
SCL=0;
DELAY(DELAY_TIME);
}
void IIC_Stop(void)
{
//终止 I2C 总线,当SCL为高电平时使SDA产生一个正跳变
SDA=0;
SCL=1;
DELAY(DELAY_TIME);
SDA=1;
DELAY(DELAY_TIME);
SCL=0;
DELAY(DELAY_TIME);
}
void SEND_0(void)
{
//发送0,在SCL为高电平时使SDA信号为低
SDA=0;
SCL=1;
DELAY(DELAY_TIME);
SCL=0;
DELAY(DELAY_TIME);
}
void SEND_1(void)
{
//发送1
www.55dianzi.com
,在SCL为高电平时使SDA信号为高
SDA=1;
SCL=1;
DELAY(DELAY_TIME);
SCL=0;
DELAY(DELAY_TIME);
}
bit Check_AcknowLEDg
e(void)
{
//发送完一个字节后检验设备的应答信号
SDA=1;
SCL=1;
DELAY(DELAY_TIME/2);
F0=SDA;
DELAY(DELAY_TIME/2);
SCL=0;
DELAY(DELAY_TIME);
if(F0==1)
return FALSE;
return TRUE;
}
void Write_Byte(uchar b)reentrant
{
//向IIC总线写一个字节
uchar i;
for(i=0;i<8;i++)
if((b<&
www.55dianzi.com
nbsp;
SEND_1();
else
SEND_0();
}
bit Write_N_Bytes(uchar *buffer,uchar n)reentrant
&nbs
p; {
//向 I2C 总线写n个字节
uchar i;
IIC_Start();
for(i=0;i {
Write_Byte(buffer[i]);
[1] [2] 下一页
本文关键字:暂无联系方式嵌入式系统-技术,单片机-工控设备 - 嵌入式系统-技术