|
因为STC12系列没有I2C模块,所以使用IO模拟I2C总线的方法实现的。1、EEPROM的读写,I2C通讯。
2、STC12系列是1T指令周期的,且已用示波器测量,delay(1);约1us;(程序中所用延时函数);
3、所有元件时序,皆按手册操作,高效稳定可靠,会附件PDF给大家。
4、I2C总线是用的P1.3,P1.4 IO;
单片机源程序如下:
- #include "I2C.h"
- sbit I2C_SDA=P1^3;
- sbit I2C_SCL=P1^4;
- void I2C_Delay(u16 x)
- {
- while(x--);
- }
- void I2C_Start() //产生I2C的启动信号
- {
- I2C_SDA=1;
- I2C_SCL=1;
- I2C_Delay(5); //4.7us
- I2C_SDA=0;
- I2C_Delay(5);
- I2C_SCL=0;
- }
- void I2C_Stop() //产生I2C的停止信号
- {
- I2C_SCL=0;
- I2C_SDA=0;
- I2C_Delay(5);
- I2C_SCL=1;
- I2C_Delay(5);
- I2C_SDA=1;
- }
- void I2C_Send(u8 dat) //按照I2C的协议发送一个字节
- {
- u8 i;
- for(i=0;i<8;i++)
- {
- I2C_SCL=0;
- I2C_SDA=dat>>7;
- I2C_SCL=1;
- dat<<=1;
- }
- }
- u8 Wait_Ack() //主机等待从机发送应答信号
- {
- u16 timeout;
- I2C_SCL=0;
- I2C_SDA=1;
- I2C_SCL=1;
- timeout=0;
- while(I2C_SDA)
- {
- if(timeout++>=500)
- {
- I2C_SCL=0;
- return 1; // 表示应答失败
- }
- }
- I2C_SCL=0; //释放SDA
-
- return 0;
- }
- u8 I2C_Receive() // 主机接收从机一个字节
- {
- u8 dat,i;
- for(i=0;i<8;i++)
- {
- dat<<=1;
- I2C_SCL=1;
- if(I2C_SDA)
- {
- // dat|=0x01;
- dat++;
- }
- I2C_SCL=0;
- }
- return dat;
- }
- void I2C_Ack() //主机向从机产生应答信号
- {
- I2C_SCL=0;
- I2C_SDA=0;
- I2C_SDA=1;
- I2C_SCL=1;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
I2C总线器件选型(包含8591应用).pdf
(385 KB, 下载次数: 73)
|
评分
-
查看全部评分
|