C51---12 AT24C02 (I2C总线)

发布者:悦耳旋律最新更新时间:2022-07-20 来源: csdn关键字:C51  AT24C02  I2C总线 手机看文章 扫描二维码
随时随地手机看文章

存储器介绍

在这里插入图片描述

存储器简化模型

在这里插入图片描述

AT24C02

在这里插入图片描述

引脚以及电路

在这里插入图片描述

内部结构框图

在这里插入图片描述

I2C总线

I2C总线介绍

在这里插入图片描述

I2C电路规范

在这里插入图片描述

I2C时序❗

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

I2C数据帧❗

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

AT24C02数据帧❗

在这里插入图片描述

在这里插入图片描述

AT24C02数据存储

功能

按键1 使数字+1

按键2 使数字-1

按键3 将数字写入AT24C02

按键4 读出AT24C02刚刚写入的数据


代码

main.c

#include

#include "LCD1602.h"

#include "Key.h"

#include "AT24C02.h"

#include "Delay.h"


unsigned char KeyNum;

unsigned int Num;


void main()

{

LCD_Init();

LCD_ShowNum(1,1,Num,5);

while(1)

{

KeyNum=Key();

if(KeyNum==1) //K1按键,Num自增

{

Num++;

LCD_ShowNum(1,1,Num,5);

}

if(KeyNum==2) //K2按键,Num自减

{

Num--;

LCD_ShowNum(1,1,Num,5);

}

if(KeyNum==3) //K3按键,向AT24C02写入数据

{

AT24C02_WriteByte(0,Num%256);

Delay(5);

AT24C02_WriteByte(1,Num/256);

Delay(5);

LCD_ShowString(2,1,"Write OK");

Delay(1000);

LCD_ShowString(2,1,"        ");

}

if(KeyNum==4) //K4按键,从AT24C02读取数据

{

Num=AT24C02_ReadByte(0);

Num|=AT24C02_ReadByte(1)<<8;

LCD_ShowNum(1,1,Num,5);

LCD_ShowString(2,1,"Read OK ");

Delay(1000);

LCD_ShowString(2,1,"        ");

}

}

}


I2C.c

#include


sbit I2C_SCL=P2^1;

sbit I2C_SDA=P2^0;


/**

  * @brief  I2C开始

  * @param  无

  * @retval 无

  */

void I2C_Start(void)

{

I2C_SDA=1;

I2C_SCL=1;

I2C_SDA=0;

I2C_SCL=0;

}


/**

  * @brief  I2C停止

  * @param  无

  * @retval 无

  */

void I2C_Stop(void)

{

I2C_SDA=0;

I2C_SCL=1;

I2C_SDA=1;

}


/**

  * @brief  I2C发送一个字节

  * @param  Byte 要发送的字节

  * @retval 无

  */

void I2C_SendByte(unsigned char Byte)

{

unsigned char i;

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

{

I2C_SDA=Byte&(0x80>>i);

I2C_SCL=1;

I2C_SCL=0;

}

}


/**

  * @brief  I2C接收一个字节

  * @param  无

  * @retval 接收到的一个字节数据

  */

unsigned char I2C_ReceiveByte(void)

{

unsigned char i,Byte=0x00;

I2C_SDA=1;

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

{

I2C_SCL=1;

if(I2C_SDA){Byte|=(0x80>>i);}

I2C_SCL=0;

}

return Byte;

}


/**

  * @brief  I2C发送应答

  * @param  AckBit 应答位,0为应答,1为非应答

  * @retval 无

  */

void I2C_SendAck(unsigned char AckBit)

{

I2C_SDA=AckBit;

I2C_SCL=1;

I2C_SCL=0;

}


/**

  * @brief  I2C接收应答位

  * @param  无

  * @retval 接收到的应答位,0为应答,1为非应答

  */

unsigned char I2C_ReceiveAck(void)

{

unsigned char AckBit;

I2C_SDA=1;

I2C_SCL=1;

AckBit=I2C_SDA;

I2C_SCL=0;

return AckBit;

}


#include

#include "I2C.h"


#define AT24C02_ADDRESS 0xA0


/**

  * @brief  AT24C02写入一个字节

  * @param  WordAddress 要写入字节的地址

  * @param  Data 要写入的数据

  * @retval 无

  */

void AT24C02_WriteByte(unsigned char WordAddress,Data)

{

I2C_Start();

I2C_SendByte(AT24C02_ADDRESS);

I2C_ReceiveAck();

I2C_SendByte(WordAddress);

I2C_ReceiveAck();

I2C_SendByte(Data);

I2C_ReceiveAck();

I2C_Stop();

}


/**

  * @brief  AT24C02读取一个字节

  * @param  WordAddress 要读出字节的地址

  * @retval 读出的数据

  */

unsigned char AT24C02_ReadByte(unsigned char WordAddress)

{

unsigned char Data;

I2C_Start();

I2C_SendByte(AT24C02_ADDRESS);

I2C_ReceiveAck();

I2C_SendByte(WordAddress);

I2C_ReceiveAck();

I2C_Start();

I2C_SendByte(AT24C02_ADDRESS|0x01);

I2C_ReceiveAck();

Data=I2C_ReceiveByte();

I2C_SendAck(1);

I2C_Stop();

return Data;

}


关键字:C51  AT24C02  I2C总线 引用地址:C51---12 AT24C02 (I2C总线)

上一篇:C51---13 DS18B20温度传感器
下一篇:C51---11 蜂鸣器

推荐阅读最新更新时间:2024-11-10 12:21

C51简单电子钟
/************************************************************************************************************** Seven Segment LED Clock COPYRIGHT (c) 2012 DESIGNED BY GARRY -- ALL RIGHTS RESERVED -- File Name: Seven Segment LED Clock.c Author: GARRY MENG Created: 201
[单片机]
<font color='red'>C51</font>简单电子钟
Keil C51汉字显示的bug问题
一、缘起 这两天改进MCU的液晶显示方法,采用 即编即显 的思路,编写了一个可以直接显示字符串的程序。如程序调用disstr( 我是你老爸 );液晶屏上就会显示 我是你老爸 。 二、问题 但是,花了1天多时间辛辛苦苦改好的程序后,却发现有些汉字显示有问题。比如: P1:在第一行显示 实时参数 ,第二行显示 工作状态 ,实际上 工作状态 却重复显示了,除了在正确的地方显示外,还在 实时参数 后显示了。 P2: 正 字后若有 : ,则都显示成乱码。如果后面没有 : ,则 正 字可正确显示,但是后面却显示了后面的一行字。 P3: 过 字总显示乱码; 三、求索 通过调试发现,上述汉字显示不正常的时候,是因为在字库中找不到匹配的汉字。可是
[单片机]
如何让Keil MDK兼容Keil C51
原来用51单片机,使用的是Keil C51 uVision V4.02;最近搞STM32,装了keilMDK uVision V4.23。 原来我是先装keilC51,后装keilMDK的,装在不同的目录里,装完之后不管是51工程还是stm32工程默认都会用keilMDK打开,这样打开51工程时会出错,所以要打开51的工程必须先打开keilC51程序,然后再程序里打开工程文件。 下面这个方法可以让keilMDK兼容51的工程,只要一个keil就都能编译51和stm32的工程了: 1、安装keilC51,并破解,安装目录 C:keilC51 2、安装keilMDK,并破解,安装目录 C:keilMDK 3、把 C:keilC
[单片机]
C51】源码 1 -- LED 脉冲宽度调制(PWM)调光
  最近迷上了单片机,借着大学的一点儿基础,开始自学 C51 单片机编程,跟着教程看完了发光二极管 LED 相关的编程,编写以下 LED PWM 调光程序作为总结。   先说一下 PWM 调光,PWM 就是 脉冲宽度调制 ,就是在一个固定周期内,改变高低电平的比例,使 LED 呈现不同的明暗程度。   博主编了一个比较简单的:在 CYCLE 个脉冲的周期内,低电平脉冲 PWM_LOW 的个数从 0 递增到 CYCLE,高电平脉冲的个数当然就会递减,这样 LED 就会呈现出 渐亮 的效果, 渐暗 与此同理。 附上源码:(初出茅庐,难免有写的不好的地方,仅作备份之用,欢迎指点,喷子退散 ) #include reg52.h
[单片机]
c51闹钟程序
左图正面凹陷下去的是三个菜单按钮,右图边上的usb接口是供程序下载的,内部为四节镍镉电池供电电压4.8v #include reg52.h #include intrins.h #define uchar unsigned char #define uint unsigned int uchar hou=0,min=0,sec=0,houc=0,minc=0,secc=0; uint m=0; bit yy=0; sbit khou=P1^1; sbit kmin=P1^0; sbit timesea=P1^2; sbit clock=P3^7; sbit clear=P3^6; sbit
[单片机]
C51: INT0
//P3.0 输出脉冲,用INT0 记录脉冲个数, //用P1输出脉冲个数 //外部连接:P3.0 与 INT0输入端P3.2 连接。 #include reg52.h sbit out=P3^0; void delay() { unsigned int i; for(i=0;i 20000;i++) ; } unsigned int counter=0; void main() { //INT0 设置 EA=1; //CPU 中断允许 EX0=1; //INT0 中断允许 IT0=1; //下降缘触发 // while(1) { out=1; delay(); delay(); out
[单片机]
I2C总线规范
  1.硬件组成:时钟线:SCL。数据线:SDA。 2.硬件要求:由于I2C的设备为OD(Open Drain,开漏),故在总线上需要加上拉电阻。5V电路中一般使用5.1K的上拉电阻,3.3V电路中可以使用4.7K的上拉电阻。 3.数据速率:100kbps,400kbps,3.4Mbps。 4.通信起始条件:SCL高电平时,SDA发生下降沿跳转。 5.通信终止条件:SCL高电平时,SDA发生上升沿跳转。 6.ACK:在一个字节发送完成后,如果需要ACK,则在第9个时钟周期,发送设备释放SDA,由接受设备控SDA产生低电平的ACK。 6.数据主→从正常传输:①主寻址从,发送地址和写
[嵌入式]
Keil C51开发系统基本知识2
3. 第三节 存储模式 存储模式决定了没有明确指定存储类型的变量,函数参数等的缺省存储区域,共三种: 1. 1. Small模式 所有缺省变量参数均装入内部RAM,优点是访问速度快,缺点是空间有限,只适用于小程序。 2. 2. Compact模式 所有缺省变量均位于外部RAM区的一页(256Bytes),具体哪一页可由P2口指定,在STARTUP.A51文件中说明,也可用pdata指定,优点是空间较Small为宽裕速度较Small慢,较large要快,是一种中间状态。 3. 3. large模式 所有缺省变量可放在多达64KB的外部RAM区,优点是空间大,可存变量多,缺点是速度较慢。 提示:存储模式在C51编译器选项中选择。 4.
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved