根据给定文件的信息,我们可以总结出以下关于IIC(Inter-Integrated Circuit)读写程序的知识点: ### IIC总线简介 IIC总线是一种由Philips公司开发的两线式串行总线,用于连接微控制器和其他低速器件如EEPROM、A/D转换器、D/A转换器、小型液晶显示器等。它主要由两条信号线组成:一条是数据线SDA(Serial Data),另一条是时钟线SCL(Serial Clock)。IIC总线支持多主控模式,任何能够进行发送和接收的设备都可以成为主控器。 ### IIC通信基本原理 IIC通信基于一种半双工方式,即数据传输只能单向进行。通信过程主要包括起始条件、结束条件、地址传送、数据传送以及应答位等部分。 1. **起始条件**:在SCL为高电平期间,SDA由高电平向低电平跳变。 2. **结束条件**:在SCL为高电平期间,SDA由低电平向高电平跳变。 3. **地址传送**:主设备发送从设备的地址,并等待从设备发送的应答信号。 4. **数据传送**:主设备可以发送或接收数据,每次发送8位数据后,都会跟随一个应答位。 5. **应答位**:当一个字节被接收到之后,接收方会返回一个应答信号。 ### C语言实现IIC读写功能 #### 1. 引入必要的头文件 ```c #include<reg52.h> #include<intrins.h> ``` - `reg52.h` 是针对51系列单片机的标准头文件,包含了单片机内部寄存器的定义。 - `intrins.h` 提供了对单片机内部硬件操作的一些内联函数。 #### 2. 定义IIC信号线 ```c sbitsda=P2^0; sbitscl=P2^1; ``` - `sbit`关键字用于定义特殊功能寄存器中的位变量,这里将SDA和SCL分别映射到P2口的第0位和第1位。 #### 3. 定义全局变量 ```c ucharidatatab[]; ucharidatawei[]; ucharidatasdate[3]; ucharn=2; ucharidatamdate[3]={12,34,56}; ``` - `idatatab[]` 和 `idatawei[]` 分别用于存储显示字符和位控制信息。 - `idatasdate[3]` 用于存储日期信息。 - `n` 表示需要写入的数据个数。 - `idatamdate[3]` 存储需要写入的数据。 #### 4. 延时函数 ```c voiddelay() { uchari;i++; } ``` 延时函数用于确保信号线的稳定,通常需要根据实际晶振频率进行调整。 #### 5. IIC操作函数 - **初始化**: ```c voidintc() { sda=1; scl=1; P0=0x00; } ``` - **启动序列**: ```c voidstart() { sda=1; scl=1; delay(); sda=0; delay(); scl=0; } ``` - **停止序列**: ```c voidstop() { sda=0; scl=1; delay(); sda=1; delay(); scl=0; } ``` - **应答/不应答**: - `voidrespons()`:等待从设备应答。 - `voidno_respons()`:不等待从设备应答。 - **写数据**: ```c voidwrite_date(uchardate) { uchari,temp; temp=date; for(i=0;i<8;i++) { temp=temp<<1; scl=0; delay(); sda=CY; delay(); scl=1; delay(); } scl=0; delay(); sda=1; delay(); } ``` - **读数据**: ```c ucharread_date() { uchari,k; scl=0; delay(); sda=1; for(i=0;i<8;i++) { scl=1; delay(); k=(k<<1)|sda; scl=0; delay(); } delay(); returnk; } ``` #### 5. 写入指定地址的数据 ```c voidwrite_sword(ucharsta,ucharn,uchar*date) { uchari; start(); write_date(0xa0);//E2PROM地址ATC02为oxa0 respons(); write_date(sta);//写入所需的地址 respons(); for(i=0;i<n;i++) { write_date(date[i]); respons(); } //...更多代码 } ``` - 这个函数实现了向指定地址写入一系列数据的功能。 通过上述分析,我们可以看到这是一个完整的IIC读写程序,它利用C语言实现了对IIC总线的基本操作,包括启动、停止、读写数据等。这些知识对于理解和开发基于IIC总线的嵌入式系统非常重要。
//程序功能:利用I2C总线写或读E2PROM
//向E2PROM写n个数据,再按头尾地址读出
//当然你也可以设置n=1;那就只写读一个数据
//************************************
//********************************************
#include<reg52.h>
#include<intrins.h>//空操作需要的头文件
#define uchar unsigned char
sbit sda=P2^0;//声明控制信号
sbit scl=P2^1;
uchar idata tab[]={
//数码显示从0-9数字,读ROM时
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
uchar idata wei[]={//6个数码管的控制信号
0x01,0x02,0x04,0x08,0x10,0x20};
uchar idata sdate[3];//接收数据的数组变量
uchar n=2;//串写入时的个数
uchar idata mdate[3]={12,34,56};//要写入的数据
//*********************************************
//----------------------------------
void delay()//延时函数
{//约等于5us用于控制信号SDA,SCL的延时
uchar i;i++;
}
//----------------------------------
{//约等于z*0.5ms
//用于写、读间时;数码动态显示间时
uchar i,j;
for(i=z;i>0;i--)
for(j=222;j>0;j--);
}
//----------------------------------
void intc()//初始化函数
{
sda=1;//控制信号拉高
scl=1;
P0=0x00;//数码管不显示
}
//----------------------------------
void start()//起始信号函数
{//向ROM发送一个开始的信号
sda=1;
scl=1;
delay();
sda=0;
delay();
scl=0;
}
//----------------------------------
void stop()//停止信号函数
{//向ROM发送一个停止的信号
sda=0;
scl=1;
delay();
剩余6页未读,继续阅读
- 粉丝: 1
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Javase语言学习.zip
- CRC16-CCITT-FALSE
- 圣诞树html展示代码资料.zip
- ATA Command Set -5 (ACS-5).pdf
- wpf 控件库 参考 Demo
- MoonBit 编译器 MoonBit - 文档 - 概览 - 标准库
- CRC8 标准校验CAN报文
- promtail linux 安装包
- 基于微信小程序的中国各地美食推荐平台的设计与实现springboot.zip
- 微信小程序基于BS模式的学生实习与就业管理系统设计与实现springboot.zip
- 微信小程序自助点餐系统springboot.zip
- 【大模型必备】office 转 markdown 的服务实现,基于微软markitdown
- 答题小程序ssm.zip
- 基于微信小程序的水果销售系统的设计与实现springboot.zip
- 基于微信小程序的学生签到系统设计与实现ssm.zip
- “校园资料分享微信小程序”的设计与实现springboot.zip