您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 交通运输 > “单片机原理与应用”课内实践报告(测温及时间显示)
《单片机原理与应用》课内实践报告题目:测温及时间显示专业:计算机科学与技术学号:xxxxxx姓名:xx任课教师:xxx批改教师:批改日期:2015年6月日成绩:池州学院数学与计算机科学系制-1-目录序言.........................-2-一、设计思想................-3-二、原理图..................-4-三、效果图..................-4-四、总结....................-8-五、源程序..................-9--2-序言随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。本文介绍了一个基于STC89C52单片机和数字温度传感器DS18B20的测温系统,并用LED数码管显示温度值,易于读数。系统具有可靠性高、成本低、功耗小等优点。为了不让功能太单一,造成资源的浪费,本人利用单片机本身定时器模拟了一套电子时钟,可实现时钟设置功能。-3-一、设计思想1)测温系统以AT89C52单片机为核心,采用高精度温度传感器DS18B20采样温度数据,将温度转换成数字信号,由STC89C52单片机负责发出指令和接收采样数据,经过数据处理后,用4位共阳极LED数码管实现温度显示的简易测温系统。在温度的检测与控制方面,由于18B20小型温度检测系统及其数字温度传感器有许多突出的优点,其通过单总线与单片机连接,系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度检测。2)数字时钟设计原理主要利用AT89C51单片机,由单片机的P0口控制数码管的位显示,P1口控制数码管的段显示,P3口与按键相接用于时间的校正。通过定时器中断函数来进行计数,时间显示为24小时制。-4-二、原理图三、效果图(静态效果图)-5-(动态效果图1)(动态效果图2)按下开关,默认时间是12:12-6-(动态效果图3)按下调时键6和调分键5来设置时间(动态效果图4)按下温度显示键2,显示当前温度-7-(动态效果图5)按下时间显示键1,再次显示时间-8-四、总结这次课程设计,首先,让我学习和掌握单片机的应用和设计,充分认识理论知识对应用技术的指导性作用,进一步加强理论知识与应用相结合的实践和锻炼。通过实践,进一步加深了对专业知识和理论知识学习的认识和理解,使自己的设计水平和对所学的知识的应用能力以及分析问题解决问题的能力得到全面提高。本次设计给我最大的收获就是动手能力的重要性,实践和理论上是有差距的,理论与实际相结合是很重要的。只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。动手试验也让自己对书本知识有了更深刻的认识,把书本知识真正的转化为自己所掌握的东西,能加以利用。实验前首先要自己焊接好完整的单片机实验板,虽是第一次焊接,但是在多次失败的教训下,还是焊接完成,经测试,功能正常,虽然焊接的不太好看,但也是一次成功,给了我很大的信心。在编写实验程序时,遇到好多问题,测试过上百次,期间通过网络和询问他人的方式来完善程序,最终实现了自己想要的功能。在Proteus仿真测试中,按照原理图连接好所有的实验部件后,仿真并未成功,数码管的显示有很大问题,暂时还未解决,这是本次实验的一大遗憾,但我之后会慢慢完善这个实验仿真。总之,这次课程设计对于我们有很大的帮助,通过这次课程设计,我更加深入地理解了,单片机课上讲到的89C52芯片的功能,以及引脚的作用,同时加深了对于芯片的应用的认识,同时还提高了自己的动手能力,收获很大!-9-五、源程序#includereg52.h#includeds18b20.h//引入DS18B20头文件#defineucharunsignedchar#defineuintunsignedint//引脚定义:sbitSMG_q=P1^0;//定义数码管阳级控制脚(千位)sbitSMG_b=P1^1;//定义数码管阳级控制脚(百位)sbitSMG_s=P1^2;//定义数码管阳级控制脚(十位)sbitSMG_g=P1^3;//定义数码管阳级控制脚(个位)sbitS_key=P3^3;//定义数码管时设置键控制脚sbitF_key=P3^2;//定义数码管分设置键控制脚sbitTime_key=P3^7;//时间功能按键sbitTemp_key=P3^6;//温度功能按键Codeuchartable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管0-9ucharl_posit=0;//位置uchart_sum=0;//计数时间量ucharsecond=0;//秒定义ucharminute=12;//分定义-10-ucharhour=12;//时定义ucharly_dis[4];//定义显示缓冲区//函数声明:voiddisplay_time(ucharshi,ucharfen);//时间显示函数,参数为显示时分voiddelay(uintt);//延时函数voidinit();//中断初始化voidF_set();//分设置函数voidS_set();//时设置函数voiddisplay_temp(void);//温度显示函数,显示缓冲区内容voidTemp();//温度函数voidTime();//时间函数//主函数voidmain(){while(1){Time();}-11-}//时间函数voidTime(){init();//初始化中断控制寄存器while(1){if(t_sum==20){//20*50ms为1秒t_sum=0;second++;if(second==60){//秒到60,秒变零,分加一second=0;minute++;if(minute==60){//分到60,分变零,时加一minute=0;hour++;if(hour==24)//时到24,时清零hour=0;}}}if(!S_key)S_set();//如果按下时设置键,调用函数S_setif(!F_key)F_set();//如果按下分设置键,调用函数F_set-12-if(Temp_key==0)Temp();//如果按下温度功能键,跳转温度函数display_time(hour,minute);//显示时间delay(50);}}//温度函数voidTemp(){uinti=0;floattt;intltemp;while(1){if(i==0)tmpchange();//温度转换if(i==100){tt=tmp()*0.0625;//得到真实十进制温度值,因为DS18B20//可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度。ltemp=tt*10+0.5;//放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。-13-if(ltemp0){//判断第一位显示整数还是负号ly_dis[0]=0xbf;ltemp=0-ltemp;}elsely_dis[0]=ltemp/1000;//显示百位值ltemp=ltemp%1000;ly_dis[1]=ltemp/100;//显示温度十位值ltemp=ltemp%100;ly_dis[2]=ltemp/10;//显示温度个位值ly_dis[3]=ltemp%10;//显示小数点后一位}i++;if(i==3000)i=0;display_temp();//调用显示delay(50);if(Time_key==0)Time();//如果按下时间功能键,跳转时间函数}}-14-//定时器初始化函数voidinit(){t_sum=0;TMOD=0X01;//设置定时器1为模式一,即16位计算模式TH0=(65536-50000)/256;//给计数寄存器赋值,50毫秒时间TL0=(65536-50000)%256;EA=1;//开启总中断ET0=1;//开启定时器0中断TR0=1;//启动定时器}//中断函数voidtimer()interrupt1{TH0=(65536-50000)/256;//重新赋值TL0=(65536-50000)%256;t_sum++;//50毫秒计数}-15-//时间显示函数voiddisplay_time(ucharshi,ucharfen){P0=0XFF;switch(l_posit){case0://选择千位数码管,关闭其它位SMG_q=0;SMG_b=1;SMG_s=1;SMG_g=1;P0=table[shi/10];//输出显示内容break;case1://选择百位数码管,关闭其它位SMG_q=1;SMG_b=0;SMG_s=1;SMG_g=1;P0=table[shi%10];if(t_sum=10)P0&=0x7f;//小数点以半秒的时间闪烁break;-16-case2://选择十位数码管,关闭其它位SMG_q=1;SMG_b=1;SMG_s=0;SMG_g=1;P0=table[fen/10];break;case3://选择个位数码管,关闭其它位SMG_q=1;SMG_b=1;SMG_s=1;SMG_g=0;P0=table[fen%10];break;}l_posit++;//每调用一次将轮流显示一位if(l_posit3)l_posit=0;}//温度显示函数voiddisplay_temp(){-17-P0=0XFF;switch(l_posit){case0://选择千位数码管,关闭其它位SMG_q=0;SMG_b=1;SMG_s=1;SMG_g=1;P0=table[ly_dis[0]];//输出显示内容break;case1://选择百位数码管,关闭其它位SMG_q=1;SMG_b=0;SMG_s=1;SMG_g=1;P0=table[ly_dis[1]];break;case2://选择十位数码管,关闭其它位SMG_q=1;SMG_b=1;SMG_s=0;SMG_g=1;P0=table[ly_dis[2]]&0x7f;-18-break;case3://选择个位数码管,关闭其它位SMG_q=1;SMG_b=1;SMG_s=1;SMG_g=0;P0=table[ly_dis[3]];break;}l_posit++;//每调用一次将轮流显示一位if(l_posit3)l_posit=0;}//延时子函数voiddelay(unsignedintt){while(t--);}//时设置函数voidF_set(){while(!F_key)display_time();second=0;minute++;-19-if(minute==60)minute=0;}//分设置函数voidS_set(){while(!S_key)display_time();second=0;hour++;if(hour==24)hour=0;}
本文标题:“单片机原理与应用”课内实践报告(测温及时间显示)
链接地址:https://www.777doc.com/doc-2833790 .html