欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    教学课件单片机创新开发教程ch17 使用I2C总线.pptx

    • 资源ID:77609911       资源大小:3.78MB        全文页数:46页
    • 资源格式: PPTX        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    教学课件单片机创新开发教程ch17 使用I2C总线.pptx

    教材配套PPT正版可修改课件教学课件单片机创新开发教程ch17 使用I2C总线单片机创新开发教程-基于STC8吴险峰第17章 使用I2C总线I2C总线是外围器件常用的接口格式。可以同时挂载多个设备,节省单片机IO资源。本章通过典型的I2C器件来演示I2C应用。1.情境导入2.学习目标3.相关知识4.项目设计5.项目实现6.知识拓展7.强化练习17.1情境导入小白:“上次说单片机和外围器件通信,除了UART,还有I2C模式,能否介绍一下?”小牛:“I2C是外围器件常用的接口格式之一,只需要两根线就可以挂载多个设备,非常方便。I2C总线协议相对复杂,但通过图形模块封装,大大降低了编程难度。”小白:“嗯,我先学会如何使用I2C,再进一步了解协议内容”。17.2 学习目标【知识目标】1.学习I2C的理论知识。2.了解常用寄存器。3.掌握硬件I2C和软件I2C的区别。【能力目标】1.能使用I2C接口OLED屏。2.能使用I2C接口RTC模块。3.进行I2C图形化编程。17.3 相关知识l17.3.1.I2C简介l17.3.2.硬件I2Cl17.3.3.软件I2Cl17.3.4.图形化指令l17.3.5.I2C和UART区别l17.3.6.RTC实时时钟l17.3.7.OLED显示模块l17.3.8.QMA7981加速度模块17.3 相关知识17.3.1.I2C简介内部集成电路(Inter-IntegratedCircuit,I2C,IIC)总线是由飞利浦(Philips)公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。I2C总线包含SCL时钟线和SDA数据线。由于只有一根数据线,I2C只能进行半双工通信。如图17-1所示,总线通过线与方式连接多个器件。主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件。在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件。然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下,主机负责产生定时时钟和终止数据 传 送。协 议 规 定 了 4个 双 向 传 输 速 率:100kbit/s、400kbit/s、1Mbit/s、3.4Mbit/s,分别对应标准、快速、快速+、高速模式。如果是单向传输,对应超快速模式可以达到5Mbit/s。1.整体架构17.3 相关知识17.3.1.I2C简介I2C总线包含SCL时钟线和SDA数据线。由于只有一根数据线,I2C只能进行半双工通信。如图17-1所示,总线通过线与方式连接多个器件。主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件。在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。当SCL为高电平的时候,SDA线上由高到低的跳变被定义为起始信号S;当SCL为高电平的时候,SDA线上由低到高的跳变被定义为结束信号P。总线在起始信号之后才传输有效信号,在结束信号之后被视为空闲状态。如图17-2所示。2.起始和结束条件17.3 相关知识17.3.1.I2C简介发送起始信号后传送的第一字节数据非常重要,这就是I2C器件的地址码。地址码是由种类型号,及寻址码组成的,共7位。因此理论上I2C可以接入127个设备(加上单片机主机,一共27=128个)。器件地址格式如表17-1所示。3.地址码(1)器件类型:B7-B4共4位。这是由飞利浦已经定义好了标准,也就是说这4位已是固定的。比如存储器件1010,A/D器件1001,显示器件0111等。(2)用户自定义地址码:B3-B1共3位。这是由用户自己设置的,通常的做法如EEPROM这些器件是由外部IC的3个引脚所组合电平决定的(用常用的名字如A0,A1,A2)。这也就是寻址码。因此同一型号的IC只能最多共挂8片同种类芯片。(3)最低一位B0就是R/W读写位。当主控器对器件进行读操作时为1,进行写操作时为0。总线操作时,由器件地址、引脚地址和读写位组成的从地址为主控器发送的第一字节。I2C总线地址码B7B6B5B4B3B2B1B017.3 相关知识17.3.1.I2C简介I2C总线数据传送时,每传送一个字节数据后都必须有应答信号Ack。主控器接收数据时,如果要结束通信时,将在停止位之前发送非应答信号。每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据。从机应答主机所需要的时钟仍是主机提供的,应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期,低电平0表示应答,高电平1表示非应答。4.应答信号Ack在总线的一次数据传输过程中可以有以下几种格式(深色背景表示主机控制SDA,白色表示从机),如图17-3所示。5.数据帧格式(a)主机向从机发送数据(b)主机由从机读取数据(c)主机读/写方式改变17.3 相关知识17.3.2.硬件I2CSTC8系列的单片机内部集成了一个I2C串行总线控制器。对于SCL和SDA的端口分配,STC8系列的单片机提供了切换模式,可将SCL和SDA切换到不同的I/O口上,以方便用户将一组I2C总线当作多组进行分时复用。STC8系列的I2C总线提供了两种操作模式:主机模式(SCL为输出口,发送同步时钟信号)和从机模式(SCL为输入口,接收同步时钟信号)。I2C的编程涉及9个寄存器,如表17-2所示,编程复杂。还好通过图形化模块编程,封装了相关寄存器设置。建议从实验入手,结合I2C数据帧格式,慢慢深入底层代码。图形化库默认使用P14、P15两个硬件I2C引脚,使用代码编程可以自定义选择引脚。17.3 相关知识17.3.2.硬件I2C符号描述位地址与符号B7B6B5B4B3B2B1B0I2CCFGI2C配置寄存器ENI2CMSSLMSSPEED5:0I2CMSCRI2C主机控制寄存器EMSI-MSCMD3:0I2CMSSTI2C主机状态寄存器MSBUSYMSIF-MSACKIMSACKOI2CSLCRI2C从机控制寄存器-ESTAIERXIETXIESTOI-SLRSTI2CSLSTI2C从机状态寄存器SLBUSYSTAIFRXIFTXIFSTOIFTXINGSLACKISLACKOI2CSLADRI2C从机地址寄存器I2CSLADR7:1MAI2CTXDI2C数据发送寄存器I2CRXDI2C数据接收寄存器I2CMSAUXI2C主机辅助控制寄存器-WDTA和UART串口涉及的寄存器相比,I2C的寄存器设置要复杂一些。17.3 相关知识17.3.3.软件I2C在单片机没有硬件I2C时,可以通过软件模拟I2C,用两个GPIO口来控制SDA和SCL两条线的电平状态,来产生信号,如起始信号、停止信号等,严格遵循I2C总线协议来实现通信。软件I2C性能不如硬件I2C,无法提供高速,并占用CPU资源。实际上经典51等老款单片机都是采用软件模拟I2C。17.3 相关知识17.3.4.图形化指令常用指令图形化指令实例1.I2C总线初始化2.I2C读数据3.I2C写数据I2C的图形化指令如表17-3所示,目前只支持主机模式。17.3 相关知识17.3.5.I2C和UART区别两者主要区别如下。1.通信线路。都是两根线。UART一根发送一根接收,可以全双工通信。I2C接口也是两根线,一个时钟线,一个数据线,不能同时收发,只能半双工通信。2.通信对象。UART是一对一,I2C可以一对多。3.通信距离。UART不需要同步时钟,所以距离更远,通常单片机和电脑连接都是UART模式。而I2C距离短,一般就是在电路板内部器件之间。4.通信速度。UART速度较低,而且随着距离增加,传输速率下降。I2C速度较高,还有高速模式。鉴于I2C可以一对多通信的优势,目前采用I2C接口的外设也非常普遍。结合本章任务介绍一下常用的外设RTC和OLED模块。17.3 相关知识17.3.6.RTC实时时钟BM8563是一款低功耗CMOS实时时钟/日历芯片,它提供一个可编程的时钟输出,一个中断输出和一个掉电检测器,所有的地址和数据都通过I2C总线接口串行传递。最大总线速度为400kbits/s,每次读写数据后,内嵌的字地址寄存器会自动递增。其图形化指令如表17-4所示。常用指令图形化指令实例1.RTC初始化2.RTC读取数据3.RTC读取时间选取,可选择年、月、日、周、时、分、秒4.RTC设置时间和日期17.3 相关知识17.3.7.OLED显示模块BM8563是一款低功耗CMOS实时时钟/日历芯片,它提供一个可编程的时钟输出,一个中断输出和一个掉电检测器,所有的地址和数据都通过I2C总线接口串行传递。最大总线速度为400kbits/s,每次读写数据后,内嵌的字地址寄存器会自动递增。其图形化指令如表17-4所示。常用指令图形化指令实例1.初始化OLED2.OLED关闭显示3.OLED更新显示4.OLED清屏5.OLED在坐标X,Y显示一个像素点6.OLED在坐标X,Y清除像素点7.OLED在坐标X,Y显示一个字符8.OLED在坐标X,Y显示一个字符串9.OLED在坐标X,Y显示一个数值10.OLED在坐标X,Y显示一个指定字体大小的汉字11.OLED在一个范围内显示图片17.3 相关知识17.3.8.QMA7981加速度模块QMA7981是一个单芯片三轴加速度传感器,14-BitADC采样精度,内置常用运动算法,提供标准I2C/SPI接口,支持低功耗模式,广泛应用与手机、运动手表等设备。图形化指令如表17-6所示。常用指令图形化指令实例1.QMA7981初始化。2.QMA7981刷新数据3.QMA7981读X/Y/Z轴加速度4.QMA7981获取步数5.QMA7981启用运动检测算法中断6.QMA7981读中断7.QMA7981判断中断类型17.4 项目设计RTC模块如图17-4所示。I2C的时钟脚连P1_5,数据脚连P1_4。OLEDQ和MA7981模块如图17-5所示。都采用相同的I2C总线,时钟脚连P1_5,数据脚连P1_4。17.4 项目设计任务1用OLED显示屏显示#includeuint32sys_clk=24000000;/设置PWM、定时器、串口、EEPROM频率参数#includelib/twen_board.h#includelib/oled.h#includelib/delay.hvoidsetup()twen_board_init();/天问51初始化oled_init();/OLED初始化voidloop()oled_clear();/OLED清屏oled_show_font12(天问,40,0);oled_show_num(64,3,51);oled_show_string(0,15,0.91OLEDTEST);oled_display();/OLED更新显示delay(1000);oled_clear();/OLED清屏oled_show_string(32,3,TWen-51);oled_show_string(0,15,0.91OLEDTEST);oled_display();/OLED更新显示delay(1000);17.4 项目设计任务1用OLED显示屏显示#include#includedelay.h#includehardiic.h#include#include#includeoledfont.h#include#defineOLED_ADDR0 x78/写地址#defineOLED_CMD0/写命令#defineOLED_DATA1/写数据#defineOLED_MODE0#defineOLED_MAX_COLUMN128#defineOLED_MAX_ROW32staticuint8xdata_oled_disbuffer1284;显然显示函数都进行了封装,我们打开oled.h,对主要函数进行分析。voidoled_init();/初始化OLEDvoidoled_display_off();/关闭OLED显示voidoled_display_on();/开启OLED显示voidoled_display();/缓存显示voidoled_clear();/清屏voidoled_set_pixel(uint8x,uint8y,uint8pixel);/在指定位置显示一个点/X个像素点,y行voidoled_show_char(int8x,int8y,uint8chr);/在指定位置显示一个字符字符高8,宽5voidoled_show_string(int8x,int8y,uint8*chr);/在指定位置显示字符串字符高8,间距8voidoled_show_num(int8x,int8y,int16num);/在指定位置显示数字字符高8,间距8voidoled_show_float(int8x,int8y,floatnum,uint8precision);/在指定位置显示小数voidoled_show_font12(uint8lenth,constuint8*hz,intx,inty);/在指定位置显示12x12汉字voidoled_show_font16(uint8lenth,constuint8*hz,intx,inty);/在指定位置显示16x16汉字voidoled_show_font24(uint8lenth,constuint8*hz,intx,inty);/在指定位置显示24x24汉字voidoled_show_font32(uint8lenth,constuint8*hz,intx,inty);/在指定位置显示32x32汉字voidoled_fill(uint8x0,uint8y0,uint8x1,uint8y1,uint8pixel);/填充voidoled_show_line(uint8x0,uint8y0,uint8x1,uint8y1,uint8pixel);/绘制线段voidoled_show_rectangle(uint8x0,uint8y0,uint8x1,uint8y1,uint8pixel);/绘制矩形框voidoled_fill_rectangle(uint8x0,uint8y0,uint8x1,uint8y1,uint8pixel);/填充矩形voidoled_show_circle(int16xc,int8yc,int8r,uint8pixel,uint8fill);/绘制圆voidoled_show_triangel(uint8x0,uint8y0,uint8x1,uint8y1,uint8x2,uint8y2,uint8pixel);/绘制三角形voidoled_fill_triangel(uint8x0,uint8y0,uint8x1,uint8y1,uint8x2,uint8y2,uint8pixel);/填充三角形voidoled_show_bmp(uint8x0,uint8y0,uint8x1,uint8y1,uint8*BMP);/显示BMP图片#include hardiic.h说明OLED库包含了硬件I2C库,#include oledfont.h说明包含了OLED字符库。OLED的从机地址为啥是0 x78(0b01111000),因为Philip定义的I2C中,显 示 器 件 I2C地 址 是(01111XXX),而最后一位是0表示写地址。17.4 项目设计任务1用OLED显示屏显示#ifndef_HARDIIC_H#define_HARDIIC_H#include#includedelay.h#defineHARDIIC_IICX0 x80/将IIC设置为P1_5,P1_4#defineHARDIIC_SCL_OUTP1M1|=0 x20;P1M0|=0 x20;/开漏输出#defineHARDIIC_SDA_OUTP1M1|=0 x10;P1M0|=0 x10;/开漏输出voidhardiic_init();voidhardiic_read_nbyte(uint8device_addr,uint8reg_addr,uint8*p,uint8number);voidhardiic_write_nbyte(uint8device_addr,uint8reg_addr,uint8*p,uint8number);/=/描述:等待以及清除中断标志位./参数:none./返回:none./=voidhardiic_wait()while(!(I2CMSST&0 x40);I2CMSST&=0 x40;/=/描述:IIC初始化./参数:none./返回:none./=voidhardiic_init()HARDIIC_SCL_OUT;/开漏输出HARDIIC_SDA_OUT;/开漏输出P_SW2|=HARDIIC_IICX;/外设端口切换控制寄存器I2CCFG=0 xe0;/使能IIC主机模式I2CMSST=0 x00;/IIC主机状态寄存器清零由于OLED的库函数调用了硬件I2C库,我们打开hardiic.h继续分析。17.4 项目设计任务1用OLED显示屏显示/=/描述:IIC发送start信号./参数:none./返回:none./=voidhardiic_start()I2CMSCR=0 x01;/发送START命令hardiic_wait();/=/描述:IIC发送stop信号./参数:none./返回:none./=voidhardiic_stop()I2CMSCR=0 x06;/发送stop命令hardiic_wait();/=/描述:IIC写n个字节数据./参数:设备地址(8位模式,7位地址需要左移一位),寄存器地址,缓存数据地址,数量/返回:none./=voidhardiic_write_nbyte(uint8device_addr,uint8reg_addr,uint8*p,uint8number)hardiic_start();/开始信号hardiic_send_byte(device_addr);/发送器件写地址hardiic_wait_ack();hardiic_send_byte(reg_addr);/发送寄存器地址hardiic_wait_ack();dohardiic_send_byte(*p+);/发送数据hardiic_wait_ack();while(-number);hardiic_stop();/发送停止命令#endif/hardiic经过层层追踪发现I2C的各类寄存器设置都封装在hardiic.h头文件里面了。大家结合前面的总线时序也很容易看懂代码,这里就不全面展开了。想继续深入的朋友可以结合STC8H数据手册做进一步学习。从这里我们也看出来图形化编程带来的便利,避免了底层寄存器相关设置内容。另外SCL和SDA端口初始化设置成了开漏输出,这一点强调一下。大部分输出如LED灯、数码管等等都是推挽输出,但是I2C因为会连接多个设备,需要实现“线与”功能,就要设置成开漏输出模式。17.4 项目设计任务2读取RTC时间数码管显示#includelib/pcf8563.hvoidpcf8563_init();/RTC初始化voidpcf8563_read_rtc(structpcf8563_Time*tim);/设置时间voidpcf8563_write_rtc(structpcf8563_Time*tim);/读取时间读取RTC时间数码管显示的图形化编程如图17-6所示。RTC读取时间,并使用数码管显示出来,可以自行设置时间。引入头文件。设置初始化时间。voidsetup()_mytime.year=2020;_mytime.month=12;_mytime.day=20;_mytime.hour=20;_mytime.minute=20;_mytime.second=20;pcf8563_write_rtc(&_mytime);/RTC设置时间17.4 项目设计任务2读取RTC时间数码管显示/=/描述:读取rtc数据./参数:none./返回:none./=voidpcf8563_read_rtc(structpcf8563_Time*tim)uint8tmp7;pcf8563_read_nbyte(2,tmp,7);tim-second=(tmp04)&0 x07)*10+(tmp0&0 x0f);/秒钟tim-minute=(tmp14)&0 x07)*10+(tmp1&0 x0f);/分钟tim-hour=(tmp24)&0 x03)*10+(tmp2&0 x0f);/小时tim-day=(tmp34)&0 x07)*10+(tmp3&0 x0f);/日tim-weekday=tmp4+1;/星期tim-month=(tmp54)&0 x07)*10+(tmp5&0 x0f);/月tim-year=2000+(tmp64)&0 x07)*10+(tmp6&0 x0f);/年主程序相对简单,为了进一步分析,我们打开pcf8563.h可以对RTC读取函数进行跟踪。17.4 项目设计任务2读取RTC时间数码管显示/=/描述:读取多个数据./参数:addr:读取的寄存器地址;p:读回来的数据;number:需要读的数据个数./返回:none./=voidpcf8563_read_nbyte(uint8addr,uint8*p,uint8number)hardiic_start();/开始信号hardiic_send_byte(PCF8563_ADDR_W);/发送器件写地址hardiic_wait_ack();hardiic_send_byte(addr);/发送寄存器地址hardiic_wait_ack();hardiic_start();/重复开始信号hardiic_send_byte(PCF8563_ADDR_W|0 x01);/发送器件读地址hardiic_wait_ack();do*p=hardiic_read_byte();p+;if(number!=1)hardiic_ack();while(-number);hardiic_nack();hardiic_stop();继续在pcf8563.h中跟踪pcf8563_read_nbyte()函数。到这里就基本明白了RTC的I2C调用模式。另外我们还知道了RTC对应设备地址。结合I2C协议内容,RTC器件属于存储器类,所以地址是0 xAX(1010 xxxx)。#define PCF8563_ADDR_W 0 xA2#define PCF8563_ADDR_R 0 xA3以上就是使用I2C总线的方法。17.4 项目设计任务3I2C读写RTC时间用硬件I2C模式读写RTC,直接读写0 xA2硬件地址。由于部分RTC读取函数没有封装,图形化代码太多略去。直接看主要C代码。主要加粗的函数部分。#defineHARDIIC_IICX0 x80/将IIC设置为P1_5,P1_4#defineHARDIIC_SCL_OUTP1M1|=0 x20;P1M0|=0 x20;/开漏输出#defineHARDIIC_SDA_OUTP1M1|=0 x10;P1M0|=0 x10;/开漏输出#defineNIXIETUBE_PORTP6#defineNIXIETUBE_PORT_MODEP6M1=0 x00;P6M0=0 xff;/推挽输出#defineNIXIETUBE_LEFT_COLON_PINP0_7/左侧数码管冒号#defineNIXIETUBE_LEFT_COLON_PIN_MODEP0M1&=0 x80;P0M0|=0 x80;/推挽输出#defineNIXIETUBE_RIGHT_COLON_PINP2_1/右侧数码管冒号#defineNIXIETUBE_RIGHT_COLON_PIN_MODEP2M1&=0 x02;P2M0|=0 x02;/推挽输出#includeuint32sys_clk=24000000;/设置PWM、定时器、串口、EEPROM频率参数#includelib/twen_board.h#includelib/hardiic.h#includelib/led8.h#includelib/nixietube.huint8B_1ms=0;uint16msecond=0;voidRTC_write_time(uint8hour,uint8minute,uint8second);uint8 RTC_read_hour();uint8 RTC_read_minute();uint8 RTC_read_second();uint8writebuf3=0,0,0;17.4 项目设计任务3I2C读写RTC时间voidTimer0Init(void)/1000微秒24.000MHzAUXR&=0 x7f;/定时器时钟12T模式TMOD&=0 xf0;/设置定时器模式TL0=0 x30;/设定定时初值TH0=0 xf8;/设定定时初值voidT_IRQ0(void)interrupt1using1B_1ms=1;voidRTC_write_time(uint8hour,uint8minute,uint8second)writebuf(int)(0)=(second/10)4)+second%10;writebuf(int)(1)=(minute/10)4)+minute%10;writebuf(int)(2)=(hour/10)4)&0 x03)*10+(buf(int)(0)&0 x0f);uint8 RTC_read_minute()hardiic_read_nbyte(0 xA2,0 x03,buf,1);/I2C读取n个字节数据 return(buf(int)(0)4)&0 x07)*10+(buf(int)(0)&0 x0f);uint8 RTC_read_second()hardiic_read_nbyte(0 xA2,0 x02,buf,1);/I2C读取n个字节数据 return(buf(int)(0)4)&0 x07)*10+(buf(int)(0)&0 x0f);17.4 项目设计任务3I2C读写RTC时间voidsetup()/*本案例程序说明*/本案例演示用硬件I2C模式读写RTC,直接读写0 xA2硬件地址/*/twen_board_init();/天问51初始化hardiic_init();led8_disable();/关闭8个LED流水灯电源nix_init();/数码管初始化hardiic_write_nbyte(0 xA2,0,writebuf,1);/I2C写入n个字节数据RTC_write_time(15,19,7);Timer0Init();EA=1;/控制总中断ET0=1;/控制定时器中断TR0=1;/定时器0开始计时voidloop()if(B_1ms=1)B_1ms=0;nix_scan_callback();/数码管扫描回调函数msecond=msecond+1;if(msecond=1000)msecond=0;nix_display_clear();/数码管清屏nix_display_time2(RTC_read_hour(),(RTC_read_minute(),(RTC_read_second();/数码管显示时间其实程序逻辑不复杂,I2C读取数据也清楚。但是读出的数据转换成时间需要设置函数。建议后面可以将其设置成图形化指令,这样图形化编程就更清晰了。17.4 项目设计任务4使用加速度传感器图形化编程其实很简单,底层程序复杂就不展开了。有兴趣的同学可以继续研究。设置QMA7981读取X/Y/Z的加速度值,并用数码管显示,其图形化编程如图17-7所示。17.5 项目实现17.5.1开发板功能演示开发板任务演示步骤的和前章基本类似,为避免重复略去。17.5 项目实现17.5.2.Proteus仿真实例1.仿真图仿真图(1)RTC传感器是传感器是PCF8563,其功能和任务,其功能和任务3的的BM8563相同,都是基于相同,都是基于I2C接口,地址都是接口,地址都是0 xA2。其仿真电路如图。其仿真电路如图17-8所示。所示。对比图对比图17-4,省略了,省略了VDD和和VSS几个引脚的接线,实际电路必须接上几个引脚的接线,实际电路必须接上。为了为了测试测试I2C总线,我们连接了总线,我们连接了I2C调试器(调试器(I2C DEBUGGER),),i2c调试器添加方法如图调试器添加方法如图17-9所示。在虚拟仪器列表中可所示。在虚拟仪器列表中可以找到以找到I2C调试器并添加到原理图窗口中。调试器并添加到原理图窗口中。由由于于硬硬件件I2C是是STC8新新的的功功能能。STC15是是没没有有硬硬件件I2C功功能能的的,无无法法提提供供硬硬件件I2C仿仿真真。但但是是I2C接接口口又又及及其其重重要要,而而天天问问Block也带了软件也带了软件I2C库函数。我们就以任务库函数。我们就以任务3为例,用软件为例,用软件I2C读写实时时钟进行仿真实验。读写实时时钟进行仿真实验。17.5 项目实现17.5.2.Proteus仿真实例2.编写代码编写代码(1)硬件)硬件I2C切换成软件切换成软件I2C将将任任务务3的的代代码码切切换换到到字字符符模模式式下下,然然后后将将里里面面的的“hard”全全部部替替换换成成“soft”。(可可以以用用天天问问Block自自带带的的“Crtl+F”快快捷键弹出查找替换窗口操作,如图捷键弹出查找替换窗口操作,如图17-10所示)。所示)。编译后没有错误,而且开发板运行正常。说明硬件编译后没有错误,而且开发板运行正常。说明硬件I2C库文件已经很方便的却换成了软件库文件已经很方便的却换成了软件I2C库文件。这也说明了天问库文件。这也说明了天问Block的库函数设计得非常好,可复用性强。的库函数设计得非常好,可复用性强。17.5 项目实现17.5.2.Proteus仿真实例新新程序的前面部分代码如下。程序的前面部分代码如下。#define softIIC_IICX 0 x80/将将IIC设置为设置为P1_5,P1_4#define softIIC_SCL_OUT P1M1|=0 x20;P1M0|=0 x20;/开漏输出开漏输出#define softIIC_SDA_OUT P1M1|=0 x10;P1M0|=0 x10;/开漏输出开漏输出#defineNIXIETUBE_PORTP6#defineNIXIETUBE_PORT_MODEP6M1=0 x00;P6M0=0 xff;/推挽输出#defineNIXIETUBE_LEFT_COLON_PINP0_7/左侧数码管冒号#defineNIXIETUBE_LEFT_COLON_PIN_MODEP0M1&=0 x80;P0M0|=0 x80;/推挽输出#defineNIXIETUBE_RIGHT_COLON_PINP2_1/右侧数码管冒号#defineNIXIETUBE_RIGHT_COLON_PIN_MODEP2M1&=0 x02;P2M0|=0 x02;/推挽输出#includeuint32sys_clk=24000000;/设置PWM、定时器、串口、EEPROM频率参数#includelib/twen_board.h#include lib/softiic.h#includelib/led8.h#includelib/nixietube.h17.5 项目实现17.5.2.Proteus仿真实例有有人人会会质质疑疑前前面面的的#define softIIC_IICX 代代码码是是否否有有问问题题,其其实实不不用用担担心心。因因为为这这些些都都在在软软件件I2C库库文文件件“softiic.h”中中定定义了,在主程序中也可以删除掉。以下是义了,在主程序中也可以删除掉。以下是“softiic.h”部分代码。部分代码。#ifndef_SOFTIIC_H#define_SOFTIIC_H#include#includedelay.h#ifndefSOFTIIC_SCL#defineSOFTIIC_SCLP1_5#endif#ifndefSOFTIIC_SCL_OUT#defineSOFTIIC_SCL_OUTP1M1|=0 x20;P1M0|=0 x20;/开漏输出#endif#ifndefSOFTIIC_SDA#defineSOFTIIC_SDAP1_4#endif#ifndefSOFTIIC_SDA_IN#defineSOFTIIC_SDA_INP1M1|=0 x10;P1M0&=0 x10;/INPUT高阻输入#endif#ifndefSOFTIIC_SDA_OUT#defineSOFTIIC_SDA_OUTP1M1|=0 x10;P1M0|=0 x10;/开漏输出#endifvoidsoftiic_init();/IIC初始化voidsoftiic_start();/IIC发送start信号voidsoftiic_stop();/IIC发送stop信号uint8softiic_wait_ack();/IIC等待ack信号voidsoftiic_ack();/IIC发送ack信号voidsoftiic_nack();/IIC发送NAck信号voidsoftiic_send_byte(uint8IIC_Byte);/IIC发送一个字节数据uint8softiic_read_byte();/IIC读取一个字节数据void softiic_read_nbyte(uint8 device_addr,uint8 reg_addr,uint8*p,uint8number);/IIC读取n个字节数据void softiic_write_nbyte(uint8 device_addr,uint8 reg_addr,uint8*p,uint8number);/IIC写n个字节数据可可以以看看出出,“softiic.h”其其内内容容和和“hardiic.h”接接口口相相同同,只只是是函函数数执执行行层层面面上上,软软件件I2C全全部部都都是是对对端端口口的的操操作作,而而硬硬件件I2C则则是是调用寄存器操作。调用寄存器操作。17.5 项目实现17.5.2.Proteus仿真实例(2)仿真测试)仿真测试仿仿真真运运行行虽虽然然有有数数码码管管显显示示,但但是是相相关关I2C调调试试器器表表明明PCF8563并并没没有有工工作作。如如图图17-11所所示示,I2C总总线线只只有有启启动动和和结结束束信信号,图中号,图中S表示启动,表示启动,P表示结束表示结束。(3)问题)问题分析分析为为了了进进一一步步分分析析结结果果,我我们们加加入入了了图图表表分分析析I2C时时序序。结结果果如如图图17-12所所示示。SCL一一直直都都是是高高位位,没没有有拉拉低低。SDA有有高高低低电电平变化。平变化。17.5 项目实现17.5.2.Proteus仿真实例(4)解决问题)解决问题首先分析首先分析softiic_init()函数。函数。显然现在显然现在SDA和和SCL都是高电平,符合实际波形都是高电平,符合实际波形。/=/描述:IIC初始化./参数:none./返回:none./=voidsoftiic_init()SOFTIIC_SCL_OUT;/开漏输出SOFTIIC_SDA_OUT;/开漏输出SOFTIIC_SDA=1;SOFTIIC_SCL=1;17.5 项目实现17.5.2.Proteus仿真实例下面我们再分析下面我们再分析softiic_start()。/=/描述:IIC发送start信号./参数:none./返回:n

    注意事项

    本文(教学课件单片机创新开发教程ch17 使用I2C总线.pptx)为本站会员(春哥&#****71;)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开