硬件I2C(中断方式)以STC8F2K08S2单片机为例

  • 一、I2C相关的寄存器
  • 二、I2C中断相关的寄存器
    • ① I2C中断源
    • ② I2C中断允许位
    • ③ I2C中断标志位
  • 三、程序编写
    • ① 寄存器和相关宏定义
    • ② 硬件I2C中断服务程序
    • ③ 硬件I2C初始化
    • ④ 硬件I2C操作代码
    • ⑤ BMP085 读写例程
    • ⑥ 串口代码

一、I2C相关的寄存器

STC8系列单片机硬件I2C使用教程(一)

二、I2C中断相关的寄存器

① I2C中断源


② I2C中断允许位

③ I2C中断标志位


三、程序编写

① 寄存器和相关宏定义

sfr P_SW2 = 0xBA;           //外设端口切换寄存器 2#define I2CCFG     (*(unsigned char volatile xdata *)0xfe80)
#define I2CMSCR     (*(unsigned char volatile xdata *)0xfe81)
#define I2CMSST     (*(unsigned char volatile xdata *)0xfe82)
#define I2CTXD      (*(unsigned char volatile xdata *)0xfe86)
#define I2CRXD      (*(unsigned char volatile xdata *)0xfe87)bit i2c_busy;      //I2C工作状态sbit SDA = P3^3;
sbit SCL = P3^2;#ifndef uchar#define uchar unsigned char
#endif
#ifndef uint#define uint  unsigned int
#endif

② 硬件I2C中断服务程序

//I2C中断服务程序
void I2C_Isr() interrupt 24 using 1
{_push_(P_SW2);                 //intrins.h  压一个sfr入栈。栈:先进后出,后进先出P_SW2 |= 0x80;if(I2CMSST & 0x40){I2CMSST &= ~0x40;            //清中断标志i2c_busy = 0;}_pop_(P_SW2);                 //intrins.h  一个sfr出栈。栈:先进后出,后进先出
}

③ 硬件I2C初始化

void init_i2c(void)
{uchar temp = 0x00;                            //                                      //切换到第一组I2C
//  temp &= ~(I2C_S0 | I2C_S1);            //I2C_S0=0 I2C_S1=0
//                                      //(P1.5/SCL, P1.4/SDA)//                                        //切换到第二组I2C
//  temp &= ~(I2C_S0 | I2C_S1);            //I2C_S0=1 I2C_S1=0
//  temp |= I2C_S0;                        //(P2.5/SCL, P2.4/SDA)//                                        //切换到第三组I2C
//  temp &= ~(I2C_S0 | I2C_S1);            //I2C_S0=0 I2C_S1=1
//  temp |= I2C_S1;                        //(P7.7/SCL, P7.6/SDA)//切换到第四组I2Ctemp |= (I2C_S0 | I2C_S1);            //I2C_S0=1 I2C_S1=1//(P3.2/SCL, P3.3/SDA)temp |= EAXFR;                      //I2C功能寄存器为扩展 SFR,逻辑地址位于 XDATA 区域,访问前需要将 P_SW2(BAH)寄存器的最高位(EAXFR)置 1P_SW2 = temp;I2CCFG = 0xE0;                    //使能I2C主机模式I2CMSST = 0x00;
}

④ 硬件I2C操作代码

void start()
{i2c_busy = 1;I2CMSCR = 0x81;                             //发送START命令while(i2c_busy);
}void send_data(uchar dat)
{I2CTXD = dat;                               //写数据到数据缓冲区i2c_busy = 1;I2CMSCR = 0x82;                             //发送SEND命令while(i2c_busy);
}void recv_ack()
{i2c_busy = 1;I2CMSCR = 0x83;                             //发送读ACK命令while(i2c_busy);
}uchar recv_data()
{i2c_busy = 1;I2CMSCR = 0x84;                             //发送RECV命令while(i2c_busy);return I2CRXD;
}void send_ack()
{I2CMSST = 0x00;                             //设置ACK信号i2c_busy = 1;I2CMSCR = 0x85;                             //发送ACK命令while(i2c_busy);
}void send_nack()
{I2CMSST = 0x01;                             //设置NAK信号i2c_busy = 1;I2CMSCR = 0x85;                             //发送ACK命令while(i2c_busy);
}void stop()
{i2c_busy = 1;I2CMSCR = 0x86;                             //发送STOP命令while(i2c_busy);
}

⑤ BMP085 读写例程

STC8系列单片机硬件I2C使用教程(一)

⑥ 串口代码

STC8系列单片机硬件I2C使用教程(一)

