AVR数字温度传感器实验报告.docx
- 文档编号:6809788
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:17
- 大小:770.32KB
AVR数字温度传感器实验报告.docx
《AVR数字温度传感器实验报告.docx》由会员分享,可在线阅读,更多相关《AVR数字温度传感器实验报告.docx(17页珍藏版)》请在冰豆网上搜索。
AVR数字温度传感器实验报告
南京邮电大学
2010/2011学年第1学期
课程设计:
实验报告
模块名称AVR单片机课程设计
专业网络工程
学生班级B080221
学生学号B080221xx
学生姓名XXXXX
指导教师李虹戴海鸿杨洁王明伟
日期:
2010年11月29日至2010年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”文件可以在AVRstudio中进行烧制,“.cof”文件还可以在AVRstudio中进行仿真操作。
(2)AVRstudio简介。
AVRstudio是与硬件进行直接交互的软件,在对其进行合理设置(选芯片,连端口)以后,它可以对ICCAVR生成的“.cof”和“.hex”文件分别进行仿真和烧制。
当成功烧制到EasyAVR板当中之后,单片机可以通过AVRstudio中的文件内容实现相应的功能。
三.课程设计过程
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、软件方面程序流程图的设计。
开始
显示瞬时温度
设置警告温度值
低温—1
低温+1
高温—1
高温+1
S4S3S2S1
判断瞬时温度是否达到报警温度
超过报警温度报警+闪灯
结束
4、关键代码介绍。
/************************************************
文件:
main.c
用途:
注意:
内部8M晶振
************************************************/
#include"config.h"
unsignedchari=0,j;
unsignedcharLED_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};
voidmain(void)
{
floattemp=0.0;
unsignedcharKey;
Key_init();
HC_595_init();
init_1820();
temp=gettemp();
delay_nms(1000);
while
(1)
{
temp=gettemp();
Seg7_Led_float(temp);
deal_temp((unsignedchar)(temp));
led();
for(j=0;j<50;j++)//产生灯延时
{
Seg7_Led_float(temp);
deal_temp((unsignedchar)(temp));
delay_nms(5);
Seg7_Led_float(temp);
deal_temp((unsignedchar)(temp));
}
}
while
(1)
{
Seg7_Led_float(temp);
Key=get_key();
switch(Key)
{
case(((1< { ++temp; break; } case(((1< { --temp; break; } case(((1< { Seg7_Led_float(temp); break; } case(((1< { Seg7_Led_float(temp); break; } default: { break; } } } } voidled(void) { DDRE=0xff; PORTE=0xff; if(i==36) i=0; PORTE=LED_table[i++]; /************************************************ 文件: 18b20.c 用途: 注意: ************************************************/ #include"config.h" /************************************************************** **函数名称: voidinit_1820(void) **功能描述: 18b20初始化 **输 入: 无 **全局变量: 无 **调用模块: 无 **说明: **注意: **************************************************************/ SET_TEM_SDT; } SET_TEM_SDT; } /************************************************************** **函数名称: unsignedcharread_1820(void) **功能描述: 从18b20读出1B的数据 **输 入: 无 **全局变量: 无 **调用模块: 无 **说明: **注意: **************************************************************/ unsignedcharread_1820(void) { unsignedchartemp,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< else temp&=~(1< delay_nus(50);//60~120us SET_TEM_DDR;//设为输出 } return(temp); } /************************************************************** **函数名称: unsignedchargettemp(void) **功能描述: 返回温度值 **输 入: 无 **全局变量: **调用模块: 无 **说明: wmh为温度的高位,wml为温度的低位,返回值为温度值,范围0~99摄氏度,字符型 **注意: **************************************************************/ floatgettemp(void)//读取温度值 { floatt; unsignedchartemh,teml,wm0,wm1,wm2,wm3,wmh,wml; inttemp; 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; returnt; /*wm2=wm1+wm0;//16进制转10进制 wm3=wm2/100; wmh=(wm2%100)/10;//wmh是显示的高位,wml是显示的低位 wml=(wm2%100)%10; temp=wmh*10+wml; returntemp;*/ } voiddeal_temp(unsignedchartmp)//处理函数,当前温度与温度上下限比较 { 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); } elseif(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开发工具,及基本知识》 《EasyAVRM128底板原理图》 《ICCAVR软件中文说明书》 《EasyAVRM128V2快速入门》 以及学校资料: 《AVR开发板的硬件注意事项》 六.实验心得 在做AVR单片机实验之前,我对单片机的设计以及编程都没有太多的了解,虽然学过单片机这门课程,但是没有过实践,当自己做实验时,还是遇到了很多困难,比如在实验初期对AVRstudio软件不熟悉,无从下手,到实验时,代码多处错误而无法排错,多谢了老师对我的指导点拨,最后实验才能完成。 通过这次AVR实验,使我学到了不少实用知识,更重要的是,做实验的过程,思考问题的方法,这与做其他实验都是通用的,使我受益匪浅。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AVR 数字 温度传感器 实验 报告