AVR数字温度传感器实验报告

时间:2024.4.5

南京邮电大学

2010 /2011  学年 第 1 学期

课程设计:实验报告

   

模  块  名  称  AVR单片机课程设计

专          业      网络工程      

学  生  班  级       B080221      

学  生  学  号       B080221xx     

学  生  姓  名        XXXXX     

指  导  教  师  李虹戴海鸿杨洁王明伟

日期: 20##年11月29日 至 20##年12月25日

AVR单片机课程设计报告

一.课程设计目的

1、设计要求

    本课程着重于把理论学习的知识应用于实际,解决实际的工程问题,培养学生的系统设计能力,提高学生的科研动手能力。本次设计要求深入了解AVR单片机ATmega128的功能,通过研究开发板的硬件设计,进行相关的硬件连接,选择合适的编程及程序植入方法,用开发板完成列出的各设计课题;初步学习撰写规范的设计文档;提交实验报告。

二.课程设计内容(具体的课题内容、完成要求、相关软件介绍等)

1、基本要求:

1、  正确连接数字温度传感器DS18B20,采集温度数据在数码管、LCD1602上显示或通过串口将数据传递至PC。

2、  记录间隔可任意设定(1S到1h,步长1s),能按设定时间存储数据。

    3、设定温度告警门限。

4、通过蜂鸣器、发光二极管进行告警显示。

2、相关软件介绍

(1)ICCAVR简介。

简而言之,ICCAVR是一个进行C代码输入和调试的AVR与代码的软件接口,它将若干个“.C”或“.h”文件合并在一起进行联合编译,生成一系列各种格式的文件,这其中“.cof” 和“.hex”文件可以在AVR studio中进行烧制,“.cof”文件还可以在 AVR studio中进行仿真操作。

2AVR studio简介。

AVR studio是与硬件进行直接交互的软件,在对其进行合理设置(选芯片,连端口)以后,它可以对ICCAVR生成的“.cof” 和“.hex”文件分别进行仿真和烧制。当成功烧制到EasyAVR板当中之后,单片机可以通过AVR studio中的文件内容实现相应的功能。

三.课程设计过程

1.设计原理和思想。

本实验可以分为三个部分来考虑:

1、温度传感器DS18B20采集温度显示在LED上。

2、设定温度告警门限。通过蜂鸣器、发光二极管进行告警显示。

3、添加按键控制温度警告门限和各功能汇总。

做温度采集时,要深刻了解DS18B20的作用,并且能与后面的LED例程能够好好结合。

在做LED动作组设计的时候,关键思想是使用循环或者嵌套循环来写程序,从第一个灯到最后一个灯分别先后完成一系列相关动作(调用循环语句可以使LED灯按照一定顺序形成一个“流程”,这对于顺序的控制尤为关键);而关键语句则是对端口的一些与、或、非操作(端口是由两位十六进制数表示的PORTE,与、或、非等操作使端口值静态地置为下一步的值,这些操作可以很好地控制LED灯的亮灭效果,达到预期目的)。将这两种方法结合很容易获取一切所需要的效果。

7位数码管的设计有三个步骤:一是对4位数码管的数值进行赋值(EasyAVR公司的库函数中定义了若要管显示0-9直接赋值,若让管灭赋值16),并调用Seg7_Led_Update();语句进行更新,数值就会短暂地出现在管中;二是使用循环使数值在管上停留一段时间,让人眼能清晰地感应到数值的存在;三是适时地对管上的数值进行改变,使其完成带补位的左移效果和单字左移效果等等。

按键控制的思路是用key.c中的get_key()函数来读入按键,然后用case语句来判断按的是哪个按键;再设置标识符来观测是第几次进入同一个case(即第几次按同一个键),若对同一个按键进行多次触发,控制单片机实现不同的效果,并设置递归使按满三次后还原为第一个效果重新执行。

2、 硬件原理图的介绍。

LED

                                

 

KEY按键控制

SEG7四位七段数码管

DS18B20测温模块

3软件方面程序流程图的设计。

                                                

 

                                                                              

              S4                          S3                     S2                 S1

 

4、关键代码介绍。

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

文件:main.c

用途:

注意:内部8M晶振

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

#include "config.h"

unsigned char i=0,j;

unsigned char LED_table[]={0xFF,0x00,0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,

                           0xFF,0x00,0xFF,0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,

                                             0xFF,0x00,0xFF,0x7E,0xBD,0xDB,0xE7,0xFF,0x00,0xE7,0xDB,

                                             0xBD,0x7E,0xFF,0x00};

