------波形在一楼

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);

}

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

  1. 单片机cant通讯 c语言,基于C8051F040单片机的CAN总线通信

    硬件部分 硬件部分电路结构如下: CAN收发模块原本采用的是ATA6660高速CAN收发芯片,电路连接如下: 设计电路为:当单片机发送数据时,D18闪烁,并将数据传送给ATA6660芯片:当ATA66 ...

  2. 如何用c语言对51单片机进行编程,C语言在51单片机编程中的应用技巧

    随着单片机硬件性能的提高,编写应用程序更着重于程序本身的效率. Franklin或KEII.C51交叉编译器是专为51系列单片机设计的一种高效的C语言编译器,用其开发的应用程序易于维护,可移植性好,是 ...

  3. 单片机技术与c语言编程教学大纲,单片机应用技术(C语言)教学大纲.doc

    单片机应用技术(C语言)教学大纲 一.说明 1.课程的性质和内容 本课程是高级技校应用电子专业的专业课.主要内容包括:认识单片机,点亮彩灯,简易数字钟,简易计算器,键控彩灯,简易频率计,单片机双机通信 ...

  4. 怎么用C语言写程序控制单片机,如何用用C语言编写的单片机来控制流水灯

    描述 用C语言编写的单片机流水灯程序的软件和硬件,可以让八个LED轮流点亮,每个灯点亮和熄灭时间均为1秒.是利用单片机I/O口控制外部设备的简单例子.当然,在你掌握了本程序后,完全可以充分发挥你的想象 ...

  5. 基于单片机的血压计c语言,基于AT89C51单片机的便携式数字血压计的设计

    1. 引言 目前,由于不科学的饮食习惯以及不健康的生活习惯,导致人们容易患上各种疾病而高血压作为其中的一类疾病,己经严重威胁着现代人的健康.如何及早的检测高血压就成为人们抗击高血压的首要问题.目前的数 ...

  6. 51单片机 | 数字电路与C语言基础 | 51单片机最小系统

    文章目录 一.数字电路基础 1.电平特性 2.二进制与十六进制 2.1 二进制 2.2 十六进制 3.二进制的逻辑运算 二.C语言基础语法 三.51单片机最小系统 1. 51 单片机最小系统构成 1. ...

  7. 单片机常用编程c语言单词列表,单片机C语言编程常用的运算符介绍

    在单片机C语言编程中,通常用到30个运算符,如表1,其中算术运算符13个,关系运算符6个,逻辑运算符3个,位操作符7个,指针运算符1个. 在C语言中,运算符具有优先级和结合性. 算术运算符优先级规定为 ...

  8. 单片机二极管发光c语言,怎么利用单片机驱动发光二极管

    描述 发光二极管简称为LED.由含镓(Ga).砷(As).磷(P).氮(N)等的化合物制成.当电子与空穴复合时能辐射出可见光,因而可以用来制成发光二极管.在电路及仪器中作为指示灯,或者组成文字或数字显 ...

  9. 基于单片机的密码锁c语言设计程序,基于单片机的电子密码锁及程序

    <基于单片机的电子密码锁及程序>由会员分享,可在线阅读,更多相关<基于单片机的电子密码锁及程序(17页珍藏版)>请在人人文库网上搜索. 1.基于单片机的电子密码锁设计摘要随着科 ...

最新文章

  1. linux命令ping
  2. java awt区域_java的awt包中有没有表示区域的类或者方法,可以传递一个Rectangle
  3. 太极计算机ehr系统,(数据科学学习手札21)sklearn.datasets常用功能详解
  4. String引起的OutOfMemory异常 + 如何计算C#对象所占内存的大小
  5. ORACLE(Linux版本)实时同步数据到MYSQL(Windows版本)解决方案:OGG
  6. 大数据杀熟,是真的吗?
  7. 图书管理系统UML课程设计
  8. ab性能测试工具使用
  9. stm32使用查表法将utf8转gbk,编码表数组存放在外部flash中
  10. SI4463模块使用心得(无线协议)
  11. Android 安卓开发板 读取串口
  12. base64编码解码讲解
  13. 一文带你走进网络编程
  14. [Unity-经验]从购买云服务器到发布Unity WebGL项目
  15. 微信iBeaconID-微信官方iBeacon蓝牙基站UUID编码
  16. 记录JVM中Eden区、Survivor from区和Survivor to区及Minor GC和Major GC的理解
  17. 安装Cartopy报错 Proj4 version 0.0.0 is installed, but cartopy requir
  18. RDD(python
  19. 英语入门造句专用动词表(96个)
  20. 国家教育部公布14所高校开设“区块链工程”本科专业

热门文章

  1. 零空间,Markov‘s inequality, Chebyshev Chernoff Bound, Union Bound
  2. es6 遍历数组对象获取所有的id_ES6对象遍历Object.keys()方法
  3. 【MFC系列-第17天】企业信息管理软件开发
  4. 【6】C++语法与数据结构之STL_list学生管理系统_链表外排序_函数指针
  5. Java集合(7)--Map接口的实现类HashMap、LinkHashMap、TreeMap和Properties
  6. Android Studio 日志工具
  7. 共享文件夹不能访问的问题解决
  8. 软件测试实验1:为三角形问题编写一个Java程序,并用Junit测试程序
  9. [Noip模拟赛] Power
  10. python分割字符串输出_python字符串分割