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

发布者:EnchantedBreeze最新更新时间:2022-08-02 来源: csdn关键字:单片机  硬件I2C 手机看文章 扫描二维码
随时随地手机看文章

一、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)

//切换到第四组I2C

temp |= (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)置 1

P_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);

}

关键字:单片机  硬件I2C 引用地址:STC8系列单片机硬件I2C使用教程(二)

上一篇:STC15F104W使用定时器0模拟串口
下一篇:STC8系列单片机硬件I2C使用教程(一)

推荐阅读最新更新时间:2024-11-04 14:09

介绍单片机上的几种按键输入实现方法
按键作为一种简单实用的输入设备已经应用于各种单片机应用系统中,称得上是无处不在。 但是在不同的实用场合下所使用的按键也是各不相同。现在就对几种经常用到的按键及其使用方法进行介绍。 一、传统按键: 传统按键是现在在各种电子设备中应用最为广泛的按键,可能它们的形状各有不 同,但其控制方法却大同小异,利用按键是否按下的IO 电平状态变化来对其进行识别。 1)直接按键 最简单的键盘就是把电平信号直接接到IO 上。在程序里面读取IO 电平状态,如 果读到相应的电平,则说明此IO 上所接的按键被按下。这种方法原理与控制方法都非 常简单,但造成了IO 资源的浪费。这种按键方式的示意图如下: 2)扫描按键矩阵 这种按键输入方式很巧妙地利
[单片机]
用现场电磁兼容性理论剖析单片机系统设计解析方案
单片机系统在军事、工业、民用产品中的应用越来越广。它将许多以往用硬件实现的功能由软件来完成,体积小巧、功能丰富、智能化程序度,但在可靠性方面也面临许多新问题。用现场电磁兼容性(EMC)理论剖析单片机系统设计中的某些传统观念,会发现许多误区,并且有些误区至今还在工程界广为存在。 1 误区之一:有了看门狗就不会死机 死机是指CPU的程序指针进入一个死循环,无法执行正常的程序流程。其外在表现常常是:正常功能丧失,按键无响应,显示凝固。单片机死机后,只有复全才能走出死循环,执行正常的程序流程。众所属知,克服死机的最有效手段是加看门狗(WatchDog)。 目前用得最广泛的看门狗实际上是一个特殊的定时器DogTimer。DogTime
[单片机]
用现场电磁兼容性理论剖析<font color='red'>单片机</font>系统设计解析方案
陈光祖:单片机是汽车电子业发展基石
单片机的电子学名称为微控制器(MCU),在当代单片机已成为汽车电子产业发展的基石。单片机并不是什么神秘的东西,它已广泛的存在于人们工作与生活方方面面,无时不刻的在接触与使用中,只不过它装在电器产品的内在空间,我们很少能看到,也意识不到而已。如我们的手机、电视、空调、微波器、洗衣机、音响、电热水器、汽车……等,都装有各种各样的单片机为核心的微型计算机或微处理器中,而且它的作用和地位越来越重要,难怪国内外信息专家说:现在我们正生活在单片机的花花世界中。 那么,什么是单片机?它实际上是一种特殊的,高级的芯片,它不像一般芯片那样,只能完成某一逻辑的功能,可以说它是非常微妙的脑型芯片。 单片机的作用是将微型计算机上
[单片机]
陈光祖:<font color='red'>单片机</font>是汽车电子业发展基石
基于MCU的智能漏水检测系统设计
  近年来,随着自动化技术及人们生活水平的提高,智能家居的概念被越来越多的人所接受。所谓智能家居,是以住宅为平台,利用综合布线技术、网络通信技术、安全防范技术、自动控制技术、音视频技术将家居生活有关的设施集成,构建高效的住宅设施与家庭日程事务的管理系统,提升家居安全性、便利性、舒适性、艺术性,并实现环保节能的居住环境。在智能家居系统中,智能防漏水系统是在家居安全里具有十分重要的作用。通常由于一时疏忽,如停水时忘关水龙头、下水不通畅、管道破损等意外原因所造成家居漏水,很多情况下事态严重,不仅是自家受损失,同一栋楼里的人也会同样受害。文中设计了一种家居智能防水系统,能自动检测选定区域的意外漏水,通过电磁阀及时切断水管,并伴随声光报警,
[嵌入式]
51单片机实现判断数据尾来接收一串数据的串口通用程序框架
一、使用proteus绘制简单的电路图,用于后续仿真 二、编写程序 /******************************************************************************************************************** ---- @Project: USART ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @CreationTime: 20200703 ---- @ModifiedTime: 20200710 ----
[单片机]
51<font color='red'>单片机</font>实现判断数据尾来接收一串数据的串口通用程序框架
基于双超声波接收头的防撞小车系统设计
  本文提出了一种基于单片机控制的超声波定位前方物体的监测控制系统。通过一左一右的双超声波接收头检测信号,送单片机进行数据计算处理,能够精确计算与障碍物的距离,同时判断该障碍物是否位于车辆行径的路线上。从而能保证车辆行驶中能准确避障。实验测试系统表明,该系统有效距离可达8m,测量精度可达0.05m,小车能自由避开前方障碍物,或遇到障碍物时紧急刹车停下,但不会因为障碍物在小车斜方向而误判停止。 1 引言   超声波传感器因其测量精度高、 响应快和价格低廉而得到了广泛应用,传统应用方式是1 个发射头对应1 个接收头 ,也有多个发射头对应1 个接收头。但我们在实际应用中发现,如果障碍物的面很大(如墙壁),超声波传感器可以用来准确测距,但
[嵌入式]
利用单片机+超声波控制舵机转向的制作
通过超声波感应,使舵机转向,(在此本人有个想法,可以通过舵机控制自来水开关。即间接的做成了一个小的智能设备) 材料: 51单片机开发板 杜邦线 舵机+超声波 3.7V电池两个 束缚带 胶水 冰淇淋棒 程序为大家献上! 让大家在学习单片机时可以拥有一种成就感! 制作出来的实物图如下: 单片机源程序如下: #include reg52.h #include stdio.h #include intrins.h #define uchar unsigned char #define uint unsigned int sbit Trig=P3^4; //控制端 sbit Echo=P3^5; //接收端 sb
[单片机]
利用<font color='red'>单片机</font>+超声波控制舵机转向的制作
基于VB6的PC机与多台单片机通信的应用
    在库房管理系统中,传统的方法是通过干湿度表、双金属式测量计等检测器材进行人工测量,然后对不符合温度、湿度等要求的库房进行通风、去湿、降温等工作。这种人工方式效率低、误差大,随机事件难以预料,使库房管理质量得不到很好的保证。本文所论述的系统是一个用于制药厂仓库的监控和管理系统,上位机(PC机)除负责对下位机(MCS—51单片机)进行监管和控制外,还用于采集下位机传送的数据进行数据库化管理,另外,上位机还可以对库房药品入库、出库、有效期、交易方式等信息进行管理,并可用实时曲线和报表的形式查询。下位机(MCS-51单片机。MCS-51单片机及其外围设备我们称之为库机)负责收集库房中温度、湿度、烟雾等信息并传给上位机。此系统可使办
[单片机]
基于VB6的PC机与多台<font color='red'>单片机</font>通信的应用
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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