void main(void)

{

 float temp=0.0;

  unsigned char Key;

Key_init();

HC_595_init();

 init_1820();

temp=gettemp();

 delay_nms(1000);

 while(1)

      {

               temp=gettemp();

               Seg7_Led_float(temp);

               deal_temp((unsigned char)(temp));

               led();

               for(j=0;j<50;j++)        //产生灯延时

               {

                    Seg7_Led_float(temp);

                   deal_temp((unsigned char)(temp));

                   delay_nms(5);

                      Seg7_Led_float(temp);

                   deal_temp((unsigned char)(temp));

               }

       }

 while(1)

      {

       Seg7_Led_float(temp);

        Key=get_key();

        switch(Key)

             {

               case ( ((1<<S4)^0xF0) ):

                                                                     {

                                                                         ++temp;

                                                                         break;

                                                                        }

               case ( ((1<<S3)^0xF0) ):

                                                                     {

                                                                         --temp;

                                                                         break;

                                                                        }

               case ( ((1<<S2)^0xF0) ):

                                                                     {

                                                                        Seg7_Led_float(temp);

                                                                         break;

                                                                        }

               case ( ((1<<S1)^0xF0) ):

                                                                     {

                                                                        Seg7_Led_float(temp);

                                                                         break;

                                                                        }

               default:

                            {

                              break;

                             }

              }

             

       }

}

void led(void)

{

 DDRE=0xff;

 PORTE=0xff;

 if(i==36)

    i=0;

 PORTE = LED_table[i++];

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

文件:18b20.c

用途:

注意:

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

#include "config.h"

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

** 函数名称: void init_1820(void)

** 功能描述: 18b20初始化

** 输 入: 无

** 全局变量: 无

** 调用模块: 无

** 说明:

** 注意:

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

void init_1820(void) 

    TEM_DDR &=~ (1<<TEM_SDT);

       SET_TEM_DDR;      //设置数据端口为输出

    SET_TEM_SDT;

    CLR_TEM_SDT; 

    delay_nus(480);    //480us以上

    SET_TEM_SDT; 

    CLR_TEM_DDR; 

    delay_nus(20);     //15~60us 

    while(CHECK_TEM_SDT); 

    SET_TEM_DDR; 

    SET_TEM_SDT; 

    delay_nus(140);    //60~240us 

}

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

** 函数名称: void write_1820(unsigned char data)

** 功能描述: 向18b20写入1B的数据

** 输 入: unsigned char data 要写入的数据

** 全局变量: 无

** 调用模块: 无

** 说明:

** 注意:

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

void write_1820(unsigned char data) 

{

    unsigned char i; 

    for(i=0;i<8;i++) 

    { 

       CLR_TEM_SDT;  //从高到低,产生写间隙

       if(data&(1<<i))    //写数据,先写低位

               SET_TEM_SDT; 

       else 

         CLR_TEM_SDT; 

       delay_nus(40);     //15~60us 

       SET_TEM_SDT; 

    } 

    SET_TEM_SDT; 

}

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

** 函数名称: unsigned char read_1820(void)

** 功能描述: 从18b20读出1B的数据

** 输 入: 无

** 全局变量: 无

** 调用模块: 无

** 说明:

** 注意:

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

unsigned char read_1820(void) 

{     

    unsigned char temp,k,n; 

    temp=0; 

    for(n=0;n<8;n++) 

    {

      CLR_TEM_SDT; 

      SET_TEM_SDT;  //从高到低再到高,产生读间隙

      CLR_TEM_DDR;           //设为输入 

      k=CHECK_TEM_SDT;       //读数据,从低位开始 

      if(k) 

        temp|=(1<<n); 

      else 

        temp&=~(1<<n); 

      delay_nus(50);         //60~120us     

      SET_TEM_DDR;  //设为输出

    } 

   return (temp); 

}

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

** 函数名称: unsigned char gettemp(void)

** 功能描述: 返回温度值

** 输 入: 无

** 全局变量:

** 调用模块: 无

** 说明:wmh为温度的高位,wml为温度的低位,返回值为温度值,范围0~99摄氏度,字符型

** 注意:

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

