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,一经查实,立即删除!

相关文章

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

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

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…

HDU 2845 Beans

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

ASP.NET MVC IOC 之AutoFac攻略

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

apache cxf_Apache CXF负载平衡和故障转移

apache cxf不久前&#xff0c;我们已经面临了基于Apache CXF的负载平衡Web服务客户端的需求。 此外&#xff0c;当某些服务器关闭时&#xff0c;客户端应自动进行故障转移。 更糟糕的是&#xff0c;服务器目标地址列表要从外部服务获取并在运行时更新。 最终&#xff0c;我们最…

HDU 1874 最直接的最短路径问题

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1874 Problem Description某省自从实行了很多年的畅通工程计划后&#xff0c;终于修建了很多路。不过路多了也不好&#xff0c;每次要从一个城镇到另一个城镇时&#xff0c;都有许多种道路方案可以选择&#xf…

领域驱动设计模式设计与实践_在域驱动设计中使用状态模式

领域驱动设计模式设计与实践域驱动设计&#xff08;DDD&#xff09;是一种开发软件的方法&#xff0c;其中&#xff0c;通过将实现与核心业务概念的不断发展的模型相联系&#xff0c;解决了问题的复杂性。 该术语是由Eric Evans创造的&#xff0c;并且有一个DDD专用站点可以促进…

html 英文文字纵向排列,CSS几种简单方法实现文字竖向排版

1.一个句子的竖向排列如图&#xff1a;1.2. test.one {width: 20px;margin: 0 auto;line-height: 24px;font-size: 20px;}.two {width: 15px;margin: 0 auto;line-height: 24px;font-size: 20px;word-wrap: break-word;/*英文的时候需要加上这句&#xff0c;自动换行*/}我是竖列…

jstree 节点拖拽保存数据库

需要jstree具有拖拽功能需要在加载jstree时添加dnd插件&#xff0c;具体看代码&#xff1a; $(**).jstree({//plugins-各种jstree的插件引入&#xff0c;展示树的多样性 plugins : [ "dnd", "types", "wholerow" ], core : {"check_callbac…

自动添加html结束标志,HTML:包含或排除可选的结束标记?

MYYA我在这里添加一些链接来帮助您了解HTML的历史&#xff0c;以便您了解各种矛盾。这不是你的问题的答案&#xff0c;但在阅读这些各种摘要后你会知道更多。我们是怎么来到这里的&#xff1f; - 潜入HTML5网络历史HTML简史HTML的历史 - HTML WG WikiDive Into HTML5的一些摘录…

JAR清单类路径不仅适用于Java Application Launcher

自从我开始学习Java以来​​&#xff0c;我几乎已经知道&#xff0c; 清单文件中的Class-Path标头字段为可执行JAR &#xff08;具有由另一个称为Main-Class清单指定应用程序起点的 JAR&#xff09;指定相对运行时类路径。 一个同事最近碰到一个让我感到惊讶&#xff0c;因为它…

通过url,获取html内容,并解析,如何使用 JavaScript 解析 URL

在 Web 开发中&#xff0c;有许多情况需要解析 URL&#xff0c;这篇主要学习如何使用 URL 对象实现这一点。开始创建一个以下内容的 HTML 文件&#xff0c;并在浏览器中打开。JavaScript URL parsing// 激动人心的代码即将写在这里如果你想尝试本文中的任何内容&#xff0c;可以…

正确使用计算机说课稿,《计算机结构原理初步》说课稿

在教师招聘考试的过程中&#xff0c;高中信息说课稿的难度就在于如何处理理论与实践的关系&#xff0c;希望这篇《计算机结构原理初步》说课稿能给予你帮助。各位考官大家好!我是号考生&#xff0c;今天我说课的题目是《计算机结构原理初步》。现代教学理论认为&#xff0c;在教…

计算机2013知识,2013年全国计算机一级考试B基本知识点五

基础5单元格操作对已建立的工作表&#xff0c;根据需要可以编辑修改其中的数据首先要移动单元格指针到目的地或选定编辑对象&#xff0c;然后才能进行增、删、改操作。1.单元格指针的移动要编辑某单元格&#xff0c;必须把单元格指针移动到该单元格&#xff0c;使之成为当前单元…

smartgwt_高级SmartGWT教程,第1部分

smartgwt贾斯汀&#xff08;Justin&#xff09;&#xff0c;帕特&#xff08;Pat&#xff09;和我已经开始着手进行一个需要管理和管理用户界面的副项目。 在与SmartGWT和GWT共同工作了一段时间之后&#xff0c;我们决定使用SmartGWT创建接口。 我们非常喜欢视觉组件&#xff0…

计算机英语女人英语怎么说,英语时差:计算机和女人

00:0000:00微信扫码登陆&#xff0c;畅听全站所有音频&#xff01;(20秒后自动关闭)X关注后&#xff0c;点此关闭https://online2.tingclass.net/lesson/shi0529/10000/10183/67.mp3https://image.tingclass.net/statics/js/2012When you hear the term, "computer geek,&…

云计算系统是大规模计算机系统吗,云计算的系统架构及技术探析

云计算技术属于计算机技术的一种&#xff0c;是目前计算机技术中应用以及研究重点之一&#xff0c;那么云计算到底是什么呢&#xff1f;云计算是在并行处理&#xff0c;分析式处理等技术的基础上发展而来的新技术&#xff0c;可以有效的将计算机进行整合&#xff0c;建立新颖的…

Vue 封装echarts柱状图(Bar)组件

目的&#xff1a;减少重复代码&#xff0c;便于维护 显示效果 组件代码 <template><div class"ldw-data-content-box"><div class"ldw-chilren-box"><div class"title" v-if"title">{{ title }}</div>…

smartgwt_高级SmartGWT教程,第2部分

smartgwt这是我的教程的第二部分&#xff0c;有关使用SmartGWT快速进行UI开发。 在本教程的第一部分中 &#xff0c;我们创建了基本的界面布局并添加了一些基本组件。 现在是时候解决这个问题&#xff0c;并使用SmartGWT的真正功能了。 在继续之前&#xff0c;让我们记住到目前…

百年理工计算机专业课程,这两所国内的百年理工院校,实力强劲,都是国内顶尖实力...

2021年全国高考终于圆满落下了帷幕&#xff0c;但考生们即将要面临一件人生大事&#xff0c;那就是高考志愿填报&#xff0c;因此高考虽然结束&#xff0c;但考生们的压力仍然是不小&#xff0c;只有正确地填好高考志愿&#xff0c;确保自己能够被心仪的高校收录取&#xff0c;…