找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2060|回复: 13
收起左侧

51单片机普通io口如何模拟转换为iic接口?

  [复制链接]
ID:839796 发表于 2020-12-14 01:12 来自手机 | 显示全部楼层 |阅读模式
大佬们,帮帮忙,需要将两个普通io接口模拟成两个iic接口,用来进行1602液晶屏的读写操作
回复

使用道具 举报

ID:716656 发表于 2020-12-14 07:40 来自手机 | 显示全部楼层
百度一份,改下sbit
回复

使用道具 举报

ID:592807 发表于 2020-12-14 09:11 | 显示全部楼层
现在网上搜IIC程序基本都是普通IO口模拟的。

stm32任意引脚模拟IIC.rar

2.6 KB, 下载次数: 11

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:673961 发表于 2020-12-14 09:49 来自手机 | 显示全部楼层
之前百度上看到过
回复

使用道具 举报

ID:277550 发表于 2020-12-14 09:54 | 显示全部楼层
向买iic屏的商家要一份
回复

使用道具 举报

ID:860010 发表于 2020-12-14 11:06 | 显示全部楼层
上网随便抄一个I2C单片机驱动就可以了
回复

使用道具 举报

ID:307020 发表于 2020-12-14 12:09 | 显示全部楼层
请在论坛中找PCF8547模块的相关内容。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:517951 发表于 2020-12-14 19:49 | 显示全部楼层
用51单片机的IO脚模拟I2C的例程可以可以在51黑论坛里找电子万年历的例程:用DS1302等串口的时钟芯片

void write_byte(uchar dat)
{
        ACC=dat;
        RST=1;
        for(a=8;a>0;a--)
        {
                IO=ACC0;
                SCLK=0;
                SCLK=1;
                ACC=ACC>>1;
        }
}
uchar read_byte()
{
        RST=1;
        for(a=8;a>0;a--)
        {
                ACC7=IO;
                SCLK=1;
                SCLK=0;
                ACC=ACC>>1;

        }
        return (ACC);
}
----------------------------------------
void write_1302(uchar add,uchar dat)
{

        RST=0;
        SCLK=0;
        RST=1;
        write_byte(add);
        write_byte(dat);
        SCLK=1;
        RST=0;
}
uchar read_1302(uchar add)
{
        uchar temp;
        RST=0;
        SCLK=0;
        RST=1;
        write_byte(add);
        temp=read_byte();
        SCLK=1;
        RST=0;
        return(temp);
}

void ds1302_init()
{
RST=0;
SCLK=0;

write_1302(0x8e,0x00);
//write_1302(0x80,0x00);
//write_1302(0x82,0x00);
//write_1302(0x84,0x12);
//write_1302(0x8a,0x04);
//write_1302(0x86,0x07);
//write_1302(0x88,0x01);
//write_1302(0x8c,0x10);
write_1302(0x8e,0x80);
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:401564 发表于 2020-12-14 21:54 | 显示全部楼层
现在STC出的很多系列的单片机都是自带IIC端口的,如果你不会IIC就直接用IIC端口就可以了
不然就去百度一下IIC协议看一下,或者是参考一下24C01的程序
IIC是相对简单的一个协议的,看个两三天就差不多了

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:839796 发表于 2020-12-16 01:39 来自手机 | 显示全部楼层
黄youhui 发表于 2020-12-14 09:11
现在网上搜IIC程序基本都是普通IO口模拟的。

好的,谢谢
回复

使用道具 举报

ID:839796 发表于 2020-12-16 01:39 来自手机 | 显示全部楼层
rayin 发表于 2020-12-14 19:49
用51单片机的IO脚模拟I2C的例程可以可以在51黑论坛里找电子万年历的例程:用DS1302等串口的时钟芯片

voi ...

好的,谢谢
回复

使用道具 举报

ID:839796 发表于 2020-12-16 01:40 来自手机 | 显示全部楼层
Y_G_G 发表于 2020-12-14 21:54
现在STC出的很多系列的单片机都是自带IIC端口的,如果你不会IIC就直接用IIC端口就可以了
不然就去百度一下I ...

好的,谢谢
回复

使用道具 举报

ID:280000 发表于 2020-12-31 14:58 | 显示全部楼层
需要在程序中设置的软IIC接口
回复

使用道具 举报

ID:390416 发表于 2020-12-31 15:02 | 显示全部楼层
void IIC_Delay()
{
        _nop_();_nop_();_nop_();_nop_();_nop_();
}

void IIC_Init()
{
        P2M0&=0x3f;
        P2M1&=0x3f;
        SDA_GPIO=1;
        SCL_GPIO=1;
}

void IIC_Start()//IIC启动信号
{
        SDA_GPIO=1;
        SCL_GPIO=1;
        IIC_Delay();
        SDA_GPIO=0;
        IIC_Delay();
        SCL_GPIO=0;
        IIC_Delay();
}

void IIC_Stop()//IIC停止信号
{
        SDA_GPIO=0;
        SCL_GPIO=1;
        

        SDA_GPIO=1;
        IIC_Delay();
}

void IIC_Write_Byte(u8 IIC_Byte)//向总线发送一个字节
{
        u8 i;
        SCL_GPIO=0;
        SDA_GPIO=1;
        for(i=0;i<8;i++)
        {
                SDA_GPIO=(bit)(IIC_Byte&0x80);
                IIC_Byte<<=1;
                IIC_Delay();
                SCL_GPIO=1;
                IIC_Delay();
                SCL_GPIO=0;
                IIC_Delay();
        }
}

u8 IIC_Read_Byte()
{
        u8 i,Value;
        SCL_GPIO=0;
        SDA_GPIO=1;
        for(i=0;i<8;i++)
        {
                Value=(Value<<1)|SDA_GPIO;
                IIC_Delay();
                SCL_GPIO=1;
                IIC_Delay();
                SCL_GPIO=0;
                IIC_Delay();
        }
        return Value;
}

u8 IIC_Read_Ack()//单片机检测IIC从机发来的应答信号
{
        u8 ack=1,i=0;
        SCL_GPIO=1;
        IIC_Delay();
        while((ack)&&(i<5))
        {
                ack=SDA_GPIO;
                i++;
        }
        SCL_GPIO=0;
        return ack;
}

void IIC_Write_Ack(bit ack)//单片机发送应答给从机
{
        SDA_GPIO=ack;
        IIC_Delay();
        SCL_GPIO=1;
        IIC_Delay();
        SCL_GPIO=0;
        IIC_Delay();
        SDA_GPIO=1;
        IIC_Delay();
}

IIC代码 用我这个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表