优子集团及腾盛博药生物科技本周寻求香港联交所上市批准
06-18
最近在使用测光的模块BHFVI时需要使用IIC总线操作,所以花了很多时间学习,基本搞懂了,所以就用了IO 51接口,模拟了总线时序,可以正确操作一系列需要使用IIC总线访问的模块。
本来想写一篇文章简单介绍一下我对IIC总线的理解,但是发现没有时间,所以以后再写。
到时候我们再做一次。
今天我只给你一个示例程序,它在我的51单片机系统上运行得很好。
iic.h列出了IIC总线的所有操作函数。

源代码如下: //iic.h - 实现相关头文件 //女孩别哭01-18 #ifndef __IIC_H__ #define __IIC_H__ void iic_start (void); void iic_stop (void); bit iic_get_ack(void); void iic_write_byte(uchar dat); uchar iic_read_byte(void); void iic_send_ack(bit ack) ; #endif//! __IIC_H__ //IIC总线模拟实现文件 //女孩别哭22:11 1-18 #include "common.h" #include "iic.h" sbit SDA = P1^2; sbit SCL = P1^0; //产生START信号 void iic_start(void) { SDA = 1; //需要在SCL之前设置 SCL = 1; //硬件进入SDA检测状态 delay_us(5); //延迟至少4.7us SDA = 0; //SDA从1->0变化,产生启动信号 delay_us(5); //延迟至少4us SCL = 0; //SCL无效 } //产生STOP信号 void iic_stop(void) { SDA = 0; //SCL之前拉低 SCL = 1; //硬件进入SDA检测状态 delay_us(5); //延迟至少4us SDA=1; //SDA从0->1变化,产生结束信号 delay_us(5); //延迟至少4.7us } //向IIC总线写入1个字节 void iic_write_byte(uchar dat) { uchar Loop = 8; //必须是一个字节 while(loop--){ SDA = dat&0x80; //从MSb开始逐位写入 SCL = 1; delay_us(5); //延迟至少4us SCL = 0; dat delay_us(5); } } //从IIC总线读取1个字节 uchar iic_read_byte (无效) { uchar循环= 8; //必须是一个字节 uchar ret = 0; while(loop--){ SDA = 1; //内部电阻上拉 SCL = 1; delay_us(5); //延迟至少4us ret ret |= SDA; //读取1位 SCL = 0 ; delay_us(5); } return ret; } //主机向从机发送响应码 / /0-ACK,1-NAK void iic_send_ack(位确认) { SDA = ack; //生成响应级别 SCL = 1; //发送响应信号 delay_us(5); //延迟至少4us SCL = 0; //整个期间保持响应信号 } //获取从机到主机的响应码 bit iic_get_ack(void) { bit ret; //用于接收返回值 SDA = 1; //电阻上拉,进入read() SCL = 1; //输入响应 Detect delay_us(5); //延迟至少4us ret = SDA; //保存响应信号 SCL = 0; return ret; } 以上代码给出的是所有IIC总线程序。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-18
06-18
06-18
06-18
06-17
06-18
06-18
06-18
最新文章
PCBA质检员的日常工作内容
美国法院裁定VoIP不属于电信服务,需征税
雷达嵌入式工控主板如何使用?工控主板故障分析
摩托罗拉在西班牙促销Z8手机
中宇买下了一台三星机型,品牌和规模是合作的主要原因
舰载军用加固计算机热设计
谷歌开始对仍由HTC生产的谷歌手机进行内部测试
英国EE分享LTE发展经验教训,面临终端-语音-回传三大挑战