52单片机iic读写c语言,如何52单片机的I2C读写24C08程序问题排查修改

37adf77e240b913c367f6d447d41c09b.gif ------波形在一楼

isoimg2130老师提供在单片机正常运行的程序:

#include "reg52.h"

#include  "intrins.h"

typedef unsigned char u8;

sbit SCL=P2^1;                                             //I2C  时钟

sbit SDA=P2^2;                                             //I2C  数据

void delay()                                                   //4微秒延时函数

{

_nop_();

_nop_();

_nop_();

_nop_();

}

void yanshi(unsigned int hm)                  //延时毫秒

{

unsigned int i;

do

{

i = 12000000 / 97560;

while(--i)        ;

}

while(--hm);

}

void Start_I2c()

{

SDA=1;                                                 //发送起始条件的数据信号

SCL=1;

delay();

SDA=0;                                                 //发送起始信号

delay();

SCL=0;                                               //钳住I2C总线,准备发送或接收数据

}

void Stop_I2c()

{

SCL=0;

SDA=0;                                              //发送结束条件的数据信号

delay();

SCL=1;                                              //结束条件建立时间大于4μs

SDA=1;                                                      //发送I2C总线结束信号

delay();

}

u8 I2c_wait_ack(void)                                  //等待应答信号到来         1,接收应答失败 0,接收应答成功

{

u8 Time=0;

SDA=1;                                        //准备接收应答位

_nop_();

SCL=1;

_nop_();

while(SDA)

{

Time++;

if(Time>250)

{

Stop_I2c();

return 1;                                 //无应答返回1

}

}

SCL=0;                                                        //时钟输出0

return 0;                                                   //有应答返回0

}

void  SendByte(u8  c)                                //字节数据发送函数

{

u8  BitCnt;                                                   //条件 一定要开启总线 保持SCL处于0状态 才能进行写入

for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位

{

SDA=c<

_nop_();

SCL=1;                               //置时钟线为高,通知被控器开始接收数据位

_nop_();

SCL=0;

_nop_();

}

}

void I2C_Ack(void)                                          //产生ACK应答

{

SCL=0;

delay();

SDA=1;

delay();

SDA=0;

delay();

SCL=1;

delay();

SCL=0;

delay();

SDA=1;

delay();

}

void I2C_NAck(void)                                           //不产生ACK应答

{

SCL=0;

delay();

SDA=1;

delay();

SCL=1;

delay();

SCL=0;

delay();

SDA=0;

delay();

}

u8 RcvByte(u8 ack)                                        //字节数据接收函数

{                                                                         //ack  1 发送应答  0 不发送应答

u8 retc=0,i;

SDA=1;

delay();

for(i=0;i<8;i++)

{

SCL=0;                          //置时钟线为低,准备接收数据位

delay();

SCL=1;                          //置时钟线为高使数据线上数据有效

_nop_();

retc<<=1;

if(SDA)retc++;                      //读数据位,接收的数据位放入retc中

_nop_();

}

if (!ack)

I2C_NAck();                                                //发送nACK

else

I2C_Ack();                                                 //发送ACK

return retc;

}

u8 AT24C_Rcvone(u8 Addr)                           //在AT24CXX指定地址读出一个数据

{

u8 temp=0;

Start_I2c();                                //启动总线

SendByte(0xa0);                             //发送写命令

I2c_wait_ack();                                           //等待应答

SendByte(Addr);                             //发送地址

I2c_wait_ack();                                           //等待应答

Start_I2c();                                //重新启动总线

SendByte(0xa1);                                       //设置为读操作

I2c_wait_ack();                                           //等待应答;

temp=RcvByte(0);                                           //读字节        非应答

Stop_I2c();                                 //结束总线

return temp;

}

void AT24C_Sendone(u8 Addr,u8 Data)        //在AT24CXX指定地址写入一个数据         此函数只限于 c02-c16

{

Start_I2c();                               //启动总线

SendByte(0xa0);                            //发送写命令

I2c_wait_ack();                                          //等待应答

SendByte(Addr);                            //发送地址

I2c_wait_ack();                                          //等待应答

SendByte(Data);                                          //发送字节数据

I2c_wait_ack();                                          //等待应答

Stop_I2c();                                //结束总线

yanshi(10);                                                  //如果是连续发送字节的时候这个延时很重要 否则将回传错

}

void main()

{

AT24C_Sendone(10,0xaa);

P1=AT24C_Rcvone(10);

while(1);

}

下面是书本示例运行没有读出数据led灯不亮:

I2C.H

#ifndef __I2C_H__   //文件名全部都大写,首尾各添加2个下划线”__”

#define __I2C_H__

#include

#define uchar unsigned char

sbit SDA=P2^0;  //24C02芯片SDA引脚位定义

sbit SCL=P2^2;         //24C02芯片SCL引脚位定义

void delay();              //分别对各函数声明

void start();

void stop();

void ack();

void nack();

void write_byte(uchar date);

uchar read_byte();

void write_at24c02(uchar address ,uchar date);

