52单片机iic读写c语言,如何52单片机的I2C读写24C08程序问题排查修改
------波形在一楼
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程序问题排查修改相关推荐
- 单片机cant通讯 c语言,基于C8051F040单片机的CAN总线通信
硬件部分 硬件部分电路结构如下: CAN收发模块原本采用的是ATA6660高速CAN收发芯片,电路连接如下: 设计电路为:当单片机发送数据时,D18闪烁,并将数据传送给ATA6660芯片:当ATA66 ...
- 如何用c语言对51单片机进行编程,C语言在51单片机编程中的应用技巧
随着单片机硬件性能的提高,编写应用程序更着重于程序本身的效率. Franklin或KEII.C51交叉编译器是专为51系列单片机设计的一种高效的C语言编译器,用其开发的应用程序易于维护,可移植性好,是 ...
- 单片机技术与c语言编程教学大纲,单片机应用技术(C语言)教学大纲.doc
单片机应用技术(C语言)教学大纲 一.说明 1.课程的性质和内容 本课程是高级技校应用电子专业的专业课.主要内容包括:认识单片机,点亮彩灯,简易数字钟,简易计算器,键控彩灯,简易频率计,单片机双机通信 ...
- 怎么用C语言写程序控制单片机,如何用用C语言编写的单片机来控制流水灯
描述 用C语言编写的单片机流水灯程序的软件和硬件,可以让八个LED轮流点亮,每个灯点亮和熄灭时间均为1秒.是利用单片机I/O口控制外部设备的简单例子.当然,在你掌握了本程序后,完全可以充分发挥你的想象 ...
- 基于单片机的血压计c语言,基于AT89C51单片机的便携式数字血压计的设计
1. 引言 目前,由于不科学的饮食习惯以及不健康的生活习惯,导致人们容易患上各种疾病而高血压作为其中的一类疾病,己经严重威胁着现代人的健康.如何及早的检测高血压就成为人们抗击高血压的首要问题.目前的数 ...
- 51单片机 | 数字电路与C语言基础 | 51单片机最小系统
文章目录 一.数字电路基础 1.电平特性 2.二进制与十六进制 2.1 二进制 2.2 十六进制 3.二进制的逻辑运算 二.C语言基础语法 三.51单片机最小系统 1. 51 单片机最小系统构成 1. ...
- 单片机常用编程c语言单词列表,单片机C语言编程常用的运算符介绍
在单片机C语言编程中,通常用到30个运算符,如表1,其中算术运算符13个,关系运算符6个,逻辑运算符3个,位操作符7个,指针运算符1个. 在C语言中,运算符具有优先级和结合性. 算术运算符优先级规定为 ...
- 单片机二极管发光c语言,怎么利用单片机驱动发光二极管
描述 发光二极管简称为LED.由含镓(Ga).砷(As).磷(P).氮(N)等的化合物制成.当电子与空穴复合时能辐射出可见光,因而可以用来制成发光二极管.在电路及仪器中作为指示灯,或者组成文字或数字显 ...
- 基于单片机的密码锁c语言设计程序,基于单片机的电子密码锁及程序
<基于单片机的电子密码锁及程序>由会员分享,可在线阅读,更多相关<基于单片机的电子密码锁及程序(17页珍藏版)>请在人人文库网上搜索. 1.基于单片机的电子密码锁设计摘要随着科 ...
最新文章
- linux命令ping
- java awt区域_java的awt包中有没有表示区域的类或者方法,可以传递一个Rectangle
- 太极计算机ehr系统,(数据科学学习手札21)sklearn.datasets常用功能详解
- String引起的OutOfMemory异常 + 如何计算C#对象所占内存的大小
- ORACLE(Linux版本)实时同步数据到MYSQL(Windows版本)解决方案:OGG
- 大数据杀熟,是真的吗?
- 图书管理系统UML课程设计
- ab性能测试工具使用
- stm32使用查表法将utf8转gbk,编码表数组存放在外部flash中
- SI4463模块使用心得(无线协议)
- Android 安卓开发板 读取串口
- base64编码解码讲解
- 一文带你走进网络编程
- [Unity-经验]从购买云服务器到发布Unity WebGL项目
- 微信iBeaconID-微信官方iBeacon蓝牙基站UUID编码
- 记录JVM中Eden区、Survivor from区和Survivor to区及Minor GC和Major GC的理解
- 安装Cartopy报错 Proj4 version 0.0.0 is installed, but cartopy requir
- RDD(python
- 英语入门造句专用动词表(96个)
- 国家教育部公布14所高校开设“区块链工程”本科专业
热门文章
- 零空间,Markov‘s inequality, Chebyshev Chernoff Bound, Union Bound
- es6 遍历数组对象获取所有的id_ES6对象遍历Object.keys()方法
- 【MFC系列-第17天】企业信息管理软件开发
- 【6】C++语法与数据结构之STL_list学生管理系统_链表外排序_函数指针
- Java集合(7)--Map接口的实现类HashMap、LinkHashMap、TreeMap和Properties
- Android Studio 日志工具
- 共享文件夹不能访问的问题解决
- 软件测试实验1:为三角形问题编写一个Java程序,并用Junit测试程序
- [Noip模拟赛] Power
- python分割字符串输出_python字符串分割