您好,欢迎访问三七文档
中南林业科技大学《单片机C51程序设计》课程设计报告设计名称:温度报警系统姓名:高枫学号:20164375专业:2016级电子信息工程一班院(系):计算机与信息工程学院设计时间:2018秋第15~18周设计地点:中南林业科技大学指导教师评语:成绩:签名:年月日目录一、题目二、任务与要求三、课程设计摘要及整体框图1、总体设计思路概述2、硬件设计概述3、软件设计概述4、程序流程图四、课程设计原理分析及相关知识概述五、结论六、体会与收获附件:1、源程序代码(加注释)2、整体电路原理图3、元器件清单一、题目设计一个可调时、可设置温度并报警的温度报警系统二、任务与要求一)、任务:设计并制作一个基于LCD1602液晶显示,采用DS1302时钟芯片显示时间,DS18B20采集温度的可调时,可设置报警温度的温度报警系统。二)、要求:利用单片机CPU芯片STC89C52、LCD1602、DS18B20、DS1302、蜂鸣器、按键等,设计一个可调时、可设置温度并报警的温度报警系统。由DS18B20感知环境温度、DS1302时钟芯片控制时间运行,利用单片机外部中断INT0、INT1及按键设置温度和时间、用LCD1602显示,当超过设置温度3℃的时候蜂鸣器报警。三、课程设计摘要及整体框图一)课程设计摘要:本设计通过LCD1602显示由DS1302设置的时间(时、分、秒)、DS18B20采集的环境温度(摄氏度)、以及通过外部中断INT0、INT1两个中断即独立按键K4、K1、K2设置当前时间,按键K3设定目标温度。当环境温度在目标温度的3℃的范围内时蜂鸣器不报警,否则蜂鸣器报警。二)整体框图三)总体设计思路DS1302是一个精确的时钟芯片,能够计算2100年前的时间,具有闰年调整DS18B20采集温度DS1302设置时间STC89C52芯片LCD1602液晶显示蜂鸣器报警按键K3即外部中断0按键K4即外部中断1的能力,设计只需要用到芯片的时、分、秒。DS18B20是一款性能优良的数字温度传感器,通过DS18B20采集实时环境温度,外部中断0设置目标温度,当二者温度相差大于3℃时,蜂鸣器报警,否则正常测量。通过外部中断1进入时钟调时功能,通过按键K1,移位,按键K2进行加一操作,来调整时钟的时分秒。四)硬件设计概述本设计通过仿真平台Protues7.0进行基础的硬件仿真操作,先添加添加元器件AT89C52芯片以及一些其他的电阻,电容和按键,其中P3^0,P3^1,P3^2,P3^3口分别连接独立按键K1,K2,K3,K4。DS18B20,DS1302分别在对应的端口正确连接即可。需要注意的是,DS18B20在仿真时不会出现真实的温度值,在连接LCD1602时,则需要添加上拉电阻,本设计的硬件设计较为简单,在此不再一一赘述,详见附件硬件设计原理图。五)软件设计概述软件采用头文件方式编程,分为主程序模块TCmain模块,LCD1602初始设置模块,DS18B20初始设置模块,DS1302初始设置模块四个部分。其中LCD1602初始设置模块,DS18B20初始设置模块,DS1302初始设置模块,均是根据三个原件的时序图来编写,固定使用。详见附件源程序代码。这里主要介绍TCmain模块,在这里调用DS18B20采集的温度并进行装换,设置的时间均通过LCD1602显示出来。采用了外部中断01,在这两个中断服务程序里面,一个进行再数组里面移位,进行温度显示。另外一个设置时间进入调时功能以及正常显示功能。6)程序流程图TCmain四、课程设计原理分析及相关知识概述1、LCD1602也称1602字符型液晶,专门显示字母、数字、符号的点阵型液晶模块。由若干个5x7或5x10的点阵字符位组成,显示通过ASCII码值直接显示。写入显示地址要求最高位D7位为高电平,写入数据应该加上0x80.2、DS18B20数字温度传感器可用于多种场合,具有适应电压范围宽、精度高、抗干扰纠错能力强、速度快的特点。核心功能是可以直接读出数字的温度数值。其默认精度为12位即0.0625℃,通过初始化时序、读时序、写时序进行传感器的初始化。得到的12位数据,前五位为符号位。大于0时数据乘以0.0625即可得到实际温度。3、DS1302时钟芯片具有计算2100年之前的秒、分、时、日、月、年、周以及闰年调整的能力。采用SPI3线接口,采用双电源供应。共有12个寄存器,存储格式为秒、分、时、日、月、周、年,存放数据格式为BCD码形式。数据输入输出均从低位0到高位7。在液晶显示时要将BCD码转化成二进制码,转换方式为当4位二进制码大于1001时加6即可。五、结论下载到单片机开发板上验证的,设计的温度报警装置基本实现了功能。但是较为遗憾的是,由于DS18B20温度传感器测量得到的温度与实际的环境温度有较大的误差。比如手机显示天气温度为2℃,但是传感器测量得到温度为9℃。再者就是由于DS1302与DS18B20二者的时序冲突问题,在调整时间时,温度传感器不能与C52芯片通信,此刻温度会显示零。六、体会与收获在大二由周凯老师讲述单片机课程时,采用的是汇编语言讲述,但是具体操作时采用的是C语言编写,二者有较大的区别,并不能详细理解单片机的内涵。并且由于上学期周老师讲述进度过慢,后面的SPI总线、I2C、LCD602等均没有经过系统学习。本学期不仅仅系统学习基于硬件的C51语言,也系统学习了I2C、LCD1602、DS18B20等元器件的使用。谢老师认真负责,讲述详实,本学期收获颇丰。本次课设是对这学期所学知识的总结,所做的温度报警装置用到了LCD1602、DS18B20、DS1302、中断以及基本的C51知识,期间碰到了一些较为棘手的问题,比如DS18B20和DS1302二者冲突不能同时同单片机通信,温度值一直为零,经过排查二者有段代码导致了时序冲突,解决这个问题后,就实现了所要实现的基本功能,较好的运用了本学期所学内容。附件:1、源程序代码(加注释)1)主函数:#includereg52.h#includemath.h#includelcd1602.h#includeDS18b20.h#includeDS1302.hsbitk1=P3^0;//按键K1调时功能的移位键sbitk2=P3^1;//按键K2调试功能的加一键sbitk3=P3^2;//按键K3温度设置键sbitk4=P3^3;//按键K4进入调时功能的按键sbitbeep=P1^5;//蜂鸣器接口typedefunsignedintu16;typedefunsignedcharu8;u8set,setp,p=0,a,g,f=0;u8lcd[35];u8codel[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//LCD1602使用的ASCII码值u8temp[32]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31};//设置温度的数组,范围为BCD码值为0℃到31℃voidTctemp(inttemp)//温度显示函数{floattp;u8i;if(temp0)//温度值小于0则减一,取反{temp=temp-1;temp=~temp;tp=temp;temp=tp*0.0625*100+0.5;//加上0.5为了四舍五入;}else{tp=temp;temp=tp*0.0625*100+0.5;}lcd[16]=l[temp%10000/1000];//得到十位lcd[17]=l[temp%1000/100];//得到个位lcd[18]=0x2e;//小数点.lcd[19]=l[temp%100/10];//十分位lcd[20]=l[temp%10];//百分位lcd[21]=0xdf;lcd[22]=0x43;//二者构成℃的符号lcdwrc(0xc9);//第四位开始显示for(i=16;i=22;i++){lcdwrd(lcd[i]);}a=temp/100;//温度取整数两位}voidTctime()//时间显示与设置函数{if(set==0){Ds1302ReadTime();}else{if(k1==0){delay(10000);//延时消抖if(k1==0){if(setp=2)//调整调时的位置setp=0;elsesetp++;}}}if(k2==0){delay(10000);if(k2==0){TIME[setp]++;if((TIME[setp]&0x0f)9)/*ASCII码换成BCD码,换算规则低四位大于9则低四位减六修正,计算机按补码运算,实际加六运算*/{TIME[setp]=TIME[setp]+6;}if((TIME[setp]=0x60)&&(setp2))//分秒只能到59{TIME[setp]=0;}if((TIME[setp]=0x24)&&(setp==2))//小时只能到23{TIME[setp]=0;}}}lcdwrc(0x84);lcdwrd('0'+TIME[2]/16);//时将BCD码值装换成ASCII码值lcdwrd('0'+(TIME[2]&0x0f));lcdwrd(':');lcdwrd('0'+TIME[1]/16);//分lcdwrd('0'+(TIME[1]&0x0f));lcdwrd(':');lcdwrd('0'+TIME[0]/16);//秒lcdwrd('0'+(TIME[0]&0x0f));}voidinit0()//中断初始化{EX0=1;//外部中断0IT0=1;EX1=1;//外部中断1IT1=1;EA=1;}voidint0()interrupt0//外部中断0{delay(10000);if(k3==0){if(setp==31)p=0;elsep++;//温度设置的数组指针f=1;//按下按键开始比较}}voidinit2()interrupt2//外部中断1{delay(10000);if(k4==0){set=~set;setp=0;Ds1302Init();f=~f;/*f取反的原因是,进入调时时温度会变成0℃,为了防止此时蜂鸣器响起,因此取反*/}}voiddis()//设置温度显示函数{u8i;lcd[23]=0x53;lcd[24]=0x65;lcd[25]=0x74;lcd[26]=0x3a;lcd[27]=l[temp[p]/16];//BCD码装换成ASCIII值lcd[28]=l[temp[p]&0X0f];lcd[29]=0xdf;lcd[30]=0x43;lcdwrc(0xc0);for(i=23;i=30;i++){lcdwrd(lcd[i]);}g=(temp[p]/16)*10+(temp[p]&0x0f);//设置的温度计算得到两位整数if((abs(a-g)3)&&(f==1))//温差大于3℃时蜂鸣器响{for(i=100;i++;i=20000){beep=~beep;delay(i);}}}voidmain(){lcdinit();init0();while(1){Tctemp(Ds18b20ReadTemp());Tctime();dis();}}2)LCD1602初始化函数根据1602的时序图编写初始化函数,时序图如下其中RS=0写入数据,RS=1写入命令#includelcd1602.hvoiddelay(unsignedchari)//延时函数{while(i--);}voidlcdwrc(unsignedintc)//写入命令{delay(1000);RS=0;RW=0;E=0;P0=c;E=1;delay(1000);E=0;}voi
本文标题:C51课程设计报告
链接地址:https://www.777doc.com/doc-7450949 .html