#include "iic.h"
/*
对于数据位,我们需要保持SCL为高电平时
SDA的数据必须保持稳定
SCL为低电平时,我们才能改变SDA上的数据
起始信号和终止信号
当SCL为高电平时
SDA从高到低,为起始信号(之后SCL置0表示准备发送数据)
SDA从低到高,为终止信号
我们可以这样理解,当SCL为高电平时
我要对SDA进行改变,那么我就是发送了一条命令
当SCL为低电平的时候
我对SDA进行改变,是为了在SCL为高电平时
进行数据的传输
所以,简单来说,各种信号
起始、终止信号
都是在SCL为高电平时,SDA进行各种改变来发生的
*/
// 起始信号
void IIC_start()
{
SDA=1;//如果把该条语句放在SCL后面,第二次读写会出现问题
Delay10us(1);
SCL=1;
Delay10us(1);
SDA=0;
Delay10us(1);
// 在时钟线为高电平时,SDA产生下降沿
// 就会发送起始信号
//占用总线,准备发送命令或数据
SCL=0;
Delay10us(1);
}
void IIC_stop()
{
SDA=0;
Delay10us(1);
SCL=1;
Delay10us(1);
SDA=1;
Delay10us(1);
// 在时钟线为高电平时,SDA产生上升沿
// 就会产生结束信号
// 以及停止,不用再占用总线
}
void IIC_ack()
{
// 在地址/数据传输完后
// 产生第九个时钟信号
// 在该信号SDA为低电平表示应答
SCL=0;
Delay10us(1);
SDA=0;
Delay10us(1);
SCL=1;
Delay10us(1);
SCL=0;
Delay10us(1);
}
void IIC_nack()
{
// 在地址/数据传输完后
// 产生第九个时钟信号
// 在该信号SDA为高电平表示非应答
SCL=0;
Delay10us(1);
SDA=1;
Delay10us(1);
// 第九个时钟信号
SCL=1;
Delay10us(1);
SCL=0;// 非应答信号SDA要为1
Delay10us(1);
}
// 原理:产生应答信号时
// 会将SDA在第九个时钟周期置为低电平
// 等待接收这个信号
u8 wait_for_ack()
{
u8 time=0;
SCL=1;
Delay10us(1);
while(SDA)
{
time++;
if(time>100)
{
IIC_stop();//超时,执行停止命令
return 1;
}
}
SCL=0;
return 0;//有应答返回0
}
void IIC_write_byte(u8 dat)
{
u8 i=0;
SCL=0;
// 传输数据时必须保持SCL为低电平
// 不然会被误认为传输的是命令
for(i=0;i<8;i++)
{
if((dat&0x80)>0)//判断第一位数据是否为1
SDA=1;
else
SDA=0;
dat<<=1;
Delay10us(1);
SCL=1;//产生一个周期
Delay10us(1);
SCL=0;
Delay10us(1);
}
}
u8 IIC_read_byte(u8 ack)
{
u8 i=0,rec=0;
for(i=0;i<8;i++)
{
SCL=0;
Delay10us(1);
SCL=1;// 产生一个时钟周期
Delay10us(1);
rec<<=1;
if(SDA)
rec |= 0x01;
Delay10us(1);
}
if(ack)
IIC_ack();
else
IIC_nack();
return rec;
}
没有合适的资源?快使用搜索试试~ 我知道了~
C51读取EEPROM(AT24C02)的二进制数据在数码管显示
共35个文件
obj:6个
lst:6个
c:6个
需积分: 0 0 下载量 57 浏览量
2024-05-16
22:30:12
上传
评论
收藏 107KB ZIP 举报
温馨提示
C51读取EEPROM(AT24C02)的二进制数据在数码管显示
资源推荐
资源详情
资源评论
收起资源包目录
检测EEPROM内部数据(面包板实验成功).zip (35个子文件)
User
main.c 527B
理论成功.PWI 885B
App
SMG
smg.h 325B
smg.c 663B
IIC
iic.h 264B
iic.c 2KB
MATRIX_KEY
matrix_key.h 120B
matrix_key.c 1KB
EEPROM
eeprom.h 144B
eeprom.c 706B
Objects
public.obj 2KB
jiance 21KB
matrix_key.obj 3KB
jiance.build_log.htm 1KB
smg.obj 4KB
jiance.lnp 216B
iic.obj 7KB
main.obj 4KB
eeprom.obj 5KB
jiance.hex 3KB
理论成功.DSN 104KB
jiance.uvopt 7KB
Listings
matrix_key.lst 3KB
eeprom.lst 2KB
main.lst 2KB
jiance.m51 20KB
smg.lst 2KB
iic.lst 6KB
public.lst 1KB
jiance.uvproj 15KB
Public
public.h 309B
public.c 189B
Last Loaded 理论成功.DBK 97KB
jiance.uvgui.yurii 93KB
Backup Of 理论成功.DBK 106KB
共 35 条
- 1
资源评论
suyc_suyuchen
- 粉丝: 8
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- ACM(Association for Computing Machinery,计算机协会)相关的资源.txt
- 个能够从 YouTube 上抓取信息的 Python 网络爬虫,你可以使用 Python 的 Requests 库来进行网络请求
- 学生管理系统示例代码.rar
- music search and download. - 全网音乐搜索和下载
- Maven项目管理分析实列教程.txt
- VBA代码实现excel自动导出到PPT
- 硬件开发常用工具以及案列加基础知识.rar
- 用C语言写的一个直接插入排序
- 八大排序算法(手撕):冒泡排序、选择排序、插入排序、基数排序、堆排序、希尔排序、快速排序(单排)、归并排序
- 这是直接插入排序的代码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功