uchar read_at24c02(uchar address);

#endif

I2C.c

#include "i2c.h"  //包含i2c.h头文件,注意自建的头文件是用双引号

void delay()   //微秒级延时函数

{

;;  //用两个空语句实现短时间延时,当晶振为11.0592MHz时,约4~5微秒

}

void start() //起始信号

{

SDA=1;

SCL=1;

delay();

SDA=0;

delay();

}

void stop()        //终止信号

{

SDA=0;

SCL=1;

delay();

SDA=1;

delay();

}

void ack()        //应答信号

{

uchar i;

SCL=1;

delay();

while((SDA==1)&&i<250)i++;

SCL=0;

delay();

}

void nack()          //无应答信号

{

SCL=1;

delay();

SDA=1;

SCL=0;

delay();

}

void  write_byte(uchar date) //写入一个字节到I2C总线

{

uchar i,temp;

temp=date;

for(i=0;i<8;i++)

{

temp=temp<<1;

SCL=0;

delay();

SDA=CY;

delay();

SCL=1;

}

SCL=0;

delay();

SDA=1;

delay();

}

uchar read_byte() //从I2C读一个字节

{

uchar i,j,k;

SCL=0;

delay();

for(i=0;i<8;i++)

{

SCL=1;

delay();

j=SDA;

k=(k<<1)|j;

SCL=0;

delay();

}

return k;

}

void wrte_at2402(uchar address,uchar date)//at24c02按字节写入函数

{

start();

write_byte(0xa0);

ack();

write_byte(address);

ack();

write_byte(date);

ack();

stop();

}

uchar read_dat24c02(uchar address)        //对at24c02随机读函数

{

uchar date;

start();

write_byte(0xa0);

ack();

write_byte(address);

ack();

start();

write_byte(0xa1);

ack();

date=read_byte();

nack();

stop();

return date;

}

main.c

#include

#include"I2C.h"

#include

void delay_10ms()

{

uchar a,b;

for(a=50;a>0;a--)

for(b=200;b>0;b--) ;

}

void main()

