




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学士学位毕业设计(论文)基于单片机的多功能数字电子钟设计学生姓名:XX学号:XXXXXX指导教师:XXXX所在学院:XXXXXXXX专业:XXXXXXXXXXXXX中国·大庆2014年5月黑龙江八一农垦大学本科毕业设计(论文)任务书学生姓名XXX所在班级XXX2010级导师姓名XXX导师职称副教授论文题目基于单片机的多功能数字电子钟设计题目分类1.应用与非应用类:〇工程〇科研〇教学建设〇理论分析〇模拟2.软件与软硬结合类:〇软件〇硬件〇软硬结合〇非软硬件(1、2类中必须各选一项适合自己题目的类型在〇内打√)主要研究内容及指标:1)显示年、月、日、星期等日历相关信息。通过按键设置年月日和星期,以及定时闹钟。2)掉电后时钟芯片正常运行,重新上电后不用校正时钟。3)定时时间到达时,蜂鸣器报警。4)实时温湿度显示。主要参考文献:[1]张开碧,王浩,曾勇斌.基于STC89C52单片机的多功能数字钟的设计[J].科学之友:下旬.2010[2]51单片机学习论坛[DB]./bbs/[3]黄智伟.全国大学生电子设计竞赛常用电路模块制作[M].北京:北京航空航天大学出版社.2011[4]ANALOG
DEVICES.The
technology
of
AT89C51[EB/OL].Spe.28.2000阶段规划:2014年02月17日——2014年02月28日审题,查阅相关资料完成开题报告2014年03月01日——2014年03月15日依据相关的资料进行毕业设计2014年03月16日——2014年03月31日写毕业设计报告2014年04月01日——2014年04月23日论文格式审查2014年04月23日——2014年05月07日准备答辩开题时间2014.02.17完成论文时间2014.05.17专家审定意见:系主任签字:年月日注:1.任务书由指导教师填写后交给学生,要求学生妥善保存。2.此任务书夹于论文扉页与论文一并装订,作为论文评分依据之。摘要——附录一原理图附录二程序清单/* 黄历电子智能时钟程序 单片机:STC89C52RC 晶振:12MHz 时钟芯片:DS1302 液晶屏:LCM-12864-ST7920 功能描述:大数字显示时间;能显示农历、温湿了度和设置闹铃;有整点报时功能 红外遥控和按键都能设置时间和闹铃 说 明:LCD12864使用并口连接方式,PSB、RST接高电平 修改日志:*//*头文件*/#include<reg52.h>#include<intrins.h>#include"LCD12864.h"#include"DS1302.h"#include"nongli.h"#include"displaytime.h"#include"zk.h"#include"bell.h"#include"HW.H"#include"delay.h"#defineuintunsignedint#defineucharunsignedchar/*定义按键*/sbitK1=P1^4;//K1-设置sbitK2=P1^5;//K2-确认、返回sbitK3=P1^6;//K3-加sbitK4=P1^7;//K4-减//K5=P1^4,K5-控制闹钟的打开与关闭,在"hw.h"中定义/*函数声明*/ voidds_w0(void);voidds_w(void);voidConver_week(bitc,ucharyear,ucharmonth,ucharday);/*定义全局变量*/bitw=0;//调时标志位unsignedcharyy,mo,dd,xq,hh,mm,ss,month_moon,day_moon,week,tiangan,dizhi,moontemp1,moontemp2;//定义时间映射全局变量(专用寄存器)signedcharaddress,item,item0,max,mini;unsignedcharclk_ala[2]={0x00,0x00};//闹钟数据存放初,始值为00:00unsignedcharhour,minute,time;//用于闹铃的设置/*日期、时间设置函数*/voidtiaozheng(void){ yy=read_clock(0x8d);//调用1302时钟数据中的年数据,从地址0x8d中 mo=read_clock(0x89);//调用1302时钟数据中的月数据,从地址0x89中 dd=read_clock(0x87);//从1302芯片中读取日数据,从地址0x87中 week=read_clock(0x8b);//从1302芯片中读取星期数据,从地址0x8b中 // lcm_w_test(0,0x80); lcm_w_word("20");//显示内容字符20 lcm_w_test(1,(yy/16)+0x30);//函数参数1,代表本行写数据,YY/16+0X30得出年十位数字的显示码地址,送显示 lcm_w_test(1,yy%16+0x30);//函数 lcm_w_word("年"); // lcm_w_test(1,(mo/16)+0x30); lcm_w_test(1,mo%16+0x30);//与16取余数,得到月份的个位数,加0x30得到该数字的液晶内定显示码送显示 lcm_w_word("月");//调用字符显示函数,显示文字月 ///* lcm_w_test(0,0x88);//第一个参数0,表示本行写入LCM的是指令,指定显示位置88H(第三行左端) lcm_w_word("星期");//调用字符显示函数,显示文字星期 lcm_w_test(1,mo%16+0x30);//与16取余数,得到月份的个位数,加0x30得到该数字的液晶内定显示码送显示*/ // lcm_w_test(1,(dd/16)+0x30); lcm_w_test(1,dd%16+0x30);//第一个1参数,表示本行写数据,日数据与16取余得个位数,加0x30得到显示码 lcm_w_word("日");//显示字符日 // if(read_clock(0x85)!=hh){//如果程序中的小时与1302芯片中的不同, hh=read_clock(0x85);//刷新程序中的小时数据 } lcm_w_test(0,0x91);//第一个参数0,表示本行写入LCM的是指令,指定显示位置88H(第三行左端) lcm_w_test(1,(hh/16)+0x30);//显示十位 lcm_w_test(1,hh%16+0x30);//显示个位 lcm_w_word("时"); // if(read_clock(0x83)!=mm){//如果1302芯片中的分钟数据与程序中的分钟变量不相等 mm=read_clock(0x83);//刷新程序中的分钟数据 } lcm_w_test(1,(mm/16)+0x30);//向液晶写数据,显示分钟的十位数 lcm_w_test(1,mm%16+0x30);//向液晶写数据,显示分钟的个位数 lcm_w_word("分"); // if(read_clock(0x81)!=ss){//如果1302芯片中的分钟数据与程序中的秒钟变量不相等(0x81为读秒数据0x80为写秒数据) ss=read_clock(0x81);//刷新程序中的秒钟数据 } lcm_w_test(1,(ss/16)+0x30);//向液晶写数据,显示分钟的十位数 lcm_w_test(1,ss%16+0x30);//向液晶写数据,显示分钟的个位数 lcm_w_word("秒");////////////////////////////////////////////////////////////////////// //=========显示闹钟的设置时间=================== hour=clk_ala[0]; //取出上一次的闹钟小时值 minute=clk_ala[1]; //取出上一次的闹钟分钟值 lcm_w_test(0,0x88); lcm_w_word("闹钟"); // lcm_w_test(1,(hour/10)+0x30);//显示小时十位 lcm_w_test(1,(hour%10)+0x30);//显示小时个位 // lcm_w_word(":"); // lcm_w_test(1,(minute/10)+0x30);//显示分钟的十位 lcm_w_test(1,(minute%10)+0x30);//显示分钟的个位 // lcm_w_word("");/////////////////////////////////////////////////////////////////////////}/*****************************************************************************///被调数据加一或减一,并检查数据范围,写入1302指定地址保存voidds_w(void){ item0=time; item=((read_clock(address+1))/16)*10+(read_clock(address+1))%16;//时间的调整 if(K3==0||key_add==1){//如果按动上调键 item++;//数加1 } if(K4==0||key_minish==1){//如果按动下调键 item--;//数减1 } if(item>max)item=mini;//查看数值是否在有效范围之内 if(item<mini)item=max;//如果数值小于最小值,则自动等于最大值 write_clock(0x8e,0x00);//允许写1302芯片操作 write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302 write_clock(0x8e,0x80);//写保护,禁止写操作}/********************************************************************///===============闹钟时间的加减设置======================voidds_w0(void){item0=time;if(K3==0||key_add==1){//如果按动上调键 item0++;//数加1 }if(K4==0||key_minish==1){//如果按动下调键 item0--;//数减1 }if(item0>max)item0=mini;//查看数值是否在有效范围之内if(item0<mini)item0=max;//如果数值小于最小值,则自动等于最大值time=item0;//调整后的时间重新赋值给time(time为hour或minute),这步很重要,没有将无法更新闹钟数据}/**********************************************************************************************************///调整时间子函数,设置键、数据范围、上调加一,下调减一功能。voidSet_time(unsignedcharsel){//根据选择调整的相应项目加1并写入DS1302,函数参数是按动设置键的次数 write_com(0x30);write_com(0x06); lcm_w_test(0,0x98);//第一参数0表示本行写入指令,指定下面行的调整显示起始位置为9AH lcm_w_word(">>调整>><<<<");//调用字符显示函数,显示调整字样/* if(sel==8){lcm_w_word("星期");address=0x8a;max=7;mini=1; tiaozheng();ds_w();tiaozheng(); }*///================================================================ lcm_w_test(0,0x9c); if(sel==7){lcm_w_word("闹钟分");time=minute;max=59;mini=0; tiaozheng();//显示调整前的内容ds_w0();//设置闹钟 clk_ala[1]=time;//把更新后的分钟数据重新保存tiaozheng();//显示调整后的内容 }//按动8次显示调整闹钟的分钟部分 if(sel==6){lcm_w_word("闹钟时");time=hour;max=23;mini=0;tiaozheng();ds_w0(); clk_ala[0]=time;//把更新后的小时数据重新保存tiaozheng(); }//按动7次显示调整闹钟的小时部分//================================================================ if(sel==5){lcm_w_word("秒钟");address=0x80;max=59;mini=0; tiaozheng();//调用日期、时间调整函数 ds_w(); //被调数据加一或减一函数 tiaozheng(); } //秒6,按动6次显示调整秒钟 //并指定秒钟数据写入1302芯片的写入地址是0x80,秒钟数据的最大值是59,最小值是0 if(sel==4){lcm_w_word("分钟");address=0x82;max=59;mini=0; tiaozheng(); ds_w(); tiaozheng(); } //分钟5,按动5次显示调整分钟 //并指定分钟数据写入1302芯片的地址是0x82,分钟数据的最大值是59,最小值是0 if(sel==3){lcm_w_word("小时");address=0x84;max=23;mini=0; tiaozheng(); ds_w(); tiaozheng(); } //小时4,按动4次显示调整小时 //规定小时数据写入1302芯片的位置是0x84,小时数据最大值23,最小值是0 if(sel==2){lcm_w_word("日期");address=0x86; mo=read_clock(0x89);//读月数据 moontemp1=mo/16; moontemp2=mo%16; mo=moontemp1*10+moontemp2;//转换成10进制月份数据yy=read_clock(0x8d);//读年数据moontemp1=yy/16; moontemp2=yy%16; yy=moontemp1*10+moontemp2;//转换成10进制年份数据if(mo==2&&yy%4!=0){max=28;mini=1;}//平年2月28天 if(mo==2&&yy%4==0){max=29;mini=1;}//闰年2月29天 if(mo==1||mo==3||mo==5||mo==7||mo==8||mo==10||mo==12){max=31;mini=1;}//31天的月份 if(mo==4||mo==6||mo==9||mo==11){max=30;mini=1;}//30天的月份 tiaozheng(); ds_w(); tiaozheng();//调用日期、时间调整函数} //日3,按动3次显示调整日期 //规定日期数据写入1302的位置地址是0x86,日期最大值31,最小值是1if(sel==1){lcm_w_word("月份");address=0x88;max=12;mini=1;tiaozheng();ds_w();tiaozheng();} //月2,按动2次显示调整月份 //规定月份写入1302的位置地址是0x88,月份最大值12,最小值1if(sel==0){lcm_w_word("年份");address=0x8c;max=99;mini=0; tiaozheng();ds_w(); //被调数据加一或减一函数tiaozheng(); //调用日期、时间调整函数} //年1,按动1次显示调整年份, //规定年份写入1302的地址是0x8c,年份的最大值99,最小值0}voiddisplayDHT11(){receive();write_com(0x9c);write_data(RH/10+0x30);write_data(RH%10+0x30);write_com(0x9e);write_data(TH/10+0x30);write_data(TH%10+0x30);}/*********************************************************************************************************************************************************主函数 **************************************************************************************/********************************************************************/voidmain(){ unsignedchare=0,f=0,tmp,i;IE=0x81;//允许总中断中断,使能INT0外部中断TCON=0x01;//触发方式为脉冲负边沿触发IRIN=1;//IO口初始化BEEP=1; K1=1;K2=1;K3=1;K4=1; Init_1302(); //时钟芯片初始化 lcm_init(); //液晶初始化 welcome0();//调用欢迎信息1 DelayM(2000);//延时 //welcome();DelayM(1000);//调用欢迎信息2 lcm_clr();//清屏 Clean_12864_GDRAM(); //清屏 while(1) { if(w==0) //正常走时 { displaydate(); //显示日期 displaynl(); //显示农历 displaytime(); //显示时间 displayxq(); //显示星期 displayDHT11(); //=================以下是闹钟的相关处理=================== if(ala_flag==1){//闹钟标志位 set1616pic(6,1,0,2);}//显示"闹钟图标" else{ set1616pic(6,1,0,3);}//关闭"闹钟图标"显示 // tmp=read_clock(0x85);//取出1302小时 i=tmp/16; tmp=tmp&0x0f; tmp=tmp+i*10; if(clk_ala[0]==tmp)//与闹钟设定的小时值相同 { tmp=read_clock(0x83);//取出1302分钟 i=tmp/16; tmp=tmp&0x0f; tmp=tmp+i*10; if(clk_ala[1]==tmp)//与闹钟设定的分钟值相同 { if(ala_flag==1)//闹钟打开 { alarmbeep();//闹铃声响1分钟后自动关闭, DelayM(200);//控制闹钟响的间隔即频率 } elseBEEP=1;//关闭蜂鸣器 } elseBEEP=1;//关闭蜂鸣器 } //==============闹钟处理结束======================= } else{}//========否则启动调时=========================/*按键及红外遥控设置时间*/ if(K1==0||key_manue==1) { DelayM(8); //按键消抖/*当是调时状态本键用于调整下一项*/ if((K1==0&&w==1)||(key_manue==1&&w==1))// { e++; if(e>=8){e=0;} while(!K1);//等待键松开 key_manue=0; Set_time(e);beep();//调整 }/*当是正常状态时就进入调时状态*/ if((K1==0&&w==0)||(key_manue==1&&w==0))// { key_manue=0; lcm_clr(); Clean_12864_GDRAM();//清屏 w=1; //进入调时 Set_time(e);beep(); } while(K1==0);//等待键松开 }/*当在调时状态时就退出调时*/ if(K2==0||key
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/CGCC 96-2024影视作品区块链存证应用指南
- T/CFDCC 0217-2023家居用陶瓷岩板
- T/CEPPEA 5004.8-2020核电厂常规岛施工图设计文件内容深度规定第8部分:供暖通风与空气调节
- T/CECS 10250-2022绿色建材评价泡沫铝板
- T/CECS 10042-2019绿色建材评价无机装饰板材
- T/CCS 026-2023煤矿防爆锂电池车辆动力电源换电安全技术要求
- T/CCMA 0180-2024热风微波复合加热式沥青路面再生修补车
- T/CCMA 0096-2020非公路自卸车运行维护规程
- T/CBMMAS 001-2019 T/CHAA 010-2019适老电动护理床技术要求
- T/CBMCA 057.2-2024适老化全场景技术规范第2部分:既有居住建筑适老化改造技术标准
- 小米集团2024年环境、社会及管治报告(ESG)
- 手机媒体概论(自考14237)复习题库(含真题、典型题)
- 晶圆缺陷检测算法-全面剖析
- 江苏省苏、锡、常、镇2025年高考物理三模试卷含解析
- 体育保健学复试题及答案
- 2025年江苏省无锡市锡山区锡北片中考一模数学试题(原卷版+解析版)
- 建筑工地安全培训流程
- 2025年中考历史专题复习讲义(含练习题及答案)
- 华北电力大学丁肇豪:多主体数据中心算力-电力跨域协同优化
- 通信汛期安全培训
- 2025年初级护工考试试题及答案
评论
0/150
提交评论