单片机课程实习报告

DONGFANG COLLEGE,FUJIAN AGRICULTURE AND FORESTRY UNIVERSITY

课程实习报告

系    别:        计算机系      年    级: 20##

专    业:            电子信息工程             

班    级:     2     学    号:     

姓  名:                                

成    绩:                                      

任课教师:                               

20##年 1 月  3日


前言

随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。
   现代社会对各种信息参数的准确度和精确度的要求都有了几何级的增长,而如何准确而又迅速的获得这些参数就需要受制于现代信息基础的发展水平。在三大信息信息采集(即传感器技术)、信息传输(通信技术)和信息处理(计算机技术)中,传感器属于信息技术的前沿尖端产品,尤其是温度传感器技术,在我国各领域已经引用的非常广泛,可以说是渗透到社会的每一个领域,人民的生活与环境的温度息息相关,在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要的意义。

测量温度的关键是温度传感器,温度传感器的发展经历了三个发展阶段:

①传统的分立式温度传感器

②模拟集成温度传感器

③智能集成温度传感器。

目前的智能温度传感器(亦称数字温度传感器)是在20世纪90年代中期问世的,它是微电子技术、计算机技术和自动测试技术(ATE)的结晶,特点是能输出温度数据及相关的温度控制量,适配各种微控制器(MCU)。社会的发展使人们对传感器的要求也越来越高,现在的温度传感器正在基于单片机的基础上从模拟式向数字式,从集成化向智能化、网络化的方向飞速发展,并朝着高精度、多功能、总线标准化、高可靠性及安全性、开发虚拟传感器和网络传感器、研制单片测温系统等高科技的方向迅速发展,本文将介绍智能集成温度传感器DS18B20的结构特征及控制方法,并对以此传感器,89S51单片机为控制器构成的数字温度测量装置的工作原理及程序设计作了详细的介绍。与传统的温度计相比,其具有读数方便,测温范围广,测温准确,输出温度采用数字显示,主要用于对测温要求比较准确的场所,或科研实验室使用。该设计控制器使用ATMEL公司的AT89S52单片机,测温传感器使用DALLAS公司DS18B20,用数码管来实现温度显示。

目录

前言………………………………………………………………………………2

目录………………………………………………………………………………3

一、实习目的……………………………………………………………………4

二、实习时间……………………………………………………………………4

三、实习地点……………………………………………………………………4

四、实习内容……………………………………………………………………5

(一)DS18B20温度传感器了解…………………………………………4

1. 智能温度传感器DS18B20的性能特点…………………………4

2. DS18B20的内部结构………………………………………………5

  

(二)实验原理……………………………………………………………5

     

(三)电路设计……………………………………………………………6

    (四)程序编写……………………………………………………………7

五、实习总结……………………………………………………………………8

附件1:程序代码

附件2:实习结果

基于数字温度传感器的数字温度计

一、实习目的

    利用数字温度传感器DS18B20与单片机结合来测量温度。利用数字温度传感器DS18B20测量温度信号,计算后在LED数码管上显示相应的温度值。其温度测量范围为?55℃~125℃,精确到0.5℃。数字温度计所测量的温度采用数字显示,控制器使用单片机AT89C51,测温传感器使用DS18B20,用3位共阳极LED数码管以串口传送数据,实现温度显示。

二、实习时间

20##年1月3日

三、实习地点

福建农林大学东方学院生活区学生宿舍5#203

四、实习内容

(一)DS18B20温度传感器了解

     1. 智能温度传感器DS18B20的性能特点:

(1) 独特的单总线接口仅需要一个端口引脚进行通信,可以是串行口也可以是其他I/O口,无须变换,直接输出被测温度值(9位二进制,含符号位)。 多个DS18B20可以并联挂接在一条总线上,实现实现多点温度采集检测功能;

(2)可测温度范围为-55~+125℃,测量分辨率为0.0625℃;

(3) 内含64位经过激光修正的只读存储器ROM;

(4) 内含寄生电源,可直接通过数据总线供电,电压范围为3.0~5.5V;

(5) 零待机功耗;

(6)用户可通过编程分别设定各路的温度上、下限温度值来实现报警功能;

(7) 适配各种微处理器;

(8) 报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;

(9) 负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;

(10) 可检测距离远,最远测量距离为150m 。

   

     2. DS18B20的内部结构

DS18B20的内部结构如图3-1所示。 DS18B20内部结构主要由四部分组成:64位光刻ROM,温度报警触发器,温度传感器以及高速缓存器。

 64位光刻ROM。64位光刻ROM是出厂前已被刻好的,它可以看做是该DS18B0的地址序列号,不同的器件不一样,64位的地址序列号的构成如表2-1所示。开始8位是产品序列号代表产品的序列,接着48位产品序号代表同一系列产品的不同产品,最后8位是前56位的CRC校验码,所以不同的器件的地址序列号各不一样这也是多个DS18B20可以采用一线进行通信的原因(8位CRC编码的计算公式为CRC=X+X+X+1)。在64 b ROM的最高有效字节中存储有循环冗余校验码(CRC)。主机根据ROM的前56位来计算CRC值,并和存入DS18B20中的CRC值做比较,以判断主机收到的ROM数据是否正确。

(二)实验原理

从温度传感器DS18B20可以很容易直接读取被测温度值,进行转换即满足设计要求。

DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字读数方式。

DS18B20的性能如下。

(1)独特的单线接口仅需要一个端口引脚进行通信。

(2)多个DS18B20可以并联在串行传输的数据线上,实现多点组网功能。无须外部器件。

(3)可通过数据线供电,电压范围为3.0~5.5V。

(4)零待机功耗。

(5)温度以9或12位的数字读数方式。

(6)用户可定义报警设置。

(7)报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件。

(8)负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。

(9)采用3引脚PR-35封装或8引脚SOIC封装。

                                   

(三)电路设计

本项目制作的数字温度计电路原理图,如下所示

(四)程序编写

1. 在单片机应用开发中代码使用效率、单片机的抗干扰性以及软件可靠性是实际工程设计的重点。

    单片机应用软件系统设计包括功能模块划分、程序流程确立、模块接口设计以及程序代码编写。我们依据系统的功能要求,将整体软件系统分割成若干个独立的程序模块。这些程序模块可以是几条语句的集合、功能函数或程序文件。随后,根据个程序模块的实现功能写出流程,一般需要写出具体的实现功能描述。程序代码通常采用汇编语言或高级语言(C语言)编写。

    本课题采用C语言编程,在此必须注意以下问题:

2.提高程序代码效率

必须熟悉当前使用的C语言编译器,试验每条C语言编译以后对应的汇编语言的语句行数,这样就可以很明确的知道代码效率。

3.减少程序错误

我们在编写程序时,要注重考虑如下方面。

[1]物理参数 [2]资源参数 [3]应用参数 [4]过程参数

4.单片机的抗干扰性

防止干扰最有效的方法是去除干扰源、隔离干扰路径。单片机干扰最常见的现象就是复位,导致程序运行异常。设计系统是一般需要添加一个“看门狗”监控模块,在系统出现不可逆转的干扰时,监控模块将重启系统,并从断点处继续执行。

5.系统的可靠性

[1]要测试单片机软件功能的完善性。

[2]上电、掉电测试。

[3]系统耗损测试。

        

五、实习总结

   

这次的课程设计还是让我学到了很多东西,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法。有好多的东西,只有我们去试着做了,才能真正的掌握,只学习理论有些东西是很难理解的,更谈不上掌握。通过这次的单片机课程设计我认识到了,学习要理论联系实际,把学到的理论知识同实际运用相结合,才能是我们的知识融汇贯通,才能真正的学到知识,真正的做到学以致用。

本次设计中我学到了很多知识,用proteus画电路图,在画图过程中快速找到想要的原件等。

在本次设计以单片机为控制器,以温度传感器DS18B20作为检测元件,完成了的电子温度计的制作。这个系统结构简单,性能稳定,可靠性高。本系统已经达到了设计的基本要求和发挥部分的要求。 

    在本次设计的过程中,我们遇到了许多突发事件和各种困难,但通过团队的仔细分析和自我调整后我们终于解决了所有问题,取得了圆满的成功。经过本次课程设计我们对单片机的控制功能有了更深层次的理解,同时也深刻的体会到了共同协作和团队精神的力量所在。我们在本次设计中做到认真细心,完成基本功能。

