基于51单片机与DS18B20的数字温度计设计 - 副本

发布时间 : 星期二 文章基于51单片机与DS18B20的数字温度计设计 - 副本更新完毕开始阅读

{

Display(0,recordtable[a]/10);//显示温度数值 Display(1,recordtable[a]); Display(2,11);//显示摄氏度单位 Display(3,12);

Display(4,10);//数码管第6、7位选中,温度值与记录数之间用--间隔 Display(5,10);

Display(6,(a+1)/10);//显示第几个记录值 Display(7,(a+1)); if(add==0) { delay1(z);//延时消抖 if(add==0)//add按下,查看下一个值 { if(recordnum==0) { a=0; } else { a++; if(a==recordnum)//循环显示 { a=0; } } } }

if(sub==0)//sub按下,查看上一个值 { delay1(z); if(sub==0) { if(recordnum==0) { a=0; } else { a--; if(a==255)//循环显示 { a=recordnum-1; }

}

} } } }

if(record==0) { delay1(80); if(record==0)//record第二次按下,退出查看 { flag=0; } }

/***********定时器中断0,用于温度检测时间间隔和记录数据时间间隔**************/ void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%6;//50ms countsec++; countmin++; if(countsec==20)//1s { countsec=0; }

GetTemperature();//一秒钟更新一次温度值 }

Keeprecord();//定时记录温度值

7 总结

此次课程设计中,难点在于DS18B20的使用,即对它的时序控制、初始化以及字节读写方法,任何一个环节出错或是时序控制不到位的话就不能得到正确的数据。一旦学会了正确的使用方法,就能感觉到它带来的便利是热电偶不能比拟的,以后再次使用的话就能很快上手了。 软件设计中,把程序按功能分模块的话能提高编程效率,把问题一一解决,同时画流程图能帮助理清思路,使问题简单化。定义变量时,尽量定义局部变量,在字符型变量能达到要求的情况下就不用定义成整形变量了,以节省内存空间。同时局部变量应避免与全局变量取同名,否则全局变量将被屏蔽或与局部变量相冲突而达不到设计的效果。另一方面,取变量名时也要讲究技巧,应尽量使其见名知意,同样地,写程序时加注释确是非常必要的,否则隔一段时间后,想再改进或做扩展的话就比较困难了,因为即使是自己写的程序也变得难读难懂了。在

做键盘消抖时,延时的时间比较重要,一般为10ms左右,延时太短就会使按键太过灵敏,按一下就使数字跳变几次;而延时过长则可能使按键按下了却无响应,在外部定义初始化一个延时函数的入口参量则能很方便地调整延时时间,以达到比较好的效果。另外,如果对按键进行释放判断的话就能解决长时间按键导致按键重复响应的问题。 此设计中没有为温度的单位(摄氏度)准备专用的数码管来显示,若单独用一个数码管显示“C”来代替“℃”的话,看起来感觉很别扭。偶然想起如若用一个数码管的上半部显“0”,即a、b、f、g段点亮,来代替“℃”左上角的“度”的话,效果应该不错,便作了一试,发现这是确是一个很好的主意,便在此次设计中采用了这个办法来显示温度单位。另外此次设计也考虑了实时温度显示界面与报警温度设置界面的区别,即在进入报警温度设置界面时,让其余的数码管都显示出一横杠,即g段点亮,这样则不会让两个界面相互混淆。 总的来说,自己从这次独立的课程设计中收获了一些知识与经验,一些从书本中学之不来的东西,不是说理论无用,而这恰恰是在理论的土壤中开出的花朵,是在理论的肩膀望见的更宽广的道路!成功来之不易,自主动手动脑实践,小小的成果亦能带来硕大的喜悦!

参考文献:

1. 徐玮. C51单片机高效入门(第2版). 北京:机械工业出版社,2010. 2. 龙脉工作室,刘鲲,孙春亮(修订版). 北京:人们邮电出版社,2010.

联系合同范文客服:xxxxx#qq.com(#替换为@)