《温度采集与显示系统.pdf》由会员分享,可在线阅读,更多相关《温度采集与显示系统.pdf(34页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、光电与通信工程学院课程设计报告书课课设设名名称:称:温度采集与显示系统温度采集与显示系统年级专业及班级:年级专业及班级:姓姓名:名:学学号:号:组组号:号:1温度采集与显示系统温度采集与显示系统摘要摘要温度是一种最基本的环境参数,也是一个十分重要的物理量,对它的测量与控制有十分重要的意义。 随着现代工农业技术的发展及人们对生活环境要求的提高,人们也迫切需要检测与控制温度:如大气及空调房中温度的高低,直接影响着人们的身体健康;粮仓温度的检测,防止粮食发霉,最大限度地保持粮食原有新鲜品质,到达粮食保质保鲜的目的;工业易燃品的存放。温度测量在物理实验、医疗卫生、食品生产等领域,尤其在热学试验中,有特
2、别重要的意义。随着人们生活水平的不断提高,,人们对温度计的要求越来越高,传统的温度计功能单一、精度低,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。本次课程设计介绍了以 STC89C51 单片机为核心的温度检测报警系统的工作原理和设计方法。 温度信号由温度传感器芯片 DS18B20 采集, 并以数字信号的方式传送给单片机, 单片机再控制数码管驱动芯片 74LS573 驱动 4 位分立式数码管显示实时温度,当检测到的温度超出了给定的温度范围默认下限为 20,默认上限为 35 , 系统将输出报警声。 本系统的主要硬件电路包括: 温
3、度检测电路,数码管驱动电路,报警电路。另外本系统的软件部分占了很大的比重,主要的软件模块包括:温度传感器程序,数码管驱动及显示程序,报警程序。关键词关键词:温度测量,单片机,温度传感器2目目录录一、序论序论1一设计背景与课程目的 1二设计任务要求 1二、二、系统的主要功能及工作流程系统的主要功能及工作流程 1一系统具有以下功能 1二系统的工作流程 2三、三、硬件电路原理描述硬件电路原理描述 2一实验步骤 2二所用芯片及其功能 3 1、STC89C52 42、MAX232CPE 4三硬件电路原理 41、控制部分 42、测量部分 63、显示部分 74、报警部分 7四、四、软件设计流程及描述软件设计
4、流程及描述 8五、五、 心得体会心得体会10参考文献参考文献12致谢致谢 13附录附录一系统总硬件电路原理图 14二系统源程序代码要有注释 143一、序论一设计背景与课程目的温度是一种最基本的环境参数,也是一个十分重要的物理量,对它的测量与控制有十分重要的意义。 随着现代工农业技术的发展及人们对生活环境要求的提高,人们也迫切需要检测与控制温度:如大气及空调房中温度的高低,直接影响着人们的身体健康;粮仓温度的检测,防止粮食发霉,最大限度地保持粮食原有新鲜品质,到达粮食保质保鲜的目的;工业易燃品的存放。本次课程设计介绍了以 STC89C51 单片机为核心的温度检测报警系统的工作原理和设计方法。 温
5、度信号由温度传感器芯片 DS18B20 采集, 并以数字信号的方式传送给单片机, 单片机再控制数码管驱动芯片 74LS573 驱动 4 位分立式数码管显示实时温度,当检测到的温度超出了给定的温度范围默认下限为 20,默认上限为 35 ,系统将输出报警声。本系统的主要硬件电路包括:温度检测电路,数码管驱动电路,报警电路。另外本系统的软件部分占了很大的比重,主要的软件模块包括:温度传感器程序,数码管驱动及显示程序,报警程序。二设计任务要求1、根据设计内容与要求,弄清系统及各个模块的工作流程,完成电路原理图,包括单片机最小系统模块、LCD 显示模块、存储模块、串行口下载模块和电源模块,最终在万用板上
6、焊接,完成整个系统硬件设计。2、根据设计内容与要求,弄清系统及各个模块的工作流程,完成系统的软件设计,包括系统主程序、温度读取子程序、LCD 显示子程序、存储子程序等,可使用汇编语言或是 C 语言编写,建议使用 C 语言编写。3、首先使用 Proteus 进行仿真和调试,在仿真通过后,将程序通过串行口下载电路下载到单片机中,最终使得系统在脱机情况下,能稳定可靠地工作。二、系统的主要功能及工作流程一系统具有以下功能:1、能正确检测温度;2、在 1602 上实时显示温度;3、每隔 10 秒采集一次温度数据并保存到 AT24C024、按键按下后,可逐个显示之前采集到的数据;5、其他功能可根据系统上的
7、资源自行设定。利用 STC89C52、DS18B20、LCD1602、AT24C02等元器件设计温度采集与0显示系统。扩展功能:温度超过设定值,蜂鸣器报警;时间日期的显示;按键按下,重新开始采集温度等等。二系统的工作流程总体设计框图:显示显示温度采集温度采集(DBS18B20DBS18B20)单片机单片机STC89C51STC89C51阈值设定阈值设定(键盘)(键盘)报警报警(蜂鸣器)(蜂鸣器)系统设计思路为以单片机为控制中心, 通过实时采集温度传感器 DBS18B20获得当前的温度值,通过 LED 显示当前温度,同时使用键盘设定温度阈值,当测定温度大于温度阈值后, 利用蜂鸣器报警。 系统包括
8、包括单片机最小系统模块、LED 显示模块、蜂鸣器报警模块、矩阵键盘模块、串行口下载模块和电源模块。三、硬件电路原理描述1实验步骤系统的主要功能是实现温度信号的采集,在 4 位 LED 显示器上显示当前的温度和通道号。模拟现场两个点的温度巡回检测,温度范围0-510 摄氏度。每隔秒检测一次,经标度变换后送 LED 显示器显示,4 路循环显示,每路持续两秒。实验步骤如下:1、从 PC 机引出两根电缆连接在试验平台上。2、编写程序然后编译连接。3、按照附录一电路图所示连接试验线路。14、运行参考程序,观察 LED 显示器上的通道号和温度值。二所用芯片及其功能1、STC89C52STC89C52RC引
9、脚功能说明VCC40引脚:电源电压VSS20引脚:接地P0端口,3932引脚:P0口是一个漏极开路的8位双向I/O口。作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入“1”时,可以作为高阻抗输入。P1端口,18引脚:P1口是一个带内部上拉电阻的8位双向I/O口。P1的输出缓冲器可驱动吸收或者输出电流方式4个TTL输入。P2端口, 2128引脚:P2口是一个带内部上拉电阻的8位双向I/O端口。P2的输出缓冲器可以驱动吸收或输出电流方式4个TTL输入。P3端口,1017引脚:P3是一个带内部上拉电阻的8位双向I/O端口。P3的输出缓冲器可驱动吸收或输出电流方式4个TTL输入。RST9引脚
10、:复位输入。当输入连续两个机器周期以上高电平时为有效,用来完成单片机单片机的复位初始化操作。看门狗计时完成后,RST引脚输出96个晶振周期的高电平。ALE/30引脚:地址锁存控制信号ALE是访问外部程序存储器时,锁存低8位地址的输出脉冲。29引脚: 外部程序存储器选通信号 是 外部 程序 存储器 选通 信 号 。 当AT89C51RC从外部程序存储器执行外部代码时,在每个机器周期被激活两次,而访问外部数据存储器时,将不被激活。VPP31引脚:访问外部程序存储器控制信号。 为使能从0000H到FFFFH的外部程序存储器读取指令,必须接GND。注意加密方式1时,将内部锁定位RESET。为了执行内部
11、程序指令,应该接VCC。在Flash编程期间,也接收12伏VPP电压。XTAL119引脚:振荡器反相放大器和内部时钟发生电路的输入端。2XTAL218引脚:振荡器反相放大器的输入端。2、MAX232CPEMAX232CPE是16针SMD封装IC,用于完成 电脑232端口数据电平转换,连接CMOS电路的, 换言之, 如果离开它, 我们就无法用软件监控电源状态了 需要串口返回信号。而PIC16F870则为24脚8位CMOS闪存控制器。 用于可监控UPS当中。MAX232CPE 完成232电平与 TTL 电平转换,提供一个本地接口, 为调试和维护提供方便。 TXD接 SX52的 RA2脚,RXD 接
12、 SX52的 RA3脚,RS-RXD 和 RS-TXD 是 RS232电平, 为标准串口电平。 数据可以从串口输入到单片机 SX52, SX52再把数据送到 RTL8019AS 传出去。用于嵌入式设备上的应用(三)硬件电路原理系统总硬件电路原理图见附录一1 1、控制部分、控制部分控制部分是采用单片机 STC89C52。STC89C52 是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程 Flash 存储器。 STC89C52 使用经典的 MCS-51 内核, 但做了很多的改良使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的 8 位CPU 和在系统可编程 Flash,
13、 使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具有以下标准功能: 8k字 节Flash,512字节 RAM,32 位 I/O 口线,看门狗定时器,内置 4KBEEPROM,MAX810 复位电路, 3个16位定时器 /计数器, 4个外部中断,一个 7向 量 4级中断结构兼容传统51的5向量2级中断结构 ,全双工串行口。 另 外STC89X52 可降至0Hz 静态逻辑操作,支持 2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许 RAM、定时器 /计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或
14、硬件复位为止。最高运作频率35MHz,6T/12T可选。3单片机总控制电路如下列图:1.21.2 复位操作复位操作本系统的复位电路采用 按键 电平复位 方式 ,通 过使复位端 经电阻 与Vcc 电源接通而实现的,其电路如下列图所示上述电路图中的电阻、电容参数适用于6MHz 晶振,能保证复位信号高电平持续时间大于2 个机器周期。1.3 STC89C521.3 STC89C52主要功能主要功能 ,如下表所示STC89C52STC89C52 主要功能主要功能4主要功能特性兼容 MCS51 指令系统32 个双向 I/O 口3 个 16 位可编程定时 /计数器中断2 个串行中断2 个外部中断源2 个读写
15、中断口线低功耗空闲和掉电模式STC89C52STC89C52 管脚介绍:管脚介绍: 主电源引脚 2 根VCC(Pin40) :电源输入,接 5V 电源GND(Pin20) :接地线外接晶振引脚 2 根XTAL1(Pin19) :片内振荡电路的输入端XTAL2(Pin20) :片内振荡电路的输出端控制引脚 4 根RST/VPP(Pin9) :复位引脚,引脚上出现2 个机器周期的高电平将使单片机复位。ALE/PROG(Pin30) :地址锁存允许信号PSEN(Pin29) :外部存储器读选通信号EA/VPP(Pin31) :程序存储器的内外部选通,接低电平从外部程序存储器读指令,接高电平则从内部程
16、序存储器读指令。可编程输入 /输出引脚 32 根STC89C52 单片机有 4 组 8 位的可编程 I/O 口,分别位 P0、P1、P2、P3 口,每个口有 8 位8 根引脚,共 32 根。P1 口Pin1Pin8:8 位准双向 I/O 口线,名称为 P1.0P1.7P2 口Pin21 Pin28 :8 位准双向 I/O 口线,名称为 P2.0P2.72 2、测量部分、测量部分测量部分我们采用美国DALLAS 公司生产的 DS18B20 温度传感器。2.1 DS18B20 简介DS18B20数字温度传感器,该产品采用美国 DALLAS公司生产的58K 可反复擦写 Flash ROM256x8b
17、it 内部 RAM时钟频率 0-24MHz可编程 UART 串行通道共 6 个中断源3 级加密位软件设置睡眠和唤醒功能DS18B20 可组网数字温度传感器芯片封装而成,具有耐磨耐碰,体积小,使用方便,封装形式多样, 适用于各种狭小空间设备数字测温和控制领域。2.2 封装及接线说明:DS18B20 芯片封装结构:特点:独特的一线接口,只需要一条口线通信多点能力,简化了分布式温度传感应用无需外部元件可用数据总线供电,电压范围为3.0V至 5.5V 无需备用电源测量温度范围为 -55 C 至+125 。华氏相当于是-67 F 到 257 华氏度 -10 C 至+85 C 范围内精度为0.5 C 2.
18、3 DS18B20控制方法DS18B20 有六条控制命令:温度转换 44H :启动 DS18B20 进行温度转换读暂存器 BEH :读暂存器 9 个字节内容写暂存器 4EH :将数据写入暂存器的TH、TL 字节复制暂存器 48H :把暂存器的 TH、TL 字节写到 E2RAM 中读电源供电方式 B4H :启动 DS18B20 发送电源供电方式的信号给主CPU3 3、显示部分、显示部分内部的四个数码管共用adp 这8根数据线,为人们的使用提供了方便,因为里面有四个数码管,所以它有四个公共端,加上adp,共有 12个引脚,下面便是一个共阴的四位数码管的内部结构图共阳的与之相反。引脚排列依然是从左下
19、角的那个脚1脚开始,以逆时针方向依次为 112脚, 上图中的数字与之一一对应。4 4、报警部分、报警部分本系统设计三个按键,采用查询方式,一个用于选择切换设置报警温度和当前温度,另外两个分别用于设置报警温度的加和减。6四、软件设计流程及描述系统软件程序采用 C51 语言编写。本程序采用模块化程序方法,主要分为以下三个模块: LCD 初始化显示模块 DS18B20 数据采集模块 温度报警上下限设置模块整个系统的功能是由硬件电路配合软件来实现的, 当硬件基本定型后软件的功能也就基本定下来了。从软件的功能不同可分为两大块:第一块是对数字温度传感器的操作,通过单片机对 DS18B20 进复位,进行数据
20、读取等操作;第二块是控制 LED 数码显示,将温度数据在 LED 上显示出来。程序流程图设计 :开始开始初始化初始化 LCD1602LCD1602调用调用 DS18B20DS18B20 模块模块调用报警模块调用报警模块温度显示温度显示主程序流程图7主机发出开始信号主机发出开始信号主机设置为输入模主机设置为输入模式式N N跳出跳出DS18B20DS18B20是否响应?是否响应?Y Y等待等待 480us480us接收数据接收数据拉低总线,延时拉低总线,延时45us45us释放总线释放总线DS18B20数据采集流程图8进入设置模式(按键)进入设置模式(按键)设置温度报警上下限设置温度报警上下限TH
21、TH 与与 TLTL调用调用 DS18B20DS18B20模块模块Temp=TH|Temp=TH|Temp=TL?N NY Y报警(报警( LEDLED 亮,蜂鸣亮,蜂鸣器响)器响)温度显示温度显示报警模块流程图五、心得体会硬件庄春兰通过这次课程的课程设计,我深深的认识到自己的很多不足,在实际的动手焊接过程中,我发现自己还是有很多欠缺的,首先就是要进行排版,这是非常重要的,这关系到这个版的美观,以及走线的正确性。当然在焊接过程最需要的是认真,不仅需要分清楚器件的正反,更重要的是查清楚器件的管脚图,依照管脚图进行焊接,以及明白各个管脚的作用。再则,就是走线的问题,走线尽量走直线,但是由于焊锡的不
22、足,所以我们的板通过导线来走线,这样可以省下很多焊锡,但是不足的是影响了作品的美观度。焊接的时候要求对每个节点焊接牢固,9防止出现虚焊这种现象。但是,当我们讲作品按照原理图连接完成的时候,发现只有 LED 亮,并且闪烁。电路出现不稳定的现在,LED 上无显示。经排查,发现插头出现漏电的现象,另外接了一个导线,LED 灯不闪烁。认真的用万用表测量了单片机的引脚之后发现芯片在插的时候有一个引脚没有插进去, 重新弄了之后,LED 灯可以显示数据,并且可以实现功能。软件王璇根据实验的要求, 我对相关的知识进行了复习, 查询了各个器件的相关资料,并且找到了适合的方案进行了程序的编写。 首先根据课程设计的
23、要求写好程序的流程图, 然后再进行相关的功能扩张,在程序流程图的基础上根据芯片的功能写出相对应的程序和扩展功能程序,然后再进行不断的调试和相应的修改,来实现要求的功能。程序都是由各个子程序组成,为了让自己更好的理解自己的程序,我都在程序后面加注释, 这样在程序出错的检查过程中可以更容易查找的到,也更简洁,更明白易懂。 在写程序时候由于中断程序出错导致无法实现功能,排除错误之后程序运行正常, 通过这次的课程设计我明白了理论和实际相结合的重要性, 设计都是自己从头到尾慢慢的修改出来的, 这让我熟悉了整个设计的过程,更系统的锻炼了自己,从而对书本上所学的知识有了更具体的理解。1 0参考文献1单片机原
24、理及应用 ; 徐敏,刘建春,关健生;机械工业出版社2 单片机原理及接口技术,李朝青编著,北京航空航天大学出版社;3 微机原理及接口技术,李顺增、吴国东、乔志伟,机械工业出版社;4 电子技术常用器件应用手册,陈汝全,机械工业出版社;5 单片机原理及接口技术,李朝青,北京航空航天大学出版社;6 单片机微型电脑及其应用,孙育才,东南大学出版社;7 基于单片机的自适应温度控制系统;叶丹1 1致谢致谢人生的成长历程始终是向前的。当一个阶段快要结束即将迈入另一个阶段时,自然需要对 即将过去的进行思考和小结。自己一直在思考学业、职业、事业 的哲 学关 系,也许本 来就 没有 固定的 答案 和模 式。需 要的
25、 是对自己 对时 间、对生 命的尊 重和 珍惜 ,同样需要 对在 我成 长历 程中、在人生某 个阶 段一 直给 予我帮 助、指 导、鼓 励、支持、信任、保护的人,表达真正的感谢。可以用客套、冠冕堂皇的话,也可以选择朴实。后者才更真挚,更深入心灵。在这里我要感谢指导老师和同学对我的悉心指导与帮助。 老师 诲人 不倦 的精神 ,治学严 谨的 态度,让我 无比 钦佩 。还要 感谢 大学 期间 遇到的 其他老师,谢谢 你们 让我 在学 到知 识的 同时,也学到了如何做人,你们的言传身教将让我一生受用。1 2附录一系统总硬件电路原理图附录二系统源程序代码主程序#include#includechar m
26、iao,shi,fen;uint s1num;uchar count;uint su,tt,mm,m,n;uchar buff4;unsigned char pDat7,pDat17;sbit s1=P30;1 3sbit s2=P31;sbit s3=P36;void main()m=0;n=0;init();EX0=1;/init_com(); /包含了对定时器 0 的设定while(1)write_sfm(10,miao);write_sfm(7,fen);write_sfm(4,shi);dis_temp(tt);dis_temp1(mm);keyscan();void int_0()
27、 interrupt 0EA=0;IRcvStr(0 xa0,n,&pDat10,8);/mm=pDat10;/mm8)&0 xff);/pDat1=(uchar)(tt&0 xff);pDat0=tt/100;pDat1=(tt%100)/10;pDat2=tt%10;ISendStr(0 xa0,m,&pDat0,8);/存温度m=m+8;pDat0=0;pDat1=0;pDat2=0;count+;if(count=20)count=0;miao+;1 7if(miao=60)miao=0;fen+;if(fen=60)fen=0;shi+;if(shi=24)shi=0;/write_
28、sfm(4,shi);/write_sfm(7,fen);/write_sfm(10,miao);DS18B20复位函数#include #include #includesbit ds=P22;/温度传感器信号线/sbit beep=P23;/蜂鸣器uint temp;float f_temp;void dsreset(void)/18B20 复位,初始化函数uint i;ds=0;i=103;while(i0)i-;ds=1;i=4;while(i0)i-;bit tempreadbit(void)/读 1 位函数uint i;bit dat;1 8ds=0;i+;/i+ 起延时作用ds=
29、1;i+;i+;dat=ds;i=8;while(i0)i-;return (dat);uchar tempread(void)/读 1 个字节uchar i,j,dat;dat=0;for(i=1;i=8;i+)j=tempreadbit();dat=(j1);/读出的数据最低位在最前面,这样刚好一个字节在DAT里return(dat);void tempwritebyte(uchar dat)/向 18B20 写一个字节数据uint i;uchar j;bit testb;for(j=1;j1;if(testb)/写 1ds=0;i+;i+;ds=1;i=8;while(i0)i-;els
30、eds=0;/写 0i=8;while(i0)i-;ds=1;i+;i+;1 9void tempchange(void)/DS18B20 开始获取温度并转换dsreset();delay(1);tempwritebyte(0 xcc);/ 写跳过读 ROM 指令tempwritebyte(0 x44);/ 写温度转换指令uint get_temp()/读取寄存器中存储的温度数据uchar a,b;dsreset();delay(1);tempwritebyte(0 xcc);tempwritebyte(0 xbe);a=tempread();/读低 8 位b=tempread();/读高 8
31、 位temp=b;tempwarn_l2)&(t=warn_l1) /大于 25 度小于 27 度warn(40,0 x01);else if(t=warn_l2)/小于 25 度warn(10,0 x03);else if(t=warn_h1) /小于 32 度大于 30 度warn(40,0 x04);else if(t=warn_h2)/大于 32 度warn(10,0 x0c);elsei=40;while(i-)dis_temp(get_temp();*/*此部分为 AT2402 的驱动程序使用 I2C 总线连接*/#include2 2/AT2402的功能函数/*向有子地址器件发送
32、多字节数据函数函数原型: bitISendStr(UCHAR sla,UCHAR suba,ucahr *s,UCHAR no);功能:从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件地址 sla,子地址 suba,发送内容是 s 指向的内容,发送 no 个字节。如果返回 1 表示操作成功,否则操作有误。注意:使用前必须已结束总线。*/bit ISendStr(unsigned char sla,unsigned charsuba,unsigned char*s,unsigned charno)unsigned char i;Start_I2c();/*启动总线*/SendByte
33、(sla);/*发送器件地址*/if(ack=0)return(0);SendByte(suba);/*发送器件子地址*/if(ack=0)return(0);for(i=0;ino;i+)SendByte(*s);/*发送数据*/if(ack=0)return(0);s+;Stop_I2c();/*结束总线*/return(1);/*向有子地址器件读取多字节数据函数函数原型: bitRecndStr(UCHAR sla,UCHAR suba,ucahr *s,UCHAR no);功能:从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件地址 sla,子地址suba,读出的内容放入s
34、 指向的存储区,读no 个字节。如果返回 1 表示操作成功,否则操作有误。注意:使用前必须已结束总线。*/bit IRcvStr(unsigned charsla,unsigned charsuba,unsigned char*s,unsignedcharno)2 3unsigned char i;Start_I2c();/*启动总线*/SendByte(sla);/*发送器件地址*/if(ack=0)return(0);SendByte(suba);/*发送器件子地址*/if(ack=0)return(0);Start_I2c();/*重新启动总线*/SendByte(sla+1);if(a
35、ck=0)return(0);for(i=0;ino-1;i+)*s=RcvByte();/*发送数据*/Ack_I2c(0);/*发送就答位*/s+;*s=RcvByte();Ack_I2c(1);/*发送非应位*/Stop_I2c();/*结束总线*/return(1);LED 程序#include#includesbit rs=P35;sbit lcden=P34;uchar code tablenum= 0123456789;uchar code table= 00.0| 00.0;uchar code table1=00:00:00;void delay(uint z)uint x,
36、y;for(x=z;x0;x-)for(y=110;y0;y-);void write_com(uchar com)2 4rs=0;lcden=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;void write_date(uchar dat)rs=1;lcden=0;P0=dat;delay(5);lcden=1;delay(5);lcden=0;void init()uchar num;lcden=0;/fen=59;/miao=53;/shi=23;write_com(0 x38);write_com(0 x0c);write_com(0 x06);
37、write_com(0 x01);write_com(0 x80);for(num=0;num13;num+)write_date(tablenum);delay(5);write_com(0 x80+0 x40);for(num=0;num12;num+)write_date(table1num);delay(5);TMOD=0 x01;2 5TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;void write_sfm(uchar add,uchar dat)/写地址和自动显示两位数时间uchar s,g;s=dat/
38、10;g=dat%10;write_com(0 x80+0 x40+add);write_date(tablenums);write_date(tablenumg);void write_sfm1(uchar add,uchar dat) /写温度值十位地址写4个位为5小数为7write_com(0 x80+add);write_date(tablenumdat);/* 此 部 分 为I2C总 线 的 驱 动 程 序*/#include#include #include#defineNOP()_nop_()/* 定义空指令 */#define_Nop()_nop_()/*定义空指令*/sbit
39、SCL=P21;/I2C时钟sbitSDA=P20;/I2C数据bit ack;/*应答标志位*/*起动总线函数函数原型: voidStart_I2c();功能:启动 I2C 总线,即发送 I2C 起始条件.*/void Start_I2c()2 6SDA=1;/*发送起始条件的数据信号*/_Nop();SCL=1;_Nop();/*起始条件建立时间大于 4.7us,延时*/_Nop();_Nop();_Nop();_Nop();SDA=0;/*发送起始信号*/_Nop();/* 起始条件锁定时间大于 4s*/_Nop();_Nop();_Nop();_Nop();SCL=0;/*钳住 I2C
40、 总线,准备发送或接收数据 */_Nop();_Nop();/*结束总线函数函数原型: voidStop_I2c();功能:结束 I2C 总线,即发送 I2C 结束条件.*/void Stop_I2c()SDA=0;/*发送结束条件的数据信号*/_Nop();/*发送结束条件的时钟信号*/SCL=1;/*结束条件建立时间大于 4s*/_Nop();_Nop();_Nop();_Nop();_Nop();SDA=1;/*发送 I2C 总线结束信号*/_Nop();_Nop();_Nop();_Nop();/*字节数据发送函数2 7函数原型: voidSendByte(UCHAR c);功能:将数
41、据 c 发送出去,可以是地址,也可以是数据,发完后等待应答,并对此状态位进行操作.(不应答或非应答都使 ack=0)发送数据正常,ack=1; ack=0 表示被控器无应答或损坏。*/voidSendByte(unsigned charc)unsigned charBitCnt;for(BitCnt=0;BitCnt8;BitCnt+)/*要传送的数据长度为 8 位*/if(cBitCnt)&0 x80)SDA=1;/*判断发送位*/elseSDA=0;_Nop();SCL=1;/*置时钟线为高,通知被控器开始接收数据位*/_Nop();_Nop();/*保证时钟高电平周期大于 4s*/_No
42、p();_Nop();_Nop();SCL=0;_Nop();_Nop();SDA=1;/*8 位发送完后释放数据线,准备接收应答位*/_Nop();_Nop();SCL=1;_Nop();_Nop();_Nop();if(SDA=1)ack=0;else ack=1;/*判断是否接收到应答信号*/SCL=0;_Nop();_Nop();/*字节数据接收函数函数原型: UCHARRcvByte();功能:用来接收从器件传来的数据,并判断总线错误(不发应答信号),2 8发完后请用应答函数应答从机。*/unsigned charRcvByte()unsigned charretc;unsigned
43、 charBitCnt;retc=0;SDA=1;/*置数据线为输入方式*/for(BitCnt=0;BitCnt8;BitCnt+) _Nop();SCL=0;/*置时钟线为低,准备接收数据位*/_Nop();s*/_Nop();_Nop();_Nop();SCL=1;/*置时钟线为高使数据线上数据有效*/_Nop();_Nop();retc=retc1;if(SDA=1)retc=retc+1;/*读数据位,接收的数据位放入 retc 中 */_Nop();_Nop();SCL=0;_Nop();_Nop();return(retc);/*应答子函数函数原型:void Ack_I2c(bit a);功能:主控器进行应答信号(可以是应答或非应答信号,由位参数 a 决定)*/void Ack_I2c(bit a)if(a=0)SDA=0;/*在此发出应答或非应答信号 */else2 9SDA=1;_Nop();_Nop();_Nop();SCL=1;_Nop();_Nop();/*时钟低电平周期大于 4s*/_Nop();_Nop();_Nop();SCL=0;_Nop();_Nop();/*清时钟线,钳住 I2C 总线以便继续接收*/3 0