• 51单片机-AT24C02(I2C总线)


    目录

    一,介绍及元件工作原理

    7.时序结构(重要)

    8.i2C总线数据帧(重要)

    二,应用


    一,介绍及元件工作原理

    1.元件介绍

    2.存储器

    3.地址总线和数据总线

    地址总线只能一次选中一行

    4.引脚及应用电路

    5.I2C总线

    6.电路规范

    7.时序结构(重要)

    8.i2C总线数据帧(重要)

     9.AT24C02数据帧

    二,应用

    通过独立按键控制,独立按键K1使数值加一,

    独立按键K2使数值减一,独立按键K3写入数据,独立按键K4读出数据

    首先是要根据I2C的时序逻辑写对应的实现函数

    1. #include <REGX52.H>
    2. sbit I2C_SCL=P2^1;
    3. sbit I2C_SDA=P2^0;
    4. /**
    5. * @brief I2C开始
    6. * @param 无
    7. * @retval 无
    8. */
    9. void I2C_Start(void)
    10. {
    11. I2C_SDA=1;
    12. I2C_SCL=1;
    13. I2C_SDA=0;
    14. I2C_SCL=0;
    15. }
    16. /**
    17. * @brief I2C停止
    18. * @param 无
    19. * @retval 无
    20. */
    21. void I2C_Stop(void)
    22. {
    23. I2C_SDA=0;
    24. I2C_SCL=1;
    25. I2C_SDA=1;
    26. }
    27. /**
    28. * @brief I2C发送一个字节
    29. * @param Byte 要发送的字节
    30. * @retval 无
    31. */
    32. void I2C_SendByte(unsigned char Byte)
    33. {
    34. unsigned char i;
    35. for(i=0;i<8;i++)
    36. {
    37. I2C_SDA=Byte&(0x80>>i);
    38. I2C_SCL=1;
    39. I2C_SCL=0;
    40. }
    41. }
    42. /**
    43. * @brief I2C接收一个字节
    44. * @param 无
    45. * @retval 接收到的一个字节数据
    46. */
    47. unsigned char I2C_ReceiveByte(void)
    48. {
    49. unsigned char i,Byte=0x00;
    50. I2C_SDA=1;
    51. for(i=0;i<8;i++)
    52. {
    53. I2C_SCL=1;
    54. if(I2C_SDA){Byte|=(0x80>>i);}
    55. I2C_SCL=0;
    56. }
    57. return Byte;
    58. }
    59. /**
    60. * @brief I2C发送应答
    61. * @param AckBit 应答位,0为应答,1为非应答
    62. * @retval 无
    63. */
    64. void I2C_SendAck(unsigned char AckBit)
    65. {
    66. I2C_SDA=AckBit;
    67. I2C_SCL=1;
    68. I2C_SCL=0;
    69. }
    70. /**
    71. * @brief I2C接收应答位
    72. * @param 无
    73. * @retval 接收到的应答位,0为应答,1为非应答
    74. */
    75. unsigned char I2C_ReceiveAck(void)
    76. {
    77. unsigned char AckBit;
    78. I2C_SDA=1;
    79. I2C_SCL=1;
    80. AckBit=I2C_SDA;
    81. I2C_SCL=0;
    82. return AckBit;
    83. }

    其次在AT24C02中调用I2C的函数,并结合AT24C02自己的时序结构写函数

    1. #include <REGX52.H>
    2. #include "I2C.h"
    3. #define AT24C02_ADDRESS 0xA0
    4. /**
    5. * @brief AT24C02写入一个字节
    6. * @param WordAddress 要写入字节的地址
    7. * @param Data 要写入的数据
    8. * @retval 无
    9. */
    10. void AT24C02_WriteByte(unsigned char WordAddress,Data)
    11. {
    12. I2C_Start();
    13. I2C_SendByte(AT24C02_ADDRESS);
    14. I2C_ReceiveAck();
    15. I2C_SendByte(WordAddress);
    16. I2C_ReceiveAck();
    17. I2C_SendByte(Data);
    18. I2C_ReceiveAck();
    19. I2C_Stop();
    20. }
    21. /**
    22. * @brief AT24C02读取一个字节
    23. * @param WordAddress 要读出字节的地址
    24. * @retval 读出的数据
    25. */
    26. unsigned char AT24C02_ReadByte(unsigned char WordAddress)
    27. {
    28. unsigned char Data;
    29. I2C_Start();
    30. I2C_SendByte(AT24C02_ADDRESS);
    31. I2C_ReceiveAck();
    32. I2C_SendByte(WordAddress);
    33. I2C_ReceiveAck();
    34. I2C_Start();
    35. I2C_SendByte(AT24C02_ADDRESS|0x01);
    36. I2C_ReceiveAck();
    37. Data=I2C_ReceiveByte();
    38. I2C_SendAck(1);
    39. I2C_Stop();
    40. return Data;
    41. }

    最后在main函数中实现按键与LCD1602显示的逻辑

    1. #include <REGX52.H>
    2. #include "LCD1602.h"
    3. #include "Key.h"
    4. #include "AT24C02.h"
    5. #include "Delay.h"
    6. unsigned char KeyNum;
    7. unsigned int Num;
    8. void main()
    9. {
    10. LCD_Init();
    11. LCD_ShowNum(1,1,Num,5);
    12. while(1)
    13. {
    14. KeyNum=Key();
    15. if(KeyNum==1) //K1按键,Num自增
    16. {
    17. Num++;
    18. LCD_ShowNum(1,1,Num,5);
    19. }
    20. if(KeyNum==2) //K2按键,Num自减
    21. {
    22. Num--;
    23. LCD_ShowNum(1,1,Num,5);
    24. }
    25. if(KeyNum==3) //K3按键,向AT24C02写入数据
    26. {
    27. AT24C02_WriteByte(0,Num%256);
    28. Delay(5);
    29. AT24C02_WriteByte(1,Num/256);
    30. Delay(5);
    31. LCD_ShowString(2,1,"Write OK");
    32. Delay(1000);
    33. LCD_ShowString(2,1," ");
    34. }
    35. if(KeyNum==4) //K4按键,从AT24C02读取数据
    36. {
    37. Num=AT24C02_ReadByte(0);
    38. Num|=AT24C02_ReadByte(1)<<8;
    39. LCD_ShowNum(1,1,Num,5);
    40. LCD_ShowString(2,1,"Read OK ");
    41. Delay(1000);
    42. LCD_ShowString(2,1," ");
    43. }
    44. }
    45. }

    效果展示

    原理图

  • 相关阅读:
    T2T-ViT:更多的局部结构信息,更高效的主干网络 | ICCV 2021
    深入了解Python和OpenCV:图像的卡通风格化
    OSG笔记:osgText::Font搜索路径及开发中的应用
    基于微信小程序的美容院管理系统设计与实现-设计与实现-计算机毕业设计源码+LW文档
    二叉搜索树
    list模拟实现(15)
    SpringCloud集成Sleuth和Zipkin
    金仓数据库KingbaseES安全指南--10.数据脱敏
    【Python基础】2万字-详解Python基础函数,包教包会
    java-php-python-ssm手机测试管理系统计算机毕业设计
  • 原文地址:https://blog.csdn.net/m0_73890636/article/details/136720129