• C语言 union 共用体,IIC通信,24C02存储数据


    1. #ifndef __IIC_H__
    2. #define __IIC_H__
    3. #include "reg51.h"
    4. #define u8 unsigned char
    5. #define u16 unsigned int
    6. extern void IIC_Delay(u16 x);
    7. extern void IIC_Start();
    8. extern void IIC_Stop ();
    9. extern void IIC_SendByte(u8 dat);
    10. extern u8 IIC_WaitACK ();
    11. extern u8 IIC_ReciveByte();
    12. extern void IIC_SendACK();
    13. extern void IIC_SendNoACK ();
    14. #endif

    1. #include "IIC.h"
    2. sbit IIC_SCL = P1^4;
    3. sbit IIC_SDA = P1^3;
    4. /**
    5. * 1010 000 1 -->0xA1 read
    6. * 1010 000 0 -->0xA0 write
    7. */
    8. void IIC_Delay(u16 x) {
    9. while(x--);
    10. }
    11. void IIC_Start() {//产生IIC启动时序
    12. IIC_SCL = 1;
    13. IIC_SDA = 1;
    14. IIC_Delay(4);
    15. IIC_SDA = 0;
    16. IIC_Delay(4);
    17. IIC_SCL = 0;
    18. }
    19. void IIC_Stop () {//产生IIC停止时序
    20. IIC_SCL = 0;
    21. IIC_Delay(4);
    22. IIC_SDA = 0;
    23. IIC_Delay(4);
    24. IIC_SCL = 1;
    25. IIC_Delay(4);
    26. IIC_SDA = 1;
    27. }
    28. void IIC_SendByte(u8 dat) {
    29. u8 i;
    30. for(i=0;i<8;i++) {
    31. IIC_SCL = 0;
    32. if(dat>>7) {
    33. IIC_SDA = 1;
    34. } else {
    35. IIC_SDA = 0;
    36. }
    37. IIC_SCL = 1;
    38. dat<<=1;
    39. }
    40. }
    41. u8 IIC_WaitACK () {
    42. u16 t=0;
    43. IIC_SCL = 0;
    44. IIC_SDA = 1;
    45. IIC_SCL = 1;
    46. while(IIC_SDA) { //等待从机拉低SDA
    47. if(t++>=10000) {
    48. return 1;//等待应答失败
    49. }
    50. }
    51. IIC_SCL = 0;
    52. return 0;//等待应该成功
    53. }
    54. u8 IIC_ReciveByte() {
    55. u8 d,i;
    56. for(i=0;i<8;i++) {
    57. d<<=1;
    58. IIC_SCL = 1;
    59. if(IIC_SDA) {
    60. d++;//d|=0x01;
    61. }
    62. IIC_SCL = 0;
    63. }
    64. return d;
    65. }
    66. void IIC_SendACK () { //主机发送收到数据确认应答
    67. IIC_SCL = 0;
    68. IIC_SDA = 0;
    69. IIC_SDA = 1;
    70. IIC_SCL = 1;
    71. }
    72. void IIC_SendNoACK () { //主机发送收到数据确认非应答
    73. IIC_SCL = 0;
    74. IIC_SDA = 0;
    75. IIC_SDA = 1;
    76. }

    1. #ifndef __24C02_H__
    2. #define __24C02_H__
    3. #include "iic.h"
    4. extern void Write_24c02(u8 add, u8 dat);
    5. extern u8 Read_24c02(u8 add);
    6. extern void Save_u16(u8 add, u16 n);
    7. extern u16 Read_u16(add);
    8. extern void Save_Float(u8 add, float n);
    9. extern float Read_Float(add);
    10. #endif
    1. #include "24c02.h"
    2. typedef union {
    3. float t;
    4. u8 s[4];
    5. } fltcom; //定义一个共用体
    6. void Write_24c02(u8 add, u8 dat) {//将dat 写入到24c02的add地址
    7. u8 st;
    8. IIC_Start();
    9. IIC_SendByte(0xA0);//1010 000 0
    10. st = IIC_WaitACK();
    11. if(st != 0) {//等待应答失败,故障提示
    12. return;
    13. }
    14. IIC_SendByte(add);
    15. IIC_WaitACK();
    16. IIC_SendByte(dat);
    17. IIC_WaitACK();
    18. IIC_Stop();
    19. //IIC_Delay(20000); //10ms 需要等10ms
    20. do {
    21. IIC_Start();
    22. IIC_SendByte(0xA0);
    23. st = IIC_WaitACK();
    24. } while(st == 1);
    25. }
    26. u8 Read_24c02(u8 add) { //读取24c02的数据
    27. u8 dat, st;
    28. IIC_Start();
    29. IIC_SendByte(0xA0);
    30. st = IIC_WaitACK();
    31. if(st != 0) {//错误提示
    32. }
    33. IIC_SendByte(add);
    34. IIC_WaitACK();
    35. IIC_Start();
    36. IIC_SendByte(0xA1);
    37. IIC_WaitACK();
    38. dat = IIC_ReciveByte();
    39. IIC_SendNoACK();
    40. IIC_Stop();
    41. return dat;
    42. }
    43. void Save_u16(u8 add, u16 n) {
    44. Write_24c02(add, n/256);
    45. Write_24c02(add+1, n%256);
    46. }
    47. u16 Read_u16(add) {
    48. u16 d;
    49. d = Read_24c02(add);
    50. d <<=8;
    51. d |= Read_24c02(add+1);
    52. return d;
    53. }
    54. void Save_Float(u8 add, float n) {
    55. fltcom a;
    56. a.t = n; //将数据写入
    57. Write_24c02(add++, a.s[0]);// 每字节存储写入的数据
    58. Write_24c02(add++, a.s[1]);
    59. Write_24c02(add++, a.s[2]);
    60. Write_24c02(add, a.s[3]);
    61. }
    62. float Read_Float(add) {
    63. fltcom a;
    64. //将字节的数据读取到共用体数组中
    65. a.s[0] = Read_u16(add++);
    66. a.s[1] = Read_u16(add++);
    67. a.s[2] = Read_u16(add++);
    68. a.s[3] = Read_u16(add);
    69. return a.t;//返回共用体float t;
    70. }

  • 相关阅读:
    Nvm 安装
    【redis】7.6 安装与配置Redis - (docker-compose)
    Vue.js 修饰符:精准控制组件行为
    “为了买台手机,研究大半个月后仍然无从选择”
    @RequestMapping 用法详解
    C++ 命名类型转换
    【计算机操作系统慕课版】第一章知识点总结
    串口数据包收发
    [附源码]Python计算机毕业设计Django基于微信小程序的网络办公系统
    变量、运算符、表达式、输入与输出
  • 原文地址:https://blog.csdn.net/weixin_36878452/article/details/126325584