{

start();

write_at24c02(10,0xaa);

delay_10ms();

P1=read_at24c02(10);

while(1);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359696.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么用c语言写一个贪吃蛇,刚学C语言,想写一个贪吃蛇的代码

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include#include#includetypedef struct snake{int a;int b;struct snake *u;struct snake *n;}snake,*snake1;typedef struct food{int a;int b;}food;void main(){char c,c0 d;int i,j,k,n1,t,at;snake p,q;snake *dd,…

题目1065:输出梯形 (直接用循环控制输出)+题目1432:叠筐 (数组控制形状,最后输出数组)...

题目1065&#xff1a;输出梯形 &#xff08;直接用循环控制输出&#xff09; 样例输入&#xff1a; 4 样例输出&#xff1a; ****************** ********** 题目1432&#xff1a;叠筐 样例输入&#xff1a; …

毕业设计C语言网吧管理系统,毕业设计网吧管理系统.doc

毕业设计网吧管理系统.doc本科生毕业论文(设计)题目&#xff1a; 网吧管理系统――服务器子系统学 院 数学与计算机学院学科门类 理 科专 业 信息与计算科学学 号 024092553姓 名 陈绍指导教师 白云2007年5月25日网吧管理系统——服务器子系统摘 要随着上个世纪九十年代计算机网…

sql注入查找注入点_基本的EJB参考,注入和查找

sql注入查找注入点在本系列的第一部分中 &#xff0c;我们介绍了Enterprise JavaBeans v。3.0规范提供的机制&#xff0c;用于定义EJB组件&#xff0c;声明对EJB的引用并通过依赖项注入或程序化JNDI查找将它们连接起来。 在此博客文章中&#xff0c;我们将研究一些基本示例以了…

安徽省c语言选择题题库,C语言选择题题库.doc

C语言程序设计题库说明一 本题库适用对象计算机应用技术计算机软件软件技术计算机网络技术与计算机控制技术等专业二 本题库包含有175道选择题三 本题库所有题目均附有答案一、选择题下列各题ABCD四个选项中&#xff0c;只有一个选项是正确的&#xff0c;请将正确选项涂在答题卡…

求二叉树的最小深度

思路&#xff1a;用递归的方法求解。 输入&#xff1a;二叉树的根节点&#xff1b; 输出&#xff1a;二叉树的最小深度。 最小深度的定义&#xff1a;从根节点到叶子节点的最短路径上的节点数。 算法如下&#xff1a; 将二叉树分为这么几种情况&#xff1a; 传入的根节点为空&a…

qfp封装能够linux,QFP、PQFP、LQFP、TQFP封装形式及PCB详解

问题&#xff1a;画PCB时&#xff0c;会发现很多的集成电路都是QFP封装&#xff0c;比如很多的单片机都有这种封装。各个器件商会在自己的数据手册中说明他的器件是QFP&#xff0c;LQFP或TQFP&#xff0c;然后&#xff0c;有的给出封装尺寸图&#xff0c;有的则不给。那么&…

编写下载服务器。 第三部分:标头:内容长度和范围

这次&#xff0c;我们将探索更多的HTTP请求和响应标头&#xff0c;以改善下载服务器的实现&#xff1a; Content-length和Range 。 前者表示下载量很大&#xff0c;后者允许部分下载文件或在我们开始时失败后继续下载。 Content-length响应标头对于跟踪下载进度的客户端非常有…

dede文章列表加上序号效果

dede文章列表加上序号效果 css代码部分 <style type"text/css"> <!-- .downtop { FLOAT: left; OVERFLOW: hidden; WIDTH: 218px; HEIGHT: 278px } .downtop UL.text { MARGIN: 0px 10px; WIDTH: 198px; PADDING-TOP: 5px } .downtop UL.text LI { WIDTH: 1…

解答互联网创业中,你肯定会遇到的问题!

作为创过业&#xff0c;并且失败了的人&#xff0c;还是有那么一点点经验来回答这些问题的。1.我现在有个idea&#xff0c;上线之前如何在保证不被泄露的情况下又能了解这个idea对用户有多大吸引力&#xff1f;答&#xff1a;短时间内快速做出原型&#xff0c;找到10个左右的目…

android 垂直自动滚动条,Android实现Activity水平和垂直滚动条的方法

本文实例讲述了Android实现Activity水平和垂直滚动条的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;android:layout_width"match_parent"android:layout_height"match_parent"android:scrollbars"vertical" >android:layout_…

javadoc定义异常_Doclava:来自Google的自定义Javadoc Doclet

javadoc定义异常Doclava是Google的自定义Javadoc Doclet&#xff0c;由Google Guice使用&#xff08;请参见稍冷一些的Javadocs &#xff09;。 Doclava使用JSilver作为其模板引擎&#xff0c;这是Clearsilver的纯Java实现。 我个人喜欢联合文档的想法&#xff0c;该概念允许文…

HDU 2845 Beans

本来是很简单的一道题&#xff0c;却想了好长时间 由于数据量比较大&#xff0c;所以逐行读入&#xff0c;逐行处理 先处理每一行的不相邻元素和的最大值&#xff0c;记录在数组b中 最后计算不相邻行的和的最大值 二者的状态转移方程都类似&#xff1a;dp[j] max(dp[j - 1], d…

计算机由什么组成

对于一个不是计算机专业的编程人员&#xff0c;有很多东西要去学习&#xff0c;一直不理解计算机的组成和原理&#xff0c;今天查看百科&#xff0c;稍微了解一下写出来&#xff0c;让以后巩固&#xff1a; 1&#xff0c;计算机是由硬件系统和软件系统组成的 硬件系统&#xff…

android 重新启动应用程序,通过单击应用程序图标打开Android应用程序时重新启动...

我是Android开发世界的新手,我已经建立了一个简单的“Hello World”应用程序.首先,活动请求一个文本.当单击“Go”按钮时,应用程序将启动显示输入文本的第二个活动.如果我单击HOME按钮,然后单击应用程序图标,该应用程序将再次启动第一个活动,但是如果我按住主屏幕按钮并单击“最…

继承,is,as,多态

继承中的构造方法&#xff1a;1、创建子类对象时&#xff0c;一定会先创建父类对象2、如果调用的子类构造方法没有使用base&#xff0c;就会自动调用父类无参的构造方法&#xff0c; 如果父类没有无参的构造方法就会报错3、如果调用的子类构造方法使用了base&#xff0c;就会…

太古鸿蒙诀正式版v1.07,百变队长安崎:台上小辣椒,台下情歌王

在舞台上魅力四射的THE9队长安崎&#xff0c;在台下却是喜欢唱情歌的软萌girl。这样的安崎你爱了么&#xff1f;反差萌王者安崎作为队长&#xff0c;在舞台上的表现一直都是“炸裂”、“辣”、“性感”、“野性”&#xff0c;而舞台之下的安崎则一直呈现的是可爱、甜美&#xf…

erlang 架构原理_Erlang与Java内存架构

erlang 架构原理我读了一篇关于Erlang VM的内存管理策略的非常非常有趣的文章。 它是Jesper Wilhelmsson撰写的论文 &#xff0c;我认为讨论Erlang的内存设置和Oracle的Java VM之间的差异可能会很好。 作为对从未听说过Erlang的人们的一个简短的介绍; 它是一种功能语言&#xf…

ASP.NET MVC IOC 之AutoFac攻略

一、为什么使用AutoFac&#xff1f; 之前介绍了Unity和Ninject两个IOC容器&#xff0c;但是发现园子里用AutoFac的貌似更为普遍&#xff0c;于是捯饬了两天&#xff0c;发现这个东东确实是个高大上的IOC容器~ Autofac是.NET领域最为流行的IOC框架之一&#xff0c;传说是速度最快…

android对话框跳转页面,android应用Dialog跳转到Activity

Java基础-四要素之一《多态》什么是多态 指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式.(发送消息就是函数调用) 多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的 ...java进制转换器 图形用户界面 十进…