从这次设计中,我们真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我们在这次设计中的最大收获。

附件1     程序代码

#include<REG52.H>

#define uchar unsigned char

#define uint   unsigned int;

/***********************************************************************/

sbit DQ=P1^7;//ds18b20 端口

sfr dataled=0x80;//显示数据端口,P0

/**********************************************************************/

uchar temp;

uchar flag_get,count,num,minute,second;

uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//7段数码管段码表共阳

uchar  str[3];

/**********************函数声明**********************************/

unsigned char ReadTemperature(void);

uchar Init_DS18B20(void);

unsigned char ReadOneChar(void);

void WriteOneChar(unsigned char dat);

void delay(unsigned int i);

/************************************************************************/

main()

{

TMOD|=0x01;//定时器设置:T0工作在方式1,,16位

TH0=0xef;   //初值

TL0=0xf0;

IE=0x82;   //1000 0010即EA=1,ET0=1

TR0=1;     //启动T0允许

/*T0溢出时,跳到void tim(void) interrupt 1 using 1函数中*/

P2=0x00;  

count=0;

while(1)

{

   str[2]=tab[temp/10]; //十位温度

   str[1]=tab[temp%10]; //个位温度

   str[0]=0xc6;//显示C符号

  if(flag_get==1) 

    {

  temp=ReadTemperature();    //定时读取当前温度

  flag_get=0;

    }

  }

}

/*************************************************************************/

void tim(void) interrupt 1 using 1//T0中断,用于数码管扫描和温度检测间隔

{

TH0=0xef;//定时器重装值

TL0=0xf0;

num++;

if (num==50)

    {num=0;

      flag_get=1;//标志位有效

      second++;

       if(second>=60)

         {second=0;

           minute++; 

          }

      }

count++;

if(count==1)

   { P2=0xfb;              //P2^2

     dataled=str[2];}//数码管扫描

if(count==2)

   { P2=0xfd;              //P2^1

     dataled=str[0];}

if(count==3)

   { P2=0xf7;    //P2^0=0,选中数码管

     dataled=str[1];

     count=0;}

}

/*************************************************************************/

void delay(unsigned int i)//延时函数

{

while(i--);

}

/*************************************************************************/

//18b20初始化函数

uchar Init_DS18B20(void)

{

unsigned char x=0;

DQ = 1;    //DQ复位

delay(8);  //稍做延时

DQ = 0;    //单片机将DQ拉低

delay(80); //精确延时 大于 480us

DQ = 1;    //拉高总线

delay(10);

x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

delay(5);

return (x);

}

/******************************************************************************************/

//读一个字节

unsigned char ReadOneChar(void)

{

unsigned char i=0;

unsigned char dat = 0;

for (i=8;i>0;i--)

{

  DQ = 0; // 给脉冲信号

  dat>>=1;

  DQ = 1; // 给脉冲信号

  if(DQ)

   dat|=0x80;

  delay(5);

}

return(dat);

}

/************************************************************************************************/

//写一个字节

void WriteOneChar(unsigned char dat)

{

unsigned char i=0;

for (i=8; i>0; i--)

{

  DQ = 0;

  DQ = dat&0x01;

  delay(5);

  DQ = 1;

  dat>>=1;

}

delay(5);

}

/*********************************************************************************************************/

//读取温度

unsigned char ReadTemperature(void)

{

unsigned char a=0;

unsigned char b=0;

unsigned char t=0;

//float tt=0;

while(Init_DS18B20());

WriteOneChar(0xCC); // 跳过读序号列号的操作

WriteOneChar(0x44); // 启动温度转换

delay(200);

while(Init_DS18B20());//初始化

WriteOneChar(0xCC); //跳过读序号列号的操作

WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

a=ReadOneChar();

b=ReadOneChar();

b<<=4;

b+=(a&0xf0)>>4;//B是高位,A是低位,T相当于一个字节

t=b;

//tt=t*0.0625;

//t= tt*10+0.5; //放大10倍输出并四舍五入

return(t);

}

附件2 实习结果

  

   仿真图

                    图1DS18B20窗口图             

相关推荐