[通用8051核FLASH系列] 【芯圣电子HC89S105A测评报告】+AT24C04

[复制链接]
1687|0
 楼主| 比神乐 发表于 2023-5-20 09:54 | 显示全部楼层 |阅读模式
本帖最后由 芯圣电子官方QQ 于 2023-7-19 16:45 编辑

今天搞了一下硬件I2C读写AT24C04.
SCL接P01,SDA接P00.
代码:
  1. #define ALLOCATE_EXTERN
  2. #include "HC89S105AC8.h"

  3. #define DEVICEADD 0xA0 //24C02器件地址
  4. #define SCL P0_1             //I2C时钟控制位
  5. #define SDA P0_0             //I2C数据传送位

  6. unsigned char temp1,temp2,temp3;   //用于存放读写数据

  7. void Delay_ms(unsigned int fui_i);                                                                                //延时函数
  8. void IIC_Send_Byte(unsigned char fuc_Add, unsigned char fuc_Dat); //IIC发送一个字节的数据
  9. unsigned char IIC_Read_Byte(unsigned char fuc_Add);                                        //IIC读取一个字节的数据

  10. /***************************************************************************************
  11.   * @实现效果        对24C02进行读写操作
  12. ***************************************************************************************/
  13. void main()
  14. {
  15. /************************************系统初始化****************************************/
  16.         CLKCON = 0x02;                           //选择内部高频RC为系统时钟,内部高频RC  Fosc=32MHz
  17.         CLKDIV = 0x02;                           //Fosc 2分频得到Fcpu,Fcpu=16MHz
  18.         
  19. /**********************************IIC配置初始化***************************************/        
  20.         P0M0 = P0M0 & 0xF0 | 0x0A;  //P00带上拉开漏输出
  21.         P0M0 = P0M0 & 0x0F | 0x80;  //P01推挽输出
  22.         SCL_MAP = 0x01;                           //SCL映射P01口
  23.         SDA_MAP = 0x00;                           //SDA映射P00口
  24.         IICCON = 0x40;                           //启动IIC模块
  25.         IIC_Send_Byte(0x00, 0x26);  //将fuc_Buf的数据写入地址0x00
  26.         Delay_ms(20);
  27.         IIC_Send_Byte(0x01, 0x69);  //将fuc_Buf的数据写入地址0x00
  28.         Delay_ms(20);
  29.         IIC_Send_Byte(0x02, 0x90);  //将fuc_Buf的数据写入地址0x00
  30.         Delay_ms(20);
  31.         temp1= IIC_Read_Byte(0x01);
  32.         temp2= IIC_Read_Byte(0x02);
  33.         temp3= IIC_Read_Byte(0x00);
  34.         while (1)
  35.         {
  36.         
  37.         }
  38. }

  39. /***************************************************************************************
  40.   * @说明          IIC发送一个字节的数据
  41.   *        @参数        fuc_Add:存储的地址
  42.   *                        fuc_Dat:存储的数据
  43.   * @返回值 无
  44.   * @注                无
  45. ***************************************************************************************/
  46. void IIC_Send_Byte(unsigned char fuc_Add, unsigned char fuc_Dat)
  47. {
  48.         IICCON &= ~0x08; //清除中断标志位

  49.         IICCON |= 0x20; //起始位发送起始信号

  50.         while ((!(IICCON & 0x08)) && (IICSTA != 0x08));
  51.         IICCON &= ~0x20;        //起始位停止起始信号
  52.         IICCON &= ~0x08;        //清除中断标志位
  53.         IICDAT = DEVICEADD; //写入器件地址
  54.         while (IICSTA != 0x18);
  55.         IICCON &= ~0x08;  //清除中断标志位
  56.         IICDAT = fuc_Add; //写入地址
  57.         while (IICSTA != 0x28);
  58.         IICCON &= ~0x08;  //清除中断标志位
  59.         IICDAT = fuc_Dat; //写入数据
  60.         while (IICSTA != 0x28);
  61.         IICCON &= ~0x08; //清除中断标志位
  62.         IICCON |= 0x10;         //停止位发送停止信号
  63. }

  64. /***************************************************************************************
  65.   * @说明          IIC读取一个字节的数据
  66.   *        @参数        fuc_Add:存储的地址
  67.   * @返回值 存储地址里面的数据
  68.   * @注                无
  69. ***************************************************************************************/
  70. unsigned char IIC_Read_Byte(unsigned char fuc_Add)
  71. {
  72.         unsigned char fuc_Dat;
  73.         IICCON &= ~0x08; //清除中断标志位
  74.         IICCON |= 0x20;         //起始位发送起始信号
  75.         while ((!(IICCON & 0x08)) && (IICSTA != 0x08));
  76.         IICCON &= ~0x20;        //起始位停止起始信号
  77.         IICCON &= ~0x08;        //清除中断标志位
  78.         IICDAT = DEVICEADD; //写入器件地址
  79.         while (IICSTA != 0x18);
  80.         IICCON &= ~0x08;  //清除中断标志位
  81.         IICDAT = fuc_Add; //写入读地址
  82.         while (IICSTA != 0x28);
  83.         IICCON &= ~0x08; //清除中断标志位

  84.         IICCON |= 0x20; //起始位发送起始信号
  85.         while ((!(IICCON & 0x08)) && (IICSTA != 0x08));
  86.         IICCON &= ~0x20;                   //起始位停止起始信号
  87.         IICCON &= ~0x08;                   //清除中断标志位
  88.         IICDAT = DEVICEADD | 0x01; //写入读指令
  89.         while (IICSTA != 0x40);
  90.         IICCON &= ~0x08; //清除中断标志位
  91.         while (IICSTA != 0x58);
  92.         fuc_Dat = IICDAT; //读入数据
  93.         IICCON &= ~0x08;  //清除中断标志位
  94.         IICCON |= 0x10;          //停止位发送停止信号

  95.         return fuc_Dat;
  96. }

  97. /***************************************************************************************
  98.   * @说明          延时函数
  99.   * @参数          fui_i : 延时时间
  100.   * @返回值 无
  101.   * @注         Fcpu = 16MHz,fui_i = 1时,延时时间约为1ms
  102. ***************************************************************************************/
  103. void Delay_ms(unsigned int fui_i)
  104. {
  105.         unsigned int fui_j;
  106.         for (; fui_i > 0; fui_i--)
  107.                 for (fui_j = 1596; fui_j > 0; fui_j--);
  108. }
效果图:
0.jpg
1.jpg
您需要登录后才可以回帖 登录 | 注册

本版积分规则

470

主题

3537

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部