资源描述
河南理工大学
《单片机应用与仿真训练》设计报告
多机温度检测系统设计
姓 名: 宁凯文
学 号: 31110800****
专业班级: 光电11-01
指导老师: 刘巍
所在学院: 电气工程与自动化学院
2013年12月20日
摘要
本设计是以STC89C52单片机为控制核心,利用新型一线制温度传感器 DS18B20测量温度值,实现环境温度的检测和报警。系统测量的温度范围为 0.0℃~99.9℃,测量精度为 0.5℃。用户可以自定义报警上、下限,一旦温度超过极限值,单片机便启动声光报警。该系统精度高、测温范围广、报警及时,可广泛应用于基于单片机的测温报警场合。系统抗干扰性强、设计灵活方便,适合在恶劣的环境下进行温度测量。系统硬件电路包括传感器数据采集、温度显示、报警温度设定、上下限报警主电路等。整个装置的控制核心是 STC89C52单片机。温度传感器 DS18B20采用外部电源供电,传感器输出引脚直接和单片机相连。电路支持温度极限值查询功能,可以通过相关按键查询当前温度极限值。当被测温度越限时,报警主电路产生声光报警,同时主机向从机发送报警命令使从机报警。采用3片单片机,组成多机温度检测系统;下位单片机采集温度并用数码管显示当前温度值,通过串行通信传送至上位单片机;上位单片机用数码管显示温度大小和从机地址;基本范围0.0℃~99.9℃;精度误差小于0.5℃;可以任意设定温度的上下限报警功能
关键字:STC89C52;DS18B20温度传感器;数码管;测温报警
目录
摘要 2
目录 3
1. 概述 4
1.1课题背景 4
1.2 系统概述 4
2 系统方案设计 5
2.1主控制部分设计 5
2.2 传感器部分设计 6
3 系统总体方案及硬件设计 11
3.1 AT89S52单片机的最小相系统 11
3.2 DS18B20的I/O接线图 11
3.3 数据显示部分 12
3.4整体电路 12
4 软件设计 13
4.1 概述 13
4.2 主程序方案 13
4.3 DS18B20的相处理子程序 14
4.4 各模块工作流程图 15
5 课程设计体会 18
6 参考文献 18
1. 概述
1.1课题背景
在工、农业生产和日常生活中,对温度的测量及控制占据着极其重要地位。首先让我们了解一下多点温度检测系统在各个方面的应用领域:消防电气的非破坏性温度检测,电力、电讯设备之过热故障预知检测,空调系统的温度检测,各类运输工具之组件的过热检测,保全与监视系统之应用,医疗与健诊的温度测试,化工、机械…等设备温度过热检测。温度检测系统应用十分广阔。
1.2 系统概述
本设计运用主从分布式思想,由上位机,下位机多机温度数据采集,组成两级分布式多机温度测量的巡回检测系统。该系统采用 RS-232串行通讯标准,通过上位机控制下位机进行现场温度采集,并实时显示当前各点的温度值。
下位机采用的是单片机基于数字温度传感器DS18B20的系统。DS18B20利用单总线的特点可以方便的实现多点温度的测量,轻松的组建传感器网络,系统的抗干扰性好、设计灵活、方便,而且适合于在恶劣的环境下进行现场温度测量。本系统可以应用在大型工业及民用常温多点监测场合。如粮食仓储系统、楼宇自动化系统、温控制程生产线之温度影像检测、医疗与健诊的温度测试、空调系统的温度检测、石化、机械等。
温度检测系统有则共同的特点:测量点多、环境复杂、布线分散、现场离监控室远等。若采用一般温度传感器采集温度信号,则需要设计信号调理电路、A/D 转换及相应的接口电路,才能把传感器输出的模拟信号转换成数字信号送到计算机去处理。这样,由于各种因素会造成检测系统较大的偏差;又因为检测环境复杂、测量点多、信号传输距离远及各种干扰的影响,会使检测系统的稳定性和可靠性下降 。所以多点温度检测系统的设计的关键在于两部分:温度传感器的选择和主控单元的设计。温度传感器应用范围广泛、使用数量庞大,也高居各类传感器之首。
2 系统方案设计
2.1主控制部分设计
方案一:
此方案采用PC机实现。它可在线编程,可在线仿真的功能,这让调试变得方便。且人机交互友好。但是PC机输出信号不能直接与DS18B20通信。需要通过RS232电平转换兼容,硬件的合成在线调试,较为繁琐,很不简便。而且在一些环境比较恶劣的场合,PC机的体积大,携带安装不方便,性能不稳定,给工程带来很多麻烦!
方案二:
此方案采用STC89C52八位单片机实现。单片机软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制。而且体积小,硬件实现简单,安装方便。既可以单独对多DS18B20控制工作,还可以与PC机通信.运用主从分布式思想,可由一台上位机,多个下位机组成多机温度数据采集系统,实现远程控制。另外AT89S52在工业控制上也有着广泛的应用,编程技术及外围功能电路的配合使用都很成熟
2.1.1 对AT89S52功能的认识
STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。使用STC 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。STC89C52具有以下标准功能: 8k字节Flash,256字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
图 1 STC89C52
2.2 传感器部分设计
方案一:
采用热敏电阻,可满足40摄氏度至90摄氏度测量范围,但热敏电阻精度、重复性、可靠性较差,对于检测1摄氏度的信号是不适用的。而且在温度测量系统中,采用单片温度传感器,比如AD590,LM35等.但这些芯片输出的都是模拟信号,必须经过A/D转换后才能送给计算机,这样就使得测温装置的结构较复杂.另外,这种测温装置的一根线上只能挂一个传感器,不能进行多点测量.即使能实现,也要用到复杂的算法,一定程度上也增加了软件实现的难度。
方案二:
在多点测温系统中,传统的测温方法是将模拟信号远距离采样进行AD转换,而为了获得较高的测温精度,就必须采用措施解决由长线传输,多点测量切换及放大电路零点漂移等造成的误差补偿问题。采用数字温度芯片DS18B20测量温度,输出信号全数字化。便于单片机处理及控制,省去传统的测温方法的很多外围电路。且该芯片的物理化学性很稳定,它能用做工业测温元件,此元件线形较好。在0—100摄氏度时,最大线形偏差小于1摄氏度。DS18B20的最大特点之一采用了单总线的数据传输,由数字温度计DS1820和微控制器AT89S52构成的温度测量装置,它直接输出温度的数字信号,可直接与计算机连接。这样,测温系统的结构就比较简单,体积也不大,且由于AT89S52可以带多个DSB1820,因此可以非常容易实现多点测量.轻松的组建传感器网络。
采用温度芯片DS18B20测量温度,可以体现系统芯片化这个趋势。部分功能电路的集成,使总体电路更简洁,搭建电路和焊接电路时更快。而且,集成块的使用,有效地避免外界的干扰,提高测量电路的精确度。所以集成芯片的使用将成为电路发展的一种趋势。本方案应用这一温度芯片,也是顺应这一趋势。
综上所述,温度传感器以及主控部分都采用第二方案。
系统采用针对传统温度测温系统测温点少,系统兼容性及扩展性较差的特点,运用分布式通讯的思想。设计一种可以用于大规模多点温度测量的巡回检测系统。该系统采用的是RS-232串行通讯的标准,通过上位机进行现场的温度采集,温度数据既可以由下位机模块实时显示,也可以送回上位机进行数据处理,具有巡检速度快,扩展性好,成本低的特点。
2.2.1 对DS18B20功能的认识
DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO-92小体积封装形式。测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出。其工作电源既可在远端引入,也可采用寄生电源方式产生。CPU只需一根端口线就能与诸多DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
DS18B20支持“一线总线”接口,测量温度范围为 -55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。
DS18B20采集被控对象的实时温度并从单片机的 P1.6口输入,R3为上拉电阻。电路采用数字信号输出可提高信号抗干扰能力和温度测量精度。电路工作电压使用范围为3.0~5.5V,采用外部供电方式。
图 2 DS18B20
2.2.2 DS18B20
(1) DS18B20内部结构如下图所示。
图 3 DS18B20内部框图
DS18B20有4个主要的数据部件:
① 64位激光ROM。64位激光ROM从高位到低位依次为8位CRC、48位序列号和8位家族代码(28H)组成。
② 温度灵敏元件。
③ 非易失性温度报警触发器TH和TL。可通过软件写入用户报警上下限值。
④ 配置寄存器。配置寄存器为高速暂存存储器中的第五个字节。DS18B20在0工作时按此寄存器中的分辨率将温度转换成相应精度的数值,其各位定义如图所示。
TM
R1
R0
1
1
1
1
1
MSB
DS18B20配置寄存器结构图
LSB
其中,TM:测试模式标志位,出厂时被写入0,不能改变;R0、R1:温度计分辨率设置位,其对应四种分辨率如下表所列,出厂时R0、R1置为缺省值:R0=1,R1=1(即12位分辨率),用户可根据需要改写配置寄存器以获得合适的分辨率。
配置寄存器与分辨率关系表 :
R0
R1
温度计分辨率/bit
最大转换时间/us
0
0
9
93.75
0
1
10
187.5
1
0
11
375
1
1
12
750
(2) 高速暂存存储器
高速暂存存储器由9个字节组成,其分配如下图所示。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式如图所示。对应的温度计算:当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变为原码,再计算十进制值。
温度低位
温度高位
TH
TL
配置
保留
保留
保留
8位CRC
LSB
DS18B20 存储器映像图
MSB
温度值格式图DS18B20 温度数据表:
23
22
21
20
2-1
2-2
2-3
2-4
MSB
LSB
S
S
S
S
S
26
25
24
对DS18B20的设计,需要注意以下问题
(1)对硬件结构简单的单线数字温度传感器DS18B20 进行操作,需要用较为复杂的程序完成。编制程序时必须严格按芯片数据手册提供的有关操作顺序进行,读、写时间片程序要严格按要求编写。尤其在使用DS18B20 的高测温分辨力时,对时序及电气特性参数要求更高。
(2)有多个测温点时,应考虑系统能实现传感器出错自动指示,进行自动DS18B20 序列号和自动排序,以减少调试和维护工作量。
(3)测温电缆线建议采用屏蔽4 芯双绞线,其中一对线接地线与信号线,另一组接VCC和地线,屏蔽层在源端单点接地。DS18B20 在三线制应用时,应将其三线焊接牢固;在两线应用时,应将VCC与GND接在一起,焊接牢固。若VCC脱开未接,传感器只送85.0 ℃的温度值。
(4)实际应用时,要注意单线的驱动能力,不能挂接过多的DS18B20,同时还应注意最远接线距离。另外还应根据实际情况选择其接线拓扑结构。
3 系统总体方案及硬件设计
3.1 AT89S52单片机的最小相系统
图 4 STC89C52最小相系统
3.2 DS18B20的I/O接线图
图 5 DS18B20接线图
3.3 数据显示部分
图 6数据显示部分
3.4整体电路
见附件三:系统原理图
4 软件设计
4.1 概述
整个系统的功能是由硬件电路配合软件来实现的,当硬件基本定型后,软件的功能也就基本定下来了。从软件的功能不同可分为两大类:一是监控软件(主程序),它是整个控制系统的核心,专门用来协调各执行模块和操作者的关系。二是执行软件(子程序),它是用来完成各种实质性的功能如测量、计算、显示、通讯等。每一个执行软件也就是一个小的功能执行模块。这里将各执行模块一一列出,并为每一个执行模块进行功能定义和接口定义。各执行模块规划好后,就可以规划监控程序了。
首先要根据系统的总体功能和键盘设置选择一种最合适的监控程序结构,然后根据实时性的要求,合理地安排监控软件和各执行模块之间地调度关系。
4.2 主程序方案
主程序调用了数码管显示程序、温度测试程序、中断控制程序、多机串口通讯等程序。
温度测试程序:对温度芯片送过来的数据进行处理,进行判断和显示。
数码管显示程序:向数码的显示送数,控制系统的显示部分。
串口通讯程序:实现上位机与下位机通讯。
将各个功能程序以子程序的形式写好,当写主程序的时候,只需要调用子程序即可。将功能程序段写成子程序的形式,使得程序结构清晰,无论是修改还是维护都比较方便,除了方便调用之外,还有一个好处那就是以后写程序的时候如果要用到,就可以直接调用这个单元功能模块。
4.3 DS18B20的相处理子程序
4.3.1 DS18B20初始化子程序
DS18B20的使用必须遵循初始化到 ROM操作命令到存储器操作命令的规定协议。每完成一次测温,要重新进行初始化。单片机先发一个复位脉冲,保持低电平时间最少 480μs,最多不能超过960μs。然后,单片机释放总线,等待 DS18B20的应答。DS18B20在接收到复位脉冲后等待15~60μs发出应答脉冲,应答脉冲持续60~240μs。
4.3.2 DS18B20写控制字子程序
当主机把数据线从逻辑高电平拉到逻辑低电平的时候,写时间开始。写一位数据最少需要60μs,两个数据位之间最少有 1μs的间隔。I/O总线拉低后,DS18B20在15μs后开始采样,如果线上是高电平,就写1,如果线上是低电平,就写0,写时间需要15~75μs,且在 2次独立的写时间之间至少需要 1μs的恢复时间。
4.3.3 DS18B20读出温度子程序
当主机把数据线从高电平拉到低电平时,读时间开始。读出温度子程序的主要功能是读出 RAM中的 9字节,在读出时需进行 CRC校验,校验有错时不进行温度数据的改写。读时间需15~60 μs,且在 2次独立的读时间之间至少需要 1 μs的恢复时间。DSl8B20在读时间开始 15μs后开始采样总线电平。
4.3.4 DS18B20温度转换子程序
温度转换命令子程序主要是发温度转换开始命令,DS18B20用 12位存贮温度值,最高位为符号位,低四位为小数,最高精度可达 0.0625度。温度数据转换完成的任务是把用二进制表示的温度转换成 1个字节的两位压缩 BCD码。转换的方法有两种,一种是通过计算,另一种是通过查表,该装置设计方案采用前者。计算温度子程序温度读取值进行 BCD码的转换运算,并进行温度值正负的判断。
4.4 各模块工作流程图
4.4.1 上位机工作过程
图 7 上位机工作流程图
4.4.2 DS18B20工作过程
图 8 DS18B20工作流程图
本次通讯中,测控系统分位上位机和下位机之间的通信,系统中单片机负责数据采集、处理和控制,上位机进行现场可视化检测,通信协议采用半双工异步串行通信方式,通过RS232的RTS信号进行收发转换,传输数据采用二进制数据,上位机与下位机之间采用主从式通讯。
4.4.3 下位机接收过程
图 9 下位机工作流程图
下位机采用的是单片机基于数字温度传感器DS18B20的系统。DS18B20利用单总线的特点可以方便的实现多点温度的测量,轻松的组建传感器网络,系统的抗干扰性好、设计灵活、方便,而且适合于在恶劣的环境下进行现场温度测量。本系统可以应用在大型工业及民用常温多点监测场合。如粮食仓储系统、楼宇自动化系统、温控制程生产线之温度影像检测、医疗与健诊的温度测试、空调系统的温度检测、石化、机械等。
5 课程设计体会
辛苦忙碌了几天,我们的单片机课程设计课题也告一段落,设计实物也基本达到预期的效果。这次课程设计是我们分析和解决问题的能力进一步提升,在硬件和软件调试过程中,学到了许多书本上不可能学到的知识。
这次做课程设计的经历会使我们终身受益,我们感受到做论文是要真真正正用心去做的一件事情,是真正的自己学习的过程和研究的过程,没有学习就不可能有研究的能力,没有认真研究,就不会有所突破,希望这次的经历能让我们在以后学习中激励着我们继续进步。
6 参考文献
(1) 宏晶科技 STC Microcontroller Handbook, 2007
(2) 数字温度传感器DS18B20及其应用.pdf
(3) 郭天祥,新概念51单片机C语言教程,电子工业出版社,2013
附件一:源程序代码
上位机源程序
/**************************
晶振频率: 11.0592 M
串口波特率: 9600 bps
监测温度范围:
command :
0x00 从机向主机发送数据
0xfe 主机命令从机报警
0xff 主机使从机置位
Key1:查询当前温度上限
Key2:当前温度上限加0.1
Key3:当前温度上限减0.1
Key4:查询当前温度下限
Key5:当前温度上限加0.1
Key6:当前温度上限减0.1
***************************/
# include<reg52.h>
# define uint unsigned int
# define uchar unsigned char
# define SLAVE1 0x01 //从机1地址
# define SLAVE2 0x02 //从机2地址
sbit H1 = P3^6; //键盘第一行
sbit H2 = P3^7; //键盘第二行
sbit led_T = P2^0; //闪烁led
sbit Alarm1 = P2^1; //1#机报警led
uint T = 275; //当前温度值的10倍
uint T_up = 307; //温度上限值的10倍
uint T_blew = 204; //温度下限值的10倍
char bai,shi,ge;
char num;
uchar code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极数码管编码表
uint temp1,temp2;
void delayms(uint xms);
void display(uint T, char address);
void key_scan();
void init();
void error();
uint master(char address, char command);
uchar k=10;
void main()
{
init();
while(1)
{
key_scan();
T = master(0x01,0x00);
do
{
display(T,0x06);
k--;
}while(k);
k=10;
}
}
/***************************
毫秒级延时函数
****************************/
void delayms(uint xms)
{
uint i,j;
for(i = xms; i > 0; i--)
for(j = 110; j > 0; j--);
}
/*********************************
数码管显示函数:
char Tem 温度值
char address 从机号(从机地址)
**********************************/
void display(uint Tem, char address)
{
bai = Tem/100;
shi = Tem%100/10;
ge = Tem%10;
P1 = address+0x80;
P0 = 0xfe;
delayms(5);
P1 = table[bai];
P0 = 0xfd;
delayms(5);
P1 = table[shi]+0x80;
P0 = 0xfb;
delayms(5);
P1 = table[ge];
P0 = 0xf7;
delayms(5);
}
/********************************
键盘扫描函数
*********************************/
void key_scan()
{
uchar temp;
H1 = 0;
H2 = 1;
temp = P0;
temp = temp&0xe0;
if(temp != 0xe0)
{
temp = P0;
temp = temp&0xe0;
if(temp!=0xe0)
{
temp = P0;
temp = temp&0xe0;
switch(temp)
{
case 0xa0:
T_up++;
break;
case 0x60:
T_up--;
break;
case 0xc0:
;
break;
}
while(temp != 0xe0)
{
display(T_up,0x63);
temp = P0;
temp = temp&0xe0;
}
P1 = 0x00;
}
}
H1 = 1;
H2 = 0;
temp = P0;
temp = temp&0xe0;
if(temp != 0xe0)
{
temp = P0;
temp = temp&0xe0;
if(temp != 0xe0)
{
temp = P0;
temp = temp&0xe0;
switch(temp)
{
case 0xa0:
T_blew++;
break;
case 0x60:
T_blew--;
break;
case 0xc0:
;
break;
}
while(temp != 0xe0)
{
display(T_blew,0x5c);
temp = P0;
temp = temp&0xe0;
}
P1 = 0x00;
}
}
}
/***********************************
初始化函数
初始化串口:工作方式3,波特率9600 bps
初始化定时器:定时器0,工作方式1,定时器1,工作方式2
************************************/
void init()
{
TMOD = 0x21;
TL0 = (65536-45872)%256;
TH0 = (65536-45872)/256;
TL1 = 0xfd;
TH1 = 0xfd;
TR0 = 1;
TR1 = 1;
ET0 = 1; //开定时器0中断
SCON = 0xd8;
EA = 1;
}
/*********************************
地址出错处理
**********************************/
void error()
{
SBUF = 0xff;
while(TI != 1);
TI = 0;
}
/*********************************
串口通信函数
**********************************/
uint master(char address, char command)
{
SBUF = address;
while(TI != 1); //等待发送完毕
TI = 0;
while(RI != 1); //等待接收完毕
RI = 0;
if(address != SBUF)
error(); //若地址错,则发复位信号
else //地址相符
{
TB8 = 0; //清零地址标志位
SBUF = command;
while(TI != 1);
TI = 0;
while(RI != 1);
RI = 0;
temp1=SBUF;
while(RI != 1);
RI = 0;
temp2=SBUF;
T=temp2*256+temp1;
if(T<=T_blew || T>=T_up)
{
Alarm1=0;
SBUF=0xfe;
while(TI != 1)
;
TI = 0;
}
else
{
Alarm1=1;
SBUF=0xfc;
while(TI != 1)
;
TI = 0;
}
}
TB8 = 1;
return T;
}
/*********************************
定时器0中断函数
**********************************/
void T0_timer() interrupt 1
{
TMOD = 0x21;
TL0 = (65536-45872)%256;
TH0 = (65536-45872)/256;
num++ ;
if(num == 10)
{
num = 0;
led_T = ~led_T;
}
}
下位机源代码
# include <reg52.h>
# include <stdio.h>
# define uchar unsigned char
# define uint unsigned int
# define SLAVE1 0x01
char temp[]={0,0};
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极数码管编码表
uint T = 200; //当前温度值的10倍
uchar re;
char num;
char bai,shi,ge;
sbit ds = P2^2; //温度传感器信号线
sbit dula = P2^6;
sbit wela = P2^7;
sbit Alarm = P1^6; //报警led
sbit led_T = P1^7; //闪烁led
void delayms(uint xms);
void display(uint Tem, char address);
void init(); //初始化函数
void ds_reset(); //ds18b20复位函数
bit tem_read_bit();
uchar tem_read_byte(); //读一个字节函数
void tem_write_byte(uchar dat); //写一个数据函数
void tem_change();
uint get_tem();
void main()
{
init();
while(1)
{
tem_change(); //温度转换函数
T = get_tem();
temp[0] = T;
temp[1] = T>>8;
display(T,1);
}
}
/***************************
毫秒级延时函数
****************************/
void delayms(uint xms)
{
uint i,j;
for(i = xms; i>0; i--)
for(j = 110; j>0; j--);
}
/*********************************
数码管显示函数:
char Tem 温度值
char address 从机号(从机地址)
**********************************/
void display(uint Tem, char address)
{
bai = Tem/100;
shi = Tem%100/10;
ge = Tem%10;
dula = 1;
P0 = table[address]+0x80;
dula = 0;
P0 = 0xff; //消影
wela = 1;
P0 = 0xfe;
wela = 0;
delayms(20);
dula = 1;
P0 = table[bai];
dula = 0;
P0 = 0xff; //消影
wela = 1;
P0 = 0xfd;
wela = 0;
delayms(20);
dula = 1;
P0 = table[shi]+0x80;
dula = 0;
P0 = 0xff; //消影
wela = 1;
P0 = 0xfb;
wela = 0;
delayms(20);
dula = 1;
P0 = table[ge];
dula = 0;
P0 = 0xff; //消影
wela = 1;
P0 = 0xf7;
wela = 0;
delayms(20);
}
/***********************************
初始化函数
初始化串口:工作方式3,波特率9600 bps
初始化定时器:定时器0,工作方式1,定时器1,工作方式2
************************************/
void init()
{
TMOD = 0x21;
TL0 = (65536-45872)%256;
TH0 = (65536-45872)/256;
TL1 = 0xfd;
TH1 = 0xfd;
TR0 = 1;
TR1 = 1;
ET0 = 1; //开定时器0中断
SCON = 0xf0;
PS = 1;
ES = 1;
EA = 1;
}
/*********************************
ds18b20复位函数
**********************************/
void ds_reset(void)
{
uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
/*********************************
读一位数据函数
**********************************/
bit tem_read_bit(void)
{
uint i;
bit dat;
ds=0;i++;
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return (dat);
}
/*********************************
读一字节函数
**********************************/
uchar tem_read_byte(void)
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tem_read_bit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面
}
return(dat);
}
/********************************
写一字节函数:
向18B20写一个字节数据
*********************************/
void tem_write_byte(uchar dat)
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //写 1
{
ds=0;
i++;i++;
展开阅读全文