STC8系列单片机硬件I2C使用教程(二)相关推荐

  1. STC8系列单片机硬件I2C使用教程(一)

    硬件I2C(查询方式)以STC8F2K08S2单片机为例 一.I2C相关的寄存器 ① I2C 配置寄存器 ② I2C 主机控制寄存器 ③ I2C 主机辅助控制寄存器 ④ I2C 主机状态寄存器 ⑤ I ...

  2. #STC8A8K# #STC8F1K# #STC8G1K# #STC8H1K# ——STC8系列单片机整体评价

    成就更好的自己 声明:这不是广告,只是发表看法和吐槽,不吹不擂: 本文以STC8A8K64S4A12为例,简要分析一下STC8系列: STC(宏晶科技)公司作为国内的一家MCU生产公司,专注于8051 ...

  3. STM32F 单片机硬件I2C Busy标志导致的I2C卡死的处理办法

    STM32F 单片机硬件I2C Busy标志导致的I2C卡死的处理办法 在调试多用户表的时候,发现如果人为短接I2C的SDA或SLK脚后,I2C的SR2的Busy标志将会置1,并且试了很多种办法也无法 ...

  4. STM32单片机硬件I2C读取AHT10温湿度传感器数据

    STM32使用硬件IIC读取AHT10温湿度传感器的数据并显示在0.96寸OLED屏上. 我用的单片机是STM32F103C8T6,程序用的是ST标准库写的. STM32使用硬件I2C读取SHTC3温 ...

  5. STM32单片机硬件I2C驱动程序(查询方式)

    本文章原始地址:http://feotech.com/?p=69 本程序主要用于驱动STM32单片机芯片的硬件I2C寄存器,实现通过使用芯片自带的I2C寄存器进行数据的发送与接收. 本例程中采用I2C ...

  6. STM32单片机硬件I2C驱动程序(软件轮询方式)---摘自:FeoTech

    感谢原作者:FeoTech   原文网址:http://feotech.com/?p=69 本程序主要用于驱动STM32单片机芯片的硬件I2C寄存器,实现通过使用芯片自带的I2C寄存器进行数据的发送与 ...

  7. ​HC32L130/HC32L136华大单片机硬件I2C驱动代码(从机为存储芯片EEPROM(AT24C02,FM24CL64B))​

    由于同事嫌弃模拟I2C速度太慢了 所以想改成硬件I2C 我试过例程的驱动代码 不太行 存储地址也是8位的 所以参考了一些博文 修改了下例程的代码 亲测有效 希望能帮到大家 代码如下 这里用的是I2C0 ...

  8. 瑞萨单片机-硬件I2C从设备

    开发环境 1.e2 studio 2.R5F1115AxFL 概述 1.网上关于I2C从机的资料很少,在这里分享下我在瑞萨单片机上实现I2C从机,根据主机发来的数据,从机返回或者保存数据 2.R5F1 ...

  9. 【VSCode PlatformIO】STC8系列SDCC专用头文件内容分享

    [VSCode PlatformIO]STC8单片机开发专用头文件内容分享 相关篇<[VSCode PlatformIO]STC15单片机开发专用头文件内容分享> 如果使用VSCode P ...

最新文章

  1. 阿里云rds for mysql平台介绍_阿里云RDS for MySQL实例创建账号和数据库?
  2. 脱壳 VMProtect 1.70.4
  3. Linux环境下MySQL基础命令(3)----增、删、改、查语句
  4. luogu 3806
  5. 大牛书单 | 读懂5G,改变社会
  6. python列表用来有序存放一组_python入门第二课------列表
  7. 如何在 Mac 上切换语言
  8. 使用VSTS为ASP.NET Core构建DevOps CI/CD管道
  9. 基于C++的顺序表的实现
  10. pta c语言期末上机考试题库,PTA 程序设计 判断题-期末复习
  11. C#使用Aforge对uvc协议摄像头亮度属性的更改
  12. QT 报 QMetaObject::connectSlotsByName: No matching signal for on_btn_clicked()
  13. 9:参数校验-Java Spring
  14. alpha在matlab中啥意思,alpha是什么
  15. Linux环境变量PSI指什么,psi是什么单位?
  16. 4、基础理论-平衡软件项目的质量与时间、范围、成本
  17. 列表的join方法,类方法formkeys,删除,集合,深浅拷贝赋值,冒泡排序
  18. 用python完成选股策略a股_Python 金融: 0亏损选股策略
  19. 模,原码,补码,反码
  20. 宝塔解压文件,通过SSH命令解压缩.tar.gz、.gz、.zip文件的方法

热门文章

  1. Signif. codes所代表的含义?
  2. 0.5mm的焊锡丝能吃多大电流_你知道该怎样计算多大的功率该用多大的电线电缆?...
  3. 计算机连不上网络了怎么办,电脑连不上网,手把手教你电脑连不上网怎么办
  4. Transformer正余弦位置编码理解
  5. Python案例笔记 | 用python群发邮件
  6. node.js基于JavaScript语言新兴框架
  7. jQuery基础04
  8. FatMouse‘ Trade(贪心算法)
  9. 【2020年高被引学者】 朱军 清华大学
  10. P1294 高手去散步