float gettemp(void)         //读取温度值

     float t;

     unsigned char temh,teml,wm0,wm1,wm2,wm3,wmh,wml;

        int temp;

     init_1820();        //复位18b20 

     write_1820(0xCC);   // 跳过ROM

     write_1820(0x44);  // 温度变换

     init_1820();

     write_1820(0xCC);  // 跳过ROM

     write_1820(0xbe);  // 写暂存存储器

     teml=read_1820();  //读数据 

     temh=read_1820(); 

     //wm0=teml>>4;       //只要高8位的低四位和低8位的高四位,温度范围0~99

    // wm1=temh<<4;

     temp=temh;

     temp<<=8;             //两个字节组合为1个字

     temp=temp|teml;

     t=temp*0.0625;   //温度在寄存器中是12位,分辨率是0.0625

     temp=t*10+0.5;

     return t;

    /* wm2=wm1+wm0;        //16进制转10进制

     wm3=wm2/100;

     wmh=(wm2%100)/10;   //wmh是显示的高位,wml是显示的低位

     wml=(wm2%100)%10;

        temp=wmh*10+wml;

        

        return temp;*/

}

void deal_temp(unsigned char tmp)      //处理函数,当前温度与温度上下限比较

{

    DDRG|=(1<<4);      //蜂鸣器端:PG4

       if(tmp!=85)

       {

              if(tmp>=TEM_MAX)

              {                    

                     PORTG|=(1<<4);

                     delay_nus(80);

                     PORTE=0xf0;//警告灯:PE

                     PORTG=0;delay_nus(200);

              }

              else if(tmp<=TEM_MIN)

              {

                     PORTG|=(1<<4);

                     delay_nus(100);

                     PORTE=0x0f;//警告灯:PE

                     PORTG=0;

                     delay_nus(100);

              }

       }

}

5调试过程

调试过程中发生了许多显示效果不佳的状况或者bug,下面都一一列举。

a/实验时遇到了闪烁时间不够长的问题,先是试图用中断置初值控制定时长度解决这一问题,可是程序功能如此庞大,又设计按键控制,若全置于中断中实现显然难度很大。于是改用多次调用增加延时的办法,同样一句语句,多次循环调用后便有很好的显示效果,显示的数字清晰可见又避免了中断的复杂。

b/实验时出现了很多由自己设计不缜密造成的恶劣效果,都加以改善。如第一个按键的功能执行完直接跳入第二个按键功能,是因为case中缺少break语句造成的失误,补上break后做完直接跳出,等待下一个按键触发之后才会继续有灯亮起。

6最终的实现结果分析。

1.能够在LED上显示瞬时温度。

2. 可以通过改动程序来实现改变记录温度间隔。

3.在高于警告温度时,单片机的后四位警告灯亮,低于警告温度时候,前四位亮。

4.按下A键,能够在初始设置的高温警告温度的基础上加一,按几下加几,来提升警告温度门限。

5. 按下B键,能够在初始设置的高温警告温度的基础上减一,按几下减几,来提降低告温度门限。

6.按下C键,能够在初始设置的低温警告温度的基础上加一,按几下加几,来提升警告温度门限。

7. 按下D键,能够在初始设置的低温警告温度的基础上减一,按几下减几,来提降低告温度门限。

四.课程设计总结(收获、心得、建议等)

在通过本次课程中,我们遇到很多问题,但是与此同时,我们也学到了很多,对于本次课题的心得体会,我们觉得有以下几点:

1、不管做什么事,计划是很重要的。没有一个完好的计划,做事情就会没有一个好的顺序,做事情会比较乱,很难成功。而有一个好的计划,不管做什么事都会事半功倍,做事心中有数,明确重点和缓急,不会有疏漏。这样才能提高成功率。

2、做事要多动脑,选出最好的方法。一件事往往有多种解决方法,一个好的方法,不仅能使事情事半功倍,而且往往决定最后的成与败,所以做事时一定要多动一下脑筋,想出最好的方法。

3、要注意细节。细节决定成败,这句话在这次课题中不仅一次得到了印证,特别是在软件的编程过程中,一点点的错误就会使你整个程序不能运行。因此我们不仅仅要有整体意识,也要注意细节,不要因一个关键地方的一个细节而导致满盘皆输。

4、团队合作很重要。团队做一件事时,要发挥出门一个人的长处。人无完人,但一个团队可以互相帮助,互相补充,只要互相合作,个人完成各自专长的,离成功就只有一步之遥。人人总是有疏漏的方面,但是只要互相合作,互相交流,就会考虑问题更全面化,在本次课题中,我们组团结合作不仅事半功倍,而且发现了一些好的有趣的构想,是我们对单片机有了更浓的兴趣。

5、最后,也是最重要的一点,通过这次课题,我们学到了很多有关单片机方面的知识,也对单片机有了更深入的了解。使我们受益匪浅。

五.参考资料

EasyAVR公司的一些官方资料:

《面向新手的AVR开发工具,及基本知识》

《EasyAVR M128 底板原理图》

《ICCAVR 软件中文说明书》

《EasyAVR M128 V2 快速入门》

以及学校资料:

《AVR开发板的硬件注意事项》

六.实验心得

   在做AVR单片机实验之前,我对单片机的设计以及编程都没有太多的了解,虽然学过单片机这门课程,但是没有过实践,当自己做实验时,还是遇到了很多困难,比如在实验初期对AVRstudio软件不熟悉,无从下手,到实验时,代码多处错误而无法排错,多谢了老师对我的指导点拨,最后实验才能完成。 

   通过这次AVR实验,使我学到了不少实用知识,更重要的是,做实验的过程,思考问题的方法,这与做其他实验都是通用的,使我受益匪浅。

更多相关推荐:
大学物理实验-温度传感器实验报告

关于温度传感器特性的实验研究摘要温度传感器在人们的生活中有重要应用是现代社会必不可少的东西本文通过控制变量法具体研究了三种温度传感器关于温度的特性发现NTC电阻随温度升高而减小PTC电阻随温度升高而增大但两者的...

大学实验报告系列之温度传感器

大学物理实验报告注1所有电子版实验报告必须使用统一摸版内容按统一规定编辑2学院班姓名等用宋体正文五号不要加粗3实验名称用宋体正文四号不要加粗4其余项目统一用宋体正文五号不要加粗5报告内容中出现英文字母或英文单词...

温度传感器实验报告

温度传感器DS18B20实验报告一实验目的12复习掌握Protueskeil软件的使用了解掌握DS18B20的工作原理以及编程方法二实验器材单片机开发板温度传感器芯片DS18B20串口线三实验原理一应用背景概述...

温度传感器实验报告

温度传感器实验报告摘要温度是表征物体冷热程度的物理量一般只能通过物体随温度变化的某些特征来间接测量温度传感器就是将温度信号转换成易于传递和处理的电信号的器件本实验通过对热电阻特性对热电阻温差电动势以及对PN结正...

温度传感器实验报告

电子092班林楚狄32号温度传感器实验报告一实验目的1了解各种电阻的特性与应用2了解温度传感器的基本原理与应用二实验器材传感器特性综合实验仪温度控制单元温度模块万用表导线等三实验步骤1AD590温度特性1将主控...

温度传感器实验报告

电子092班林楚狄32号温度传感器实验报告一实验目的1了解各种电阻的特性与应用2了解温度传感器的基本原理与应用二实验器材传感器特性综合实验仪温度控制单元温度模块万用表导线等三实验步骤1AD590温度特性1将主控...

温度传感器实验报告

信号实验报告温度传感器实验光纤光电传感器实验电涡流传感器实验电容式传感器实验蔡达38030414温度传感器实验蔡达38030414一实验目的了解各种温度传感器热电偶铂热电阻PN结温敏二极管半导体热敏电阻集成温度...

温度传感器实训报告

温度传感器实训报告实训报告课程信号检测与技术专业应用电子技术班级应电1131班小组成员欧阳主王雅志朱知荣周玙旋周合昱指导老师宋晓虹老师20xx年4月23日一实训目的了解18b20温度传感器的基本原理与应用二实训...

传感器实验报告--半导体温度传感器设计

工程测试技术课程设计报告学部机械与电子信息学部姓名班级机械四班学号2500090402指导老师成绩20xx年1月1日半导体温度传感器设计一设计目的通过本课程的设计使学生更进一步了解有关温度传感器的工作原理加工工...

温度控制器实验报告

目录第1节引言211温度控制器的概述212设计目的任务及要求2第2节系统硬件设计221芯片的选择222系统工作原理423系统的硬件构成及功能5231温度控制器总体电路图5232单元电路功能简介错误未定义书签第3...

温度传感器的制作检测报告

温度传感器放大电路设计实验姓名方海斌班级机自学号110220xx020xx204指导老师胡雄心一设计要求要求以小组为单位设计并制作一个温度检测与放大的电路然后进行检测二设计过程1本小组温度传感器与放大电路的原理...

单片机温度控制器实验报告

南京邮电大学通达学院20xx20xx学年第1学期课程设计实验报告课题名称基于CPU的8LED温度显示控制器的设计专业通信工程学生班级070018学号07001836姓名指导老师林建中实验日期20xx年11月19...

温度传感器实验报告(35篇)