单片机课程设设计单总线和I2C总线结合实现数(共30页).doc

上传人:飞****2 文档编号:6463206 上传时间:2022-02-03 格式:DOC 页数:30 大小:44KB
返回 下载 相关 举报
单片机课程设设计单总线和I2C总线结合实现数(共30页).doc_第1页
第1页 / 共30页
单片机课程设设计单总线和I2C总线结合实现数(共30页).doc_第2页
第2页 / 共30页
点击查看更多>>
资源描述

《单片机课程设设计单总线和I2C总线结合实现数(共30页).doc》由会员分享,可在线阅读,更多相关《单片机课程设设计单总线和I2C总线结合实现数(共30页).doc(30页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精选优质文档-倾情为你奉上单片机课程设计题目:单总线和I2C总线结合实现数字温度计实验班级:设计者:指导教师:单总线和I2C总线结合实现数字温度计实验一、实验目的通过本实验,理解掌握单总线器件和I2C总线器件的应用,熟悉串行总线的操作技巧。二、实验设备及器件IBM PC 机一台DP-51PROC 单片机综合仿真实验仪一台三、实验内容1.编写程序,通过单片机的P3.3 口控制一个DS18B20 完成数字温度的采集,然后用程序处理采集到的数据结果。2.编写程序,通过I2C 总线器件ZLG7290 实现温度数据的输出显示。3.结合以上两部分程序,编程实现数字式温度计的程序设计。四、实验要求熟练掌握单

2、总线方式器件的应用,熟悉I2C 总线协议,学习I2C 器件的使用方法。五、实验过程和步骤(一、新建工程文件1、点击工具栏Project选项,在下拉菜单中选择New Project命令,弹出项目文件保存对话框,输入项目名后,点击保存按钮。2、在工程建立完毕以后,uVision会弹出器件选择窗口,选择相应的器件型号。如想修改,可点击工具栏Project选项,在下拉菜单中选择Select Device for Target Target命令。3、点击工具栏File选项,选中New命令,新建文件,输入源程序。4、把文件保存到磁盘中,如用汇编语言编写程序用.asm为扩展名,如用C语言编写程序用.c 为扩

3、展名。5、添加该文件到工程中,在Projectwindos窗口内,选中Source Group1然后点击鼠标右键,选择Add files to Group “Source Group1”,选择刚才创建的源程序文件,单击Add按钮。(二、程序文件的编译、链接1. 安装B4 区JP12 接口上的短路帽,将B4 区的DQ 与A2 区INT1(P3.3相连。2. 安装D5 区JP1 接口上的短路帽,将D5 区的SDA、SCL 分别与A2 区的P17、P16 相连。3. 将D5 区的RST_L 针接上高电平。4.按照下面的程序在Keil C51集成开发环境中建立工程文件,并进行调试仿真。TEMPER_L

4、 EQU 36H ;存放读出温度低位数据TEMPER_H EQU 35H ;存放读出温度高位数据TEMPER_NUM EQU 37H ;存放转换后的温度值FLAG1 BIT 00HDQ BIT P3.3 ;一线总线控制端口SDA BIT P1.7 ;I2C总线定义SCL BIT P1.6MTD EQU 40H ;发送数据缓冲器MRD EQU 49H ;接收数据缓冲区;定义器件地址,变量ZLG7290 EQU 70H ;ZLG7290的器件地址ACK BIT 10H ;应答标志位SLA DA TA 50H ;器件的从地址SUBA DA TA 51H ;器件的子地址NUMBYTE DA TA 52

5、H ;读/写的字节数变量ORG 0000HLJMP MAINORG 0100H;-温度计主程序如下:MAIN:MOV SP,#70HDISP_LOOP:LCALL GET_TEMPER ;从DS18B20读出温度数据LCALL TEMPER_COV ;转换读出的温度数据并保存LCALL DELAYMOV MTD,#60HMOV MTD+1,TEMPER_NUM;温度值低位ANL MTD+1,#0FHMOV SLA,#ZLG7290 ;指定器件地址MOV SUBA,#07H ;指定子地址MOV NUMBYTE,#02H ;发送2字节数据LCALL IWRNBYTE ;调用写2字节数据程序MOV

6、MTD,#61HMOV A,TEMPER_NUMSWAP AANL A,#0FHMOV MTD+1,A ;温度值高位MOV SLA,#ZLG7290 ;指定器件地址MOV SUBA,#07H ;指定子地址MOV NUMBYTE,#02H ;发送2字节数据LCALL IWRNBYTE ;调用写2字节数据程序LCALL DELAYSJMP DISP_LOOP ;温度循环采集显示;-读出转换后的温度值GET_TEMPER:SETB DQ ; 定时入口BCD: LCALL INIT_1820JB FLAG1,S22LJMP BCD ; 若DS18B20不存在则返回S22: LCALL DELAY1MO

7、V A,#0CCH ; 跳过ROM匹配-0CCLCALL WRITE_1820MOV A,#44H ; 发出温度转换命令LCALL WRITE_1820NOPLCALL DELAYLCALL DELAYCBA: LCALL INIT_1820JB FLAG1,ABCLJMP CBAABC: LCALL DELAY1MOV A,#0CCH ; 跳过ROM匹配LCALL WRITE_1820MOV A,#0BEH ; 发出读温度命令LCALL WRITE_1820LCALL READ_18200 ;READ_1820RET;-读DS18B20的程序,从DS18B20中读出一个字节的数据READ_1

8、820:MOV R2,#8RE1: CLR CSETB DQNOPNOPCLR DQNOPNOPNOPSETB DQMOV R3,#7DJNZ R3,$MOV C,DQMOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE1RET;-写DS18B20的程序WRITE_1820:MOV R2,#8CLR CWR1820: CLR DQMOV R3,#6DJNZ R3,$RRC AMOV DQ,CMOV R3,#23DJNZ R3,$SETB DQNOPDJNZ R2,WR1820SETB DQRET;-读DS18B20的程序,从DS18B20中读出两个字节的温度数据READ_182

9、00:MOV R4,#2 ; 将温度高位和低位从DS18B20中读出MOV R1,#36H ; 低位存入36H(TEMPER_L,高位存入35H(TEMPER_H RE00: MOV R2,#8RE01: CLR CSETB DQNOPNOPCLR DQNOPNOPNOPSETB DQMOV R3,#7DJNZ R3,$MOV C,DQMOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE01MOV R1,ADEC R1DJNZ R4,RE00RET;-将从DS18B20中读出的温度数据进行转换TEMPER_COV:MOV A,#0F0HANL A,TEMPER_L ; 舍去温度

10、低位中小数点后的四位温度数值SWAP AMOV TEMPER_NUM,AMOV A,TEMPER_LJNB A CC.3,TEMPER_COV1 ; 四舍五入去温度值INC T EMPER_NUMTEMPER_COV1:MOV A,TEMPER_HANL A,#07HSWAP AADD A,TEMPER_NUMMOV TEMPER_NUM,A ; 保存变换后的温度数据LCALL BIN_BCDRET;-将16进制的温度数据转换成压缩BCD码BIN_BCD:MOV DPTR,#TEMP_TABMOV A,TEMPER_NUMMOVC A,A+DPTRMOV TEMPER_NUM,ARETTEMP

11、_TAB:DB 00H,01H,02H,03H,04H,05H,06H,07HDB 08H,09H,10H,11H,12H,13H,14H,15HDB 16H,17H,18H,19H,20H,21H,22H,23HDB 24H,25H,26H,27H,28H,29H,30H,31HDB 32H,33H,34H,35H,36H,37H,38H,39HDB 40H,41H,42H,43H,44H,45H,46H,47HDB 48H,49H,50H,51H,52H,53H,54H,55HDB 56H,57H,58H,59H,60H,61H,62H,63HDB 64H,65H,66H,67H,68H,

12、69H,70H,71HDB 72H,73H,74H,75H,76H,77H,78H,79HDB 80H,81H,82H,83H,84H,85H,86H,87HDB 88H,89H,90H,91H,92H,93H,94H,95HDB 96H,97H,98H,99H;-DS18B20初始化程序INIT_1820:SETB DQNOPCLR DQMOV R0,#80HTSR1: DJNZ R0,TSR1 ; 延时SETB DQMOV R0,#25H ;96US-25HTSR2: DJNZ R0,TSR2JNB D Q,TSR3LJMP TSR4 ; 延时TSR3: SETB FLAG1 ; 置标志位

13、,表示DS1820存在LJMP TSR5TSR4: CLR FLAG1 ; 清标志位,表示DS1820不存在LJMP TSR7TSR5: MOV R0,#06BH ;200USTSR6: DJNZ R0,TSR6 ; 延时TSR7: SETB DQRET;-重新写DS18B20暂存存储器设定值RE_CONFIG:JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1 RETRE_CONFIG1:MOV A,#0CCH ; 发SKIP ROM命令LCALL WRITE_1820MOV A,#4EH ; 发写暂存存储器命令LCALL WRITE_1820MOV A

14、,#00H ; TH(报警上限中写入00HLCALL WRITE_1820MOV A,#00H ; TL(报警下限中写入00HLCALL WRITE_1820MOV A,#7FH ; 选择12位温度分辨率LCALL WRITE_1820RET;-延时子程序DELAY:MOV R7,#00HMIN: D JNZ R7,YS500RETYS500: LCALL YS500USLJMP MINYS500US:MOV R6,#00HDJNZ R6,$RETDELAY1: MOV R7,#20HDJNZ R7,$RET$INCLUDE(VI2C_ASM.INC ;包含VIIC软件包;END;启动I2C总

15、线子程序START: SETB SDANOPSETB SCL ;起始条件建立时间大于4.7usNOPNOPNOPNOPNOPCLR SDANOP ;起始条件锁定时大于4usNOPNOPNOPNOPCLR SCL ;钳住总线,准备发数据NOPRET;结束总线子程序STOP: CLR SDANOPSETB SCL ;发送结束条件的时钟信号NOP ;结束总线时间大于4usNOPNOPNOPNOPSETB SDA ;结束总线NOP ;保证一个终止信号和起始信号的空闲时间大于4.7usNOPNOPNOPRET;发送应答信号子程序MACK: CLR SDA ;将SDA置0NOPNOPSETB SCLNOP

16、 ;保持数据时间,即SCL为高时间大于4.7usNOPNOPNOPNOPCLR SCLNOPNOPRET;发送非应答信号MNACK: SETB SDA ;将SDA置1NOPNOPSETB SCLNOPNOP ;保持数据时间,即SCL为高时间大于4.7usNOPNOPNOPCLR SCLNOPNOPRET;检查应答位子程序;返回值,ACK=1时表示有应答CACK: SETB SDANOPNOPSETB SCLCLR ACKNOPNOPMOV C,SDAJC CENDSETB ACK ;判断应答位CEND: NOPCLR SCLNOPRET;发送字节子程序;字节数据放入ACC;每发送一字节要调用一

17、次CACK子程序,取应答位WRBYTE: MOV R0,#08HWLP: RLC A ;取数据位JC WR1SJMP WR0 ;判断数据位WLP1: DJNZ R0,WLPNOPRETWR1: SETB SDA ;发送1 NOPSETB SCLNOPNOPNOPNOPNOPCLR SCLSJMP WLP1WR0: CLR SDA ;发送0 NOPSETB SCLNOPNOPNOPNOPNOPCLR SCLSJMP WLP1;读取字节子程序;读出的值在ACC;每取一字节要发送一个应答/非应答信号RDBYTE: MOV R0,#08HRLP: SETB SDANOPNOPNOPNOPSETB SC

18、L ;时钟线为高,接收数据位NOPNOPNOP ;+1NOP ;+1NOP ;+1NOP ;+1NOP ;+1MOV C,SDA ;读取数据位MOV A,R2CLR SCL ;将SCL拉低,时间大于4.7usRLC A ;进行数据位的处理MOV R2,ANOPNOPNOPNOP ;+1NOP ;+1NOP ;+1NOPNOPNOP ;+1NOPNOP ;+1NOP ;+1DJNZ R0,RLP ;未够8位,再来一次RET;= =;= =; 以下是用户接口子程序;无子地址器件写字节数据;入口参数: 数据为ACC、器件从地址SLA;占用: A、R0、CYIWRBYTE: PUSH ACCIWBLO

19、OP: LCALL START ;起动总线MOV A,SLALCALL WRBYTE ;发送器件从地址LCALL CACKJNB ACK,RETWRB ;无应答则跳转POP ACC ;写数据LCALL WRBYTELCALL CACKLCALL STOPRETRETWRB: POP ACCLCALL STOPRET;无子地址器件读字节数据;入口参数: 器件从地址SLA;出口参数: 数据为ACC;占用:A 、R0、R2 、CYIRDBYTE: LCALL STARTMOV A,SLA ;发送器件从地址INC ALCALL WRBYTELCALL CACKJNB ACK,RETRDBLCALL R

20、DBYTE ;进行读字节操作LCALL MNACK ;发送非应信号RETRDB: LCALL STOP ;结束总线RET;向器件指定子地址写N字节数据;入口参数: 器件从地址SLA、器件子地址SUBA 、发送数据缓冲区MTD、发送字节数NUMBYTE; 占用: A 、R0 、R1 、R3 、CYIWRNBYTE: MOV A,NUMBYTEMOV R3,ALCALL START ;起动总线MOV A,SLALCALL WRBYTE ;发送器件从地址LCALL CACKJNB ACK,RETWRN ;无应答则退出MOV A,SUBA ;指定子地址LCALL WRBYTELCALL CACKMOV

21、 R1,#MTDWRDA: MOV A,R1LCALL WRBYTE ;开始写入数据LCALL CACKJNB ACK,IWRNBYTEINC R1DJNZ R3,WRDA ;判断写完没有RETWRN: LCALL STOPRET;向器件指定子地址读取N字节数据;入口参数: 器件从地址SLA、器件子地址SUBA、接收字节数NUMBYTE ;出口参数: 接收数据缓冲区MTD;占用:A、R0、R1、R2、R3、CYIRDNBYTE: MOV R3,NUMBYTELCALL STARTMOV A,SLALCALL WRBYTE ;发送器件从地址LCALL CACKJNB ACK,RETRDNMOV

22、A,SUBA ;指定子地址LCALL WRBYTELCALL CACKLCALL START ;重新起动总线MOV A,SLAINC A ;准备进行读操作LCALL WRBYTELCALL CACKJNB ACK,IRDNBYTEMOV R1,#MRDRDN1: LCALL RDBYTE ;读操作开始MOV R1,A;NOP ;+1;NOP ;+1DJNZ R3,SACKLCALL MNACK ;最后一字节发非应答位RETRDN: LCALL STOP ;并结束总线RETSACK: LCALL MACKINC R1SJMP RDN1;无子地址器件写N字节数据;入口参数: 器件从地址SLA、发送

23、数据缓冲区MTD、发送字节数NUMBYTE ; 占用: A 、R0 、R1 、R3 、CY;不发送子地址SUBA,直接发送多个数据.IWRNBYTEEXT:MOV A,NUMBYTEMOV R3,ALCALL START ;起动总线MOV A,SLALCALL WRBYTE ;发送器件从地址LCALL CACKJNB ACK,RETWRNE ;无应答则退出MOV R1,#MTDWRDAE: MOV A,R1LCALL WRBYTE ;开始写入数据LCALL CACKJNB ACK,RETWRNEINC R1DJNZ R3,WRDAE ;判断写完没有RETWRNE: LCALL STOPRET;

24、无子地址器件读取N字节数据;入口参数: 器件从地址SLA、器件子地址SUBA、接收字节数NUMBYTE;出口参数: 接收数据缓冲区MTD;占用:A、R0、R1、R2、R3、CY;说明:此函数不发送子址,也不重新启动总线,而是直接读取多个数据. IRDNBYTEEXT:MOV R3,NUMBYTELCALL STARTMOV A,SLAINC ALCALL WRBYTE ;发送器件从地址LCALL CACKJNB ACK,RETRDNEMOV R1,#MRDRDNE1: LCALL RDBYTE ;读操作开始MOV R1,ADJNZ R3,SACKELCALL MNACK ;最后一字节发非应答位

25、RETRDNE: LCALL STOP ;并结束总线RETSACKE: LCALL MACKINC R1SJMP RDNE1软件调试的具体步骤如下:1打开keil集成开发环境,新建一个新的工程文件。2根据需要为工程选择目标器件组和相应的器件号。3创建源程序文件并输入程序代码。4保存创建的源程序项目文件。5把源程序文件添加到项目中。6点击菜单栏上的Project项,选择Option for target target1将出现调试环境设置界面。在Debug栏内选UseSimulator用软件模拟仿真。7编译连接环境设置,选中Create Hex File选项,在编译时就可以自动生成目标代码文件*.

26、hex。硬件调试仿真的具体步骤如下:1修改源程序入口地址为8000H;2点击菜单栏上的Project项,选择Option for target target1将出现调试环境设置界面。在Debug栏内选Use MON51选项,并在该栏后的驱动方式选择框内的选这时的驱动程序库。对于51仿真器应选择Keil Monitoe-51 Diver选项。同时在Settings项中设置串行通信的端口和波特率9600bps,这要求和通信协议上一致。由于MON51监控程序已经占用了0000H7FFFH,用户应用程序必须从8000H开始存放。故在off-chip code memory-Eprom设为0x8000,

27、长度0x4000。off-chip Xdata memory-Ram设为0xC000,长度0x4000。3配置好环境设置后,对文件进行编译。如果编译成功,则产生目标文件。如果有错误则更正错误,重新编译直至完全正确为止。4连接好DP-51PROC实验仪,对实验仪上电,打开DPFlash,把仿真器上的开关拨到LOAD 模式,ISP跳线JP14 跳开,按下复位键,即进入下载状态。在DPFlash上型号的下拉菜单选择DP-51PROC,然后根据你所插的通信口选择相应的通信口。点击编程按钮,选择MON51选项,开始下载到TKSMonitor51仿真器的Flash中。再将仿真器工作模式改为run,重启,仿

28、真器进入调试状态。5关掉DPFlash,点击DEBUG菜单,选中Start/Stop Debug Session调试命令,这样既可以把用户程序下载到仿真器的SRAM中。单击go!,进行控制。脱机运行的具体步骤如下:1修改源程序入口地址为0000H;2点击菜单栏上的Project项,选择Option for target target1将出现调试环境设置界面。Target属性的设置,设置Off-Chip Code Memory栏内的Eprom选项,start下输入0x0000, size下输入0x4000;Off-Chip Xdata memory栏内的Eprom选项,start下输入0xC00

29、0,size 下输入0x4000。3)连接好 DP-51PROC 实验仪,对实验仪上电,打开 DPFlash,把仿真器上的开关拨到 LOAD 模式,ISP 跳线 JP14 跳开,按下复位键,即进入下载状态。在 DPFlash 上型号的下 拉菜单选择 DP-51PROC,然后根据你所插的通信口选择相应的通信口。装载文件,点击编 程按钮,选择编程文件区选项,将生成的目标文件下载到 TKSMonitor51 仿真器的 Flash 中。 再将仿真器工作模式改为 run,重启,仿真器进入脱机运行状态。 5.观察 D5 区数码管显示的温度数据。然后改变 DS18B20 的表面温度,查看显示的温度数据是否有变化,并调整实验程序使测量值更准确。 实验注意事项: 六、实验注意事项: 1、硬件调试或运行的运行的时候打开电源,不要保持电源的常开状态,以免实验箱运行时 间过长烧坏。 2、Debug 时,需关掉 DPFlash,否则调试时开发环境报错。 专心-专注-专业

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 教育教学

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

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