片单机课程设计学校作息时间控制系统的设计_第1页
片单机课程设计学校作息时间控制系统的设计_第2页
片单机课程设计学校作息时间控制系统的设计_第3页
片单机课程设计学校作息时间控制系统的设计_第4页
片单机课程设计学校作息时间控制系统的设计_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGEPAGE21课程设计报告题目学校作息时间控制系统的设计系(部)专业(班级)姓名学号指导教师起止日期

单片机原理及应用课程设计任务书系(部):专业:指导教师:课题名称学校作息时间控制系统的设计设计内容及要求(1)课题内容:以单片机为核心,设计一个智能化作息时间控制器。该控制器要求的功能有:按本校作息时间接通/断开蜂鸣器,每次响铃时间为10秒;用12864液晶屏作显示器,第一行显示“作息时间控制系统”,第二行显示设计者姓名和学号,第三行显示实时时钟,显示的内容要求有时、分、秒各两位,第四行显示最近的闹铃时间。发挥部分:设置按键对小时和分钟调节;可以通过键盘任意调整响铃时间。(2)要求:完成该系统的硬件和软件的设计,在Proteus软件上仿真通过后,提交一篇课程设计说明书。设计工作量1、汇编或C51语言程序设计;2、程序调试;3、在Proteus上进行仿真后,进行下载;4、提交一份完整的课程设计说明书,包括设计原理、程序设计、程序分析、仿真分析、调试过程,参考文献、设计总结等。进度安排起止日期(或时间量)设计内容(或预期目标)备注第一天课题介绍,答疑,收集材料,C51介绍第二天设计方案论证,练习编写C51程序第三天~第六天程序设计第六天~第八天程序调试、仿真第九天~第十天系统测试并编写设计说明书教研室意见年月日系(部)主管领导意见年月日目录一.设计原理 5(1)总体设计: 5(2)分模块设计: 5(3)设计示意图 5三.仿真分析 6(1)调节工作模式: 6(2)闹铃实现: 6(3)温度测量: 7四.设计心得 7五.参考文献 8一.设计原理(1)总体设计:首先对设计要求有个整体的了解,明白需要实现哪些功能,实现这些功能需要哪些元器件,要驱动这些元件需要编写什么程序,最后进行总体调试。本次作息时间的设计,使用了单片机AT89C51,LCD为AMPIRE12864,温度元件为DS18B20,还有一个声音播放器SOUNDER。对于LCD和DS18B20要进行初始化。将本次设计分成5个模块分别进行设计,分成:温度模块、LCD显示模块、时间模块、声音模块、调节模块。分模块设计好了以后,再综合起来设计主程序main(),实现所需要求。(2)分模块设计:1.LCD显示模块设计:该模块包括的函数为LCD_inti()//LCD的初始化、checkbusy()//检查LCD是否忙碌、writecode()//写命令、writedata()//写数据、hanzi()//显示汉字、zifu()//显示数字或字符。2.温度模块设计:该模块的函数为inti()//DS18B20的初始化、readchar()//读一个字节、writechar()//写入一个字节、readtemp()//读取温度、worktemp()//温度计算。3.时间模块设计:本次是采用T0中断的工作方式1获取时间的。其函数为voidtimer()interrupt1 //T0中断函数、workhour()//时间计算。4.声音模块设计:该模块比较简单,其函数为voids_fmq()//蜂鸣器叫、nling()//判断是否闹铃。5.调节模块设计:该模块要实现5个模式的调节和转变。模式0:正常工作状态;模式1:修改时间;模式2:选择一个需要改变的闹铃;模式3:修改选定的闹铃的分钟;模式4:修改选定的闹铃的小时(3)设计示意图AAT89单片机时间模块温度模块调节模块声音模块LCD显示模块图一.总设计示意图三.仿真分析5个具体模块的功能实现,已经在程序注释中解释了,现在主要分析怎么操作这些功能的实现。如图二所示图二:总的硬件电路图(1)调节工作模式: 调节模式的实现只用了三个按钮,分别是mode、inc和dec按钮。如图三所示: 图三:三个调节按钮(2)闹铃实现:程序初始化的时候对20个闹铃时间进行了赋值,其闹铃的时间分别是{8:00、8:45、8:55、9:40、10:00、10:45、10:55、11:40、14:00、14:45、14:55、15:40、16:00、16:45、16:55、17:40、19:00、19:45、19:55、20:40}。如果要修改闹铃时间,可以依次进入调节模式2、3、4进行修改。当到了闹铃时间时,则蜂鸣器会响起来。 图十:蜂鸣器(3)温度测量:本次设计采用了DS18B20温度芯片,该芯片能测量环境中的温度变化,通过单片机的处理就可以显示出实时温度值。当环境温度改变时,显示出来的温度也会随着改变 图十一:DS18B20温度芯片四.设计心得 刚刚学完汇编语言,猜测可能使用汇编来编程的。没想到必须得用C语言。好久没有使用C语言编程了,当年学的时候觉得这个是软件,专业是搞硬件的与本专业联系不大,就学的不怎么好,现在都忘了差不多了。在课程设计之前,有一个星期的实训时间,做了关于流水灯,名字学号显示,方波,方阵。流水灯、方波,若要用刚学不久的汇编语言还好说,还是可以写出来的,可是要用C语言还真是有点问题。自己趁着这个时间,复习了汇编语言的程序,可也只能方波和流水灯,但是看到同学用C语言只用了很简单的几行程序就编出方波的程序时,我又一次的被打击到了。没想到C语言在自己的专业上还有这么大的用,突然想起单片机书上第一章的内容写的是单片机的高级语言是C语言。这次做的是学校作息时间控制系统,很贴近生活实际,通过翻以前上课用的书籍,以及上网查阅资料。自己对这次的编程有了一点的概念。而LCD12864这块显示器却让我有点头痛,这个东西之前并没有接触过,教科书上也没有关于它的介绍。它的硬件结构,驱动程序都要自己另外查阅资料。与单片机的接口连接好搞定,可是它的显示地址却有点把不准。很费时间。当搞清显示模块时,一切似乎都好办了,当显示出自己的名字和学号班级时,莫名的成就感,接下来将时间模块移植进去就可以了,不过还得做一点点小小的修改。程序这一块我不是很强,移植进去后运行没有错误,可就是不显示,而且屏幕还黑了一半,当时心都有点发凉,这毕竟是搞了很久的东西,要是这个结果就有点对不起观众了。请教与班上的程序高手,做了些适当的修改,当自己的姓名和时间一起终于显示出来了的时候,那种兴奋是莫名的。作为练习,还移植了一个温度模块,功能多才是王道。对于学习的态度还是该端正,学的东西都会有用的,只不过有些东西你暂时不知道用在那里而已。当那一天你真的要用时,若是因自己没学扎实而不会时,那是该多么的遗憾。 五.参考文献1.单片机典型系统设计实例精讲/彭为等编著.—北京:电子工业出版社,2006.5ISBN7-121-02461-62.单片机C51程序设计教材与实验/祁伟等编著。—北京:北京航空航天大学出版社,2006.1ISBN7-81077-736-X3.单片机微型计算机技术/刘国荣等编著。—北京:机械工业出版社.2000.14.单片机原理与应用/曾屹等编著。—长沙:中南大学出版社.2009.5(高等院校培养应用型人才电子技术类课程规划教材)ISBN987-7-81105-832-#include<reg51.h>#include<intrins.h>#defineLCDP0sbitDQ=P3^7; //定义DS18B20数据端口sbitP07=P0^7; //小数点控制I0sbitmode=P1^0; //key1 分sbitinc=P1^1; //kye2 时sbitdec=P1^2; //key3闹铃sbitfmq=P1^7; //蜂鸣器接口sbitE=P2^0; //用于DS18B20接线端口sbitRW=P2^1;sbitRS=P2^2;sbitCS1=P2^4;sbitCS2=P2^3;sbitBUSY=P0^0;unsignedchara,i,j,k;unsignedcharbai,shi,ge,xiaoshu; //用于表示温度unsignedintrealtemp; //读取的实际温度值unsignedcharflag; //正负标志位unsignedcharfu; //符号寄存器unsignedcharcount,hour,minute,second=0; //用于表示时间unsignedcharmode_value=0,xf; //调节模式unsignedchar month=6,day=7 ; //用于表示日期unsignedcharh1,h2,f1,f2,s1,s2=0; //用于显示时间 unsignedcharm1,m2;d1,d2; //用于显示日期unsignedchards[20][2]={{8,0},{8,45},{8,55},{9,40},{10,0},{10,45},{10,55},{11,40},{14,0},{14,45},{14,55},{15,40},{16,0},{16,45},{16,55},{17,40},{19,0},{19,45},{19,55},{20,40}}; //用于定时闹铃unsignedcharcodezi[28][16]={{0x20,0x20,0x24,0xA4,0xA4,0xBF,0xA4,0xE4,0xA4,0xBF,0xA4,0xE6,0xA4,0x30,0x20,0x00}, /*"王",0*/{0x00,0x80,0x80,0x5F,0x4A,0x2A,0x0A,0x0F,0x0A,0x2A,0x2A,0x4F,0x40,0x80,0x00,0x00}, {0x40,0x20,0xF8,0x07,0x88,0x48,0x38,0x10,0x54,0x54,0xFF,0x54,0x54,0x7C,0x10,0x00},/*"宇",1*/{0x00,0x00,0xFF,0x44,0x29,0x19,0x27,0x49,0x89,0x89,0xFF,0x89,0x89,0xCD,0x49,0x00},{0x00,0xFC,0x84,0x84,0x84,0xFE,0x14,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x00},/*"时",2*/{0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x23,0x40,0x80,0x7F,0x00,0x00,0x00},{0x00,0x80,0x40,0x20,0x98,0x86,0x80,0x80,0x83,0x8C,0x90,0x20,0xC0,0x80,0x80,0x00},/*"分",3*/{0x01,0x00,0x80,0x40,0x20,0x1F,0x00,0x40,0x80,0x40,0x3F,0x00,0x00,0x01,0x00,0x00},{0x20,0x24,0x24,0xA4,0xFE,0xA3,0x22,0x80,0x70,0x00,0xFF,0x00,0x10,0x20,0x60,0x00},/*"秒",4*/{0x10,0x08,0x06,0x01,0xFF,0x00,0x81,0x80,0x40,0x20,0x17,0x08,0x04,0x03,0x00,0x00},{0x10,0x10,0xD0,0xFF,0x94,0x14,0xE4,0xBF,0xA4,0xA4,0xA4,0xBF,0xF4,0x26,0x04,0x00}, /*"模",5*/{0x04,0x03,0x00,0xFF,0x08,0x89,0x8B,0x4A,0x2A,0x1E,0x2A,0x2A,0x4B,0xC8,0x48,0x00},{0x10,0x10,0x91,0xD6,0xB0,0x10,0xFE,0x82,0x82,0x82,0x82,0x82,0xFF,0x02,0x00,0x00},/*"祝",6*/{0x02,0x01,0x00,0xFF,0x80,0x41,0x21,0x18,0x07,0x00,0x3F,0x40,0x41,0x40,0x70,0x00},{0x40,0x20,0xF8,0x07,0x40,0x20,0x18,0x0F,0x08,0xC8,0x08,0x08,0x28,0x18,0x00,0x00},/*"你",7*/{0x00,0x00,0xFF,0x00,0x00,0x08,0x04,0x43,0x80,0x7F,0x00,0x01,0x06,0x0C,0x00,0x00},{0x80,0x70,0x00,0xFF,0x10,0x20,0x10,0x10,0xFF,0x10,0x10,0x10,0xF8,0x10,0x00,0x00},/*"快",8*/{0x00,0x00,0x00,0xFF,0x82,0x42,0x22,0x1A,0x07,0x0A,0x12,0x22,0x43,0xC2,0x42,0x00},{0x00,0x80,0xC0,0xBC,0x84,0x84,0x84,0xF4,0x82,0x82,0x83,0x82,0x80,0xC0,0x80,0x00},/*"乐",9*/{0x00,0x40,0x20,0x10,0x0C,0x40,0x80,0x7F,0x00,0x00,0x04,0x08,0x30,0x60,0x00,0x00},{0x40,0x20,0xF8,0x07,0xF0,0xA0,0x90,0x4F,0x54,0x24,0xD4,0x4C,0x84,0x80,0x80,0x00},/*"修",10*/{0x00,0x00,0xFF,0x00,0x0F,0x80,0x92,0x52,0x49,0x25,0x24,0x12,0x08,0x00,0x00,0x00},{0x04,0xC4,0x44,0x44,0x44,0xFE,0x44,0x20,0xDF,0x10,0x10,0x10,0xF0,0x18,0x10,0x00},/*"改",11*/{0x00,0x7F,0x20,0x20,0x10,0x90,0x80,0x40,0x21,0x16,0x08,0x16,0x61,0xC0,0x40,0x00},{0x00,0xFC,0x84,0x84,0x84,0xFE,0x14,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x00},/*"时",12*/{0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x23,0x40,0x80,0x7F,0x00,0x00,0x00},{0x00,0xF8,0x01,0x02,0xF6,0x10,0x12,0x12,0x12,0x12,0xFA,0x12,0x02,0xFF,0x02,0x00},/*"间",13*/{0x00,0xFF,0x00,0x00,0x3F,0x11,0x11,0x11,0x11,0x11,0x3F,0x40,0x80,0x7F,0x00,0x00},};//汉字码unsignedcharcodexuehao[20][8]={{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00},{0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},/*"2",0*/{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00},{0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},/*"0",1*/{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00},{0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},/*"1",2*/{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00},{0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},/*"1",3*/{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00},{0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},/*"0",4*/{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00},{0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00},/*"1",5*/{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00},{0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},/*"2",6*/{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00},{0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"4",7*/{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00},{0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},/*"0",8*/{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00},{0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},/*"7",9*/};//学号码unsignedcharcodeshu[20][8]={{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00},{0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},/*"0",0*/{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00},{0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"1",1*/{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00},{0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},/*"2",2*/{0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00},{0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00},/*"3",3*/{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00},{0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00},/*"4",4*/{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00},{0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00},/*"5",5*/{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00},{0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},/*"6",6*/{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00},{0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00},/*"7",7*/{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00},{0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},/*"8",8*/{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00},{0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00},/*"9",9*/};//数字码unsignedcharcodefuhao[12][8]={{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01},/*"-",0*/{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00},/*".",1*/{0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00},{0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00},/*":",2*/{0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00},{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*".",3*/{0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00},{0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00},/*"C",4*/{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"",5*/};//符号码/****************************************************************************************************LCD显示模块程序********************************************************************************************************//*********检查12864LCD中是否忙*****************************************/checkbusy(){E=1;RW=1;RS=0;LCD=0Xff;if(BUSY);}/***********************写命令********************************************/writecode(unsignedchardat)//写命令{checkbusy();E=0;RW=0;RS=0;LCD=dat;E=1;E=0;}/*******************************写数据************************************/writedata(unsignedchardat)//写数据{checkbusy();E=0;RW=0;RS=1;LCD=dat;E=1;E=0;}/*************************汉字显示程序************************************/voidhanzi(unsignedcharpage,unsignedcharlineaddress,intn,inta,unsignedchartable[][16]){ unsignedchartemp[32]; if(lineaddress<0X80) { CS1=0; CS2=1; }//left for(j=2*a;j<n+2*a;j++) { if(lineaddress>=0X80) { CS1=1;//right CS2=0; lineaddress=lineaddress-0X40; } for(k=0;k<16;k++) {temp[k]=table[j][k];} j+=1; for(k=0;k<16;k++) { temp[16+k]=table[j][k]; } writecode(page); writecode(lineaddress); for(i=0;i<16;i++) {writedata(temp[i]);} writecode(page+1); writecode(lineaddress); for(i=16;i<32;i++) {writedata(temp[i]);} lineaddress+=16; }}/***********************数字和字符显示程序******************************/voidzifu(unsignedcharpage,unsignedcharlineaddress,intn,inta,unsignedchartable[][8]){ unsignedchartemp[16]; if(lineaddress<0X80) { CS1=0; CS2=1; }//left for(j=2*a;j<n+2*a;j++) { if(lineaddress>=0X80) { CS1=1;//right CS2=0; lineaddress=lineaddress-0X40; } for(k=0;k<8;k++) {temp[k]=table[j][k];} j+=1; for(k=0;k<8;k++) {temp[8+k]=table[j][k];} writecode(page); writecode(lineaddress); for(i=0;i<8;i++) {writedata(temp[i]);} writecode(page+1); writecode(lineaddress); for(i=8;i<16;i++) {writedata(temp[i]);} lineaddress+=8; }}/***************************LCD初始化************************************/voidLCD_inti(){writecode(0X3f);//显示开关关writecode(0XC0);//修改显示起始行writecode(0Xb8);//修改页地址,x地址writecode(0X40);//修改列地址,y地址}/*****************************显示固定的汉字******************************/voidxingxian(){ hanzi(0Xb8,0X40,4,0,&zi);//显示姓名"黄健" zifu(0xb8,0x70,20,0,&xuehao);//显示学?"2008042126" hanzi(0xba,0x60,2,2,&zi);//显示"时" hanzi(0xba,0x80,2,3,&zi);//显示"分" hanzi(0xba,0xa0,2,4,&zi);//显示"秒" hanzi(0xbc,0xa0,2,5,&zi);//显示"模" zifu(0xbc,0x40,2,2,&shu); // 显示"年份" zifu(0xbc,0x48,2,0,&shu); zifu(0xbc,0x50,2,1,&shu); zifu(0xbc,0x58,2,1,&shu); zifu(0xbc,0x60,2,0,&fuhao); zifu(0xbc,0x78,2,0,&fuhao); zifu(0xb8,0x60,2,5,&fuhao); //显示空白 zifu(0xb8,0x68,2,5,&fuhao); zifu(0xba,0x40,2,5,&fuhao); zifu(0xba,0x48,2,5,&fuhao); zifu(0xba,0xb0,2,5,&fuhao); zifu(0xba,0xb8,2,5,&fuhao); zifu(0xbc,0x90,2,5,&fuhao); zifu(0xbc,0x98,2,5,&fuhao); zifu(0xbc,0xb0,2,2,&fuhao); zifu(0xbe,0x58,2,0,&fuhao); //显示"--"}/***************************************************************************************************温度模块程序****************************************************************************************************************//***************************延时******************************************/voiddelayds(unsignedinti){while(i--);/*12M,一次6us,加进入退出14us(8M晶振,一次9us)*/}/*******************************初始化函数********************************/unsignedcharinit(void){ unsignedcharx; DQ=1;//复位 delayds(8); DQ=0;//单片机将DQ拉低 delayds(80);//复位信号延时大于480us DQ=1;//在复位电平结束之后,单片机应该将数据单总线拉高 delayds(14); x=DQ;//判断复位是否成功。如果x=0则初始化成功,x=1则初始化失败 delayds(20); return(x);}/*************************读一个字节**************************/readchar(void){ unsignedchari=0; unsignedchardat=0; for(i=8;i>0;i--)/*//写入ds1820的bit数,一个字节8个bit*/ { DQ=0;//给脉冲信号,"读"起始位 dat>>=1;//右移运算,把一个字节data(A)分成8个bit环移 DQ=1;//给脉冲信号,"读"停止位 if(DQ) dat|=0x80;//按位或,取最高位并存入dat中,DQ=1则dat的最高位也为1 delayds(4); } return(dat);}/*************************写一个字节****************************/writechar(unsignedchardat){ unsignedchari=0; for(i=8;i>0;i--) { DQ=0;//"写"起始DQ=dat&0x01;//通过按位与使送出数据为"0"或"1",取最低位,先送//低位再送 delayds(5);//60us到120us延时 DQ=1;//"写"停止 dat>>=1;//右移运算,取高一位数据传入 } delayds(4);}/****************************读取温度********************************/readtemp(){ floattt=0; unsignedchara=0; unsignedcharb=0; unsignedchart=0; init(); writechar(0xCC);//跳过读序号列号的操作 writechar(0x44);//启动温度转换 init(); writechar(0xCC);//跳过读序号列号的操作 writechar(0xBE);//写入读取温度指令,读取温度寄存器等(共可读9个寄存器)//前两个就是温度 a=readchar();//读温度值的低字节 b=readchar();//读温度值的高字节 fu=b&0x80; if(fu!=0) { flag=1;//负温标志位置1 b=~b;//取反 a=~a; tt=((b*256)+a+1)*0.0625;//求负的温度 t=tt; } else { flag=0;//正温标志位置0 tt=((b*256)+a)*0.0625;//求正的温度 t=tt; } return(t);}/******************************温度计算*********************************/worktemp(void){ realtemp=readtemp();//将读取的温度赋给realtemp bai=realtemp/100; shi=(realtemp%100)/10; ge=realtemp%10; xiaoshu=realtemp-(bai*100+shi*10+ge); { if(flag==1)//标志位显示判断 { zifu(0xbe,0x80,2,0,&fuhao); //显示"符号-" } else {zifu(0xbe,0x80,2,5,&fuhao);} } if(bai!=0) //百位显示判断 { zifu(0xbe,0x88,2,bai,&shu); } else { zifu(0xbe,0x88,2,5,&fuhao); if(shi!=0) //十位显示判断 { zifu(0xbe,0x90,2,shi,&shu); } else {zifu(0xbe,0x90,2,5,&fuhao);} } zifu(0xbe,0x98,2,ge,&shu); //个位显示 zifu(0xbe,0xa0,2,1,&fuhao); zifu(0xbe,0xa8,2,xiaoshu,&shu); //小数位显示 zifu(0xbe,0xb0,4,3,&fuhao); //显示温度单位"。C" }/***********************************************************************************************************时间模块程序********************************************************************************************************//**************************时间值和日期的计算*****************************/workhour(){ //时间的计算 h1=hour/10; h2=hour%10; //小时 f1=minute/10; f2=minute%10;//分钟 s1=second/10; s2=second%10;//秒 m1=month/10;//日期的计算 m2=month%10; d1=day/10; d2=day%10;}/**************************显示时间和日期*********************************/voidshixian(){ workhour(); //取时间和日期 zifu(0xba,0x50,2,h1,&shu);//显示"小时" zifu(0xba,0x58,2,h2,&shu); zifu(0xba,0x70,2,f1,&shu);//显示"分" zifu(0xba,0x78,2,f2,&shu); zifu(0xba,0x90,2,s1,&shu);//显示"秒" zifu(0xba,0x98,2,s2,&shu); zifu(0xbc,0x68,2,m1,&shu);//显示"月份" zifu(0xbc,0x70,2,m2,&shu); zifu(0xbc,0x80,2,d1,&shu);//显示"日子" zifu(0xbc,0x88,2,d2,&shu); }/*******************************T0中断函数******************************/voidtimer()interrupt1 //中断函数{ TH0=(65536-50000)/256; //给T0赋初值 TL0=(65536-50000)%256; count++; if(count==20) //满一秒钟,秒加1 { count=0; second++; if(second==60) //满一分钟,分加1 { second=0; minute++; if(minute==60) //满一小时 ,时加1 { minute=0; hour++; if(hour==24) //满了一日,日加1 { hour=0; day++; if(day==30) //满了一月,月加1 { day=0; month++; } } } } } }/*******************************************************************************************************声音模块程序***********************************************************************************************************************//******************************延时*******************************************/voiddelaysj(unsignedcharj)//延时程序{ unsignedchari; while(j--) { for(i=0;i<50;i++); }}/****************************蜂鸣器***********************************/voids_fmq(){ unsignedcharj=2; //蜂鸣器叫 while(j--) { fmq=~fmq; delaysj(3); }}/*************************闹铃判断**********************************/voidnling(){unsignedchari;for(i=0;i<20;i++) { if(hour==ds[i][0]&&minute==ds[i][1]) //判断是否到闹铃时间 { s_fmq(); //调用蜂铃 } }}/************************************************************************************************************调节模块程序*****************************************************************************************************************//*****************************调节模式****************************************/voidtiaojie(){ if(mode==0) { while(!mode); mode_value++; } zifu(0xbc,0xb8,2,mode_value,&shu); switch(mode_value) { //模式0:正常工作。显示"祝你快乐" case0:{hanzi(0xbe,0x40,8,6,&zi);}break; case1:{ // 模式1:可以修改时间,其中inc是改分钟,dec是改小时 if(inc==0){while(!inc);minute++;if(minute==60)minute=0;} if(dec==0){while(!dec);hour++;if(hour==24)hour=0;} hanzi(0xbe,0x40,8,10,&zi); };break; case2:{ // 模式2:选择一个需要改变的闹铃 if(inc==0){while(!inc);xf++;if(xf==20)xf=0;} if(dec==0){while(!dec);xf--;if(xf==0)xf=19;} zifu(0xbe,0x40,2,xf/10,&shu); zifu(0xbe,0x48,2,xf%10,&shu); zifu(0xbe,0x68,2,2,&fuhao); zifu(0xbe,0x70,2,ds[xf][1]/10,&shu); zifu(0xbe,0x78,2,ds[xf][1]%10,&shu); zifu(0xbe,0x50,2,0,&fuhao); zifu(0xbe,0x58,2,ds[xf][0]/10,&shu); // 显示"调整后的闹铃时间" zifu(0xbe,0x60,2,ds[xf][0]%10,&shu); };break; case3:{ //模式3:修改选定的闹铃的分钟 if(inc==0){while(!inc);ds[xf][1]++;if(ds[xf][1]==60)ds[xf][1]=0;} if(dec==0){while(!dec);ds[xf][1]--;if(ds[xf][1]==0)ds[xf][1]=59;} hanzi(0xbe,0x40,2,3,&zi); //显示"分" zifu(0xbe,0x58,2,ds[xf][0]/10,&shu); // 显示"调整后的闹铃时间" zifu(0xbe,0x60,2,ds[xf][0]%10,&shu); zifu(0xbe,0x68,2,2,&fuhao); zifu(0xbe,0x70,2,ds[xf][1]/10,&shu); zifu(0xbe,0x78,2,ds[xf][1]%10,&shu); };break; case4:{ //模式4:修改选定的闹铃的小时 if(inc==0){while(!inc);ds[xf][0]++;if(ds[xf][0]==24)ds[xf][0]=0;} if(dec==0){while(!dec);ds[xf][0]--;if(ds[xf][0]==0)ds[xf][0]=23;} hanzi(0xbe,0x40,2,2,&zi); // 显示"时" zifu(0xbe,0x58,2,ds[xf][0]/10,&shu); // 显示"调整后的闹铃时间" zifu(0xbe,0x60,2,ds[xf][0]%10,&shu); zifu(0xbe,0x68,2,2,&fuhao); zifu(0xbe,0x70,2,ds[xf][1]/10,&shu); zifu(0xbe,0x78,2,ds[xf][1]%10,&shu); };break; case5:{xf=0;mode_value=0;};break; //模式5:确认修改,返回正常工作状态 default:break; }}/*************************************************************************************************************主函数**********************************************************************************************************/实验程序voidmain(void){ init(); //ds18b20初始化 LCD_inti(); //12864初始化 xingxian(); //调用显示固定的汉字,例如姓名和学号 TMOD=0X01; // T0工作在方式1 TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; //开中断 ET0=1; TR0=1; //启动中断T0 while(1) { worktemp(); //温度显示 shixian(); //时间显示 tiaojie(); //时间调节 nling(); //用于定时闹钟 }}目录TOC\o"1-2"\p""\h\z\u第一章总论 11.1项目概况 11.2研究依据及范围 31.3主要技术经济指标 41.4研究结论及建议 4第二章项目建设的背景和必要性 62.1项目建设的背景 62.2项目建设的必要性 8第三章项目服务需求分析 11第四章项目选址与建设条件 134.1选址原则 134.2项目选址 134.3建设条件 144.4项

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论