日期与时间显示系统课程设计_第1页
日期与时间显示系统课程设计_第2页
日期与时间显示系统课程设计_第3页
日期与时间显示系统课程设计_第4页
日期与时间显示系统课程设计_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

《单片机技术》课程设计任务书设计内容及要求利用AT89S51单片机最小系统板完成日期与时间显示系统,其硬件原理如下图所示,显示采用8位共阴LED,显示驱动及键盘扫描采用CH452芯片实现,CH452与AT89S51的连接使用SPI接口。要求通过系统软件设计实现以下功能:基本功能(1)实现日期和时间在8块LED上轮流显示,间隔时间大概在5~10秒。(2)实现日期和时间可用键盘进行设置调整。2、扩展功能(1)可以利用键盘选择显示模式:①只显示时间;②只显示日期;③时间与日期轮流显示。(2)可以实现闹钟功能,闹钟使用蜂鸣器发出声音。二、设计任务1、根据设计内容与要求,弄清系统及各个模块的工作流程,完成系统的软件设计,包括系统主程序、显示子程序、键盘设置子程序、时间调整子程序等,可使用汇编语言或是C语言编写,建议使用C语言编写。2、完成系统的仿真与调试,使得系统在脱机情况下,能稳定可靠的工作。3、编写课程设计报告。三、预备知识1、51单片机原理与接口技术2、详细了解CH452数据手册,特别是单片机与CH452接口通信时序。四、设计报告要求设计完成后,必须撰写课程设计报告。设计报告必须独立完成,格式符合要求,文字(不含图形、程序)不少于3000字,图形绘制规范。设计报告的格式如下:1、封面2、任务书3、内容提要(摘要)4、目录5、正文(1)课题的意义、本人所做的工作、系统的主要功能及工作流程;(2)硬件电路原理描述;(请详细说明电路原理并给出相应的原理图)(3)软件设计流程及描述;(请详细说明软件设计思路并给出相应的流程图)6、心得体会7、参考文献8、附录(1)系统总硬件电路原理图;(2)系统源程序代码(要有注释)。五、考核方式单片机课程设计的考核方式为考查,考核结果为优秀、良好、中等、及格和不及格五等,分数在90-100之间为优秀,80-89分之间为良好,70-79分之间为中等,60-69分之间为及格,60分以下为不及格。考核分三个方面进行:日常表现20%;设计与答辩50%;设计报告30%。课程设计内容摘要设计时间进度安排时间内容周一一、布置设计内容和要求实习内容介绍、实习安排、实习纪律、注意事项根据所选题的要求,进行总体设计,确定程序总体框架周二、三(2天)二、系统设计1)实现日期和时间在8块LED上轮流显示,间隔时间大概在5~10秒。2)实现日期和时间可用键盘进行设置调整。3)日期能区分闰年与非闰年,月份与天数的关系。周四(1天)三、系统调试1)矩阵键盘程序测试2)蜂鸣器作为闹钟提醒功能。周五(1天)四、测试完整程序与报告上交1、要求功能完整,结果符合设计要求,并进行程序验收。(答辩)2、完成实习报告的编写,并打印上交报告。

正文本人所做的工作、系统的主要功能及工作流程此次课程设计是我们两个人共同完成的,也没有明确的分工,是我们一起讨论、理解原理及调试成功的。我们实现了随时设置时间、设置年月日并且可以判断是否是闰年及闰年时二月为28天、设置闹钟等功能。二.硬件调试89S52、CH452等芯片不插入,在板上标注清楚VCC与GND,用万用表检查是否短路?若无,加上DC5V电源,然后:1、看电源灯是否亮?2、检查89S52、CH452管脚座的VCC与GND之间是否为5V?若是,关闭电源,插上芯片与仿真器可以开始仿真调试。加上DC5V电源后,电源灯亮,用万用表检查89S52、CH452管脚座的VCC与GND之间的电压为5V。三.系统软件设计(1)、主程序(2)、显示子程序=1\*GB3①写CH452操作命令子程序②8位LED显示子程序(3)、键盘设置子程序①读CH452按键值子程序②时间设置与调整子程序(4)、时间子程序①1秒定时子程序②秒、分、时、天时间增长子程序(5)闹钟设置子函数四.各子程序设计1、写CH452操作命令子程序(1)参照CH452的时序进行编程。操作命令是12位的,DIN要传送12位的串行数据,8051的寄存器是8位的,因此要使用两个寄存器存放要发送的数据,在C中只需将要发送的数据变量定义成int型即可。然后将该数据右移1位赋值到DIN引脚,再使得DCLK=0,DCLK=1,产生上升沿,从而使得该位发送出去,共移位12次,就将一个完整的操作命令发送完毕,加载到了CH452。CH452就会响应该命令。(2)程序:sbitdclk=P1^0;sbitdin=P1^1;sbitload=P1^2;sbitdout=P1^3;voidoutdata(unsignedinto_data){unsignedchari;for(i=0;i<12;i++)//输出12数据{din=(o_data>>i)&0x0001;//取位dclk=0;dclk=1;}load=0;//加载12位数据load=1;}2、8位LED显示子程序(1)以加载第0位LED为例(根据附录中的加载字数据查找DIG0对应的字数据):加载字数据01000DIG_DATA,如:要显示“8”,只需发送:100001111111操作命令:(2)8位LED显示子程序:unsignedcharcodeledtab[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//共阴voiddisplay(unsignedchardis_data[8]){outdata(0x0800+ledtab[dis_data[0]]);outdata(0x0900+ledtab[dis_data[1]]);outdata(0x0a00+ledtab[dis_data[2]]);outdata(0x0b00+ledtab[dis_data[3]]);outdata(0x0c00+ledtab[dis_data[4]]);outdata(0x0d00+ledtab[dis_data[5]]);outdata(0x0e00+ledtab[dis_data[6]]);outdata(0x0f00+ledtab[dis_data[7]]);}3、读按键值子程序(1)读按键值时序当启用键盘扫描功能后,DOUT用于键盘中断和数据输出,默认是高电平。当CH452检测到有效按键时,DOUT输出低电平有效的键盘中断;单片机被中断后,发出读取按键代码命令,CH452在LOAD的上升沿后从DOUT输出7位按键代码的最高位;单片机继续输出串行时钟,在DCLK的每个下降沿,CH452依次从DOUT输出7位按键代码的剩余6位,顺序是高位在前,低位在后;7位按键代码输出完毕后,无论DCLK如何变化,CH452都将DOUT恢复为默认的高电平。(2)程序:unsignedcharindata(){unsignedchari,i_data;i_data=0;outdata(0x7ff);//读按键命令for(i=0;i<7;i++){i_data=(i_data<<1)|dout;dclk=0;dclk=1;}//读键值returni_data;}4、时间设置调整子程序(1)内容:年、月、日、小时、分钟、秒(2)要求:①、当设置年月日时,LED显示当前年月日,设置相应的位时,该位实时显示设置值。②、当设置时分秒时,LED显示当前时分秒,设置相应的位时,该位实时显示设置值。(3)方法:按键1——加(+),按键2——设置年、月、日,按键3——设置时、分、秒(4)设置年月日方法:当按键2按1次——进入年月日设置,且开始调整年的第1位;当按键2按2次——开始调整年的第2位;按按键1(+)调整;当按键2按3次——开始调整年的第3位;按按键1(+)调整;当按键2按4次——开始调整年的第4位;按按键1(+)调整;当按键2按5次——开始调整年的第5位;按按键1(+)调整;当按键2按6次——开始调整年的第6位;按按键1(+)调整;当按键2按7次——开始调整年的第7位;按按键1(+)调整;当按键2按8次——开始调整年的第8位;按按键1(+)调整;当按键2按9次——设置完成,退出,系统恢复正常运行。(5)设置时分秒方法:当按键3按1次——进入时分秒设置,且开始调整时的第1位;当按键3按2次——开始调整时的第2位;按按键1(+)调整;当按键3按3次——开始调整时的第3位;按按键1(+)调整;当按键3按4次——开始调整时的第4位;按按键1(+)调整;当按键3按5次——开始调整时的第5位;按按键1(+)调整;当按键3按6次——开始调整时的第6位;按按键1(+)调整;当按键3按7次——设置完成,退出,系统恢复正常运行。5、1s延时子程序voiddelay(unsignedcharx){unsignedchari,j,k;//延时1sdo{for(i=10;i.>0;i--;)for(j=108;j>0;j--;)for(k=249;k.0;k--)}while(--x);}6、秒、分、时、天时间增长子程序voidtimego(){if(time[5]==10){time[5]=0;time[4]=time[4]+1;}if(time[4]==6){time[4]=0;time[3]=time[3]+1;}if(time[3]==10){time[3]=0;time[2]=time[2]+1;}if(time[2]==6){time[2]=0;time[1]=time[1]+1;}if(time[0]<2){if(time[1]==10){time[1]=0;time[0]=time[0]+1;}}if(time[0]==2){if(time[1]==4){time[1]=0;time[0]=0;day[7]=day[7]+1;}}}7、主程序的编写(1)内容:①CH452的初始化,相关SFR的初始化,比如定时器、中断系统等,时间日期的初始化②交替显示时间与日期=3\*GB3③是否进行日期设置调整?=4\*GB3④是否进行时间设置调整?⑤是否进行闹钟设置调整?程序voidmain()//主程序{inti=0,j=0;init_ch452();init_t0();//ch452初始化,定时器初始化EA=1;IT0=1;EX0=1;//开启中断flag=0;buzzer=1;while(1){if(flag<5)disp_time();if(flag>=5&&flag<=10)disp_day();//隔5秒时间和日期轮流显示if(flag>10)flag=0;switch(n){casekey2:n=0;adjust_day();break;//按2键调整日期casekey3:n=0;adjust_time();break;//按3键调整时间casekey1:n=0;alarm_set();break;//按1键调整时间default:break;}if(time[0]==alarm[0]&&time[1]==alarm[1]&&time[2]==alarm[2]&&time[3]==alarm[3]&&time[4]==alarm[4]&&time[5]==alarm[5]){while(1){if(n==key3){n=0;buzzer=1;break;}elsebuzzer=0;}}}}程序流程图心得体会通过本次课程设计,我们都觉得收获很多,让我们进一步学会了看时序图写程序,而且通过这次课程设计也增强了自己的动手能力,也增强了对编程时出现的一些问题的解决能力,并且修改代码真的需要很认真细心,还要有耐心。参考文献1.数码管驱动及键盘控制芯片CH452的工作手册;2.附录系统总硬件电路原理图2、系统源程序代码#include<reg51.h>#definereset0x201#definesys0x403#definedispmode0x508#definekey10x40//按键一#definekey20x48//按键二#definekey30x50//按键三#definekey40x58//按键四unsignedcharday_show[8];unsignedcharday[8]={2,0,0,0,0,2,2,7};//日期unsignedchartime[6]={2,3,5,9,2,3};//时间unsignedcharalarm[6]={0,0,0,0,0,0};//闹铃时间unsignedcharcodeledtab[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};unsignedinta;unsignedcharn;unsignedcharflag;sbitload=P1^0;sbitdin=P1^1;sbitdclk=P1^2;sbitdout=P3^2;sbitbuzzer=P2^0;voidoutdata(unsignedinto_data);//CH452操作命令子程序unsignedcharindata();//读按键键值子程序voidinit_ch452();//CH452的初始化voidinit_t0();//T0的初始化voiddelay(unsignedcharx);//延时1s*xvoiddisplay(unsignedchardis_data[8]);//8位LED显示voiddisp_day();//日期显示voiddisp_time();//时间显示voiddisp_alarm();//闹铃显示voidadjust_day();//设置年月日voidadjust_time();//设置时分秒voidalarm_set();//设置闹铃voidtimego();//定时器0中断处理函数秒、分、时、天时间增长子程序/****************************************//*主函数*//****************************************/voidmain()//主程序{inti=0,j=0;init_ch452();//ch452初始化init_t0();//定时器初始化EA=1;//开启总中断IT0=1;EX0=1;flag=0;buzzer=1;while(1){if(flag<5)disp_time();if(flag>=5&&flag<=10)disp_day();//隔5秒时间和日期轮流显示if(flag>10)flag=0;switch(n){casekey2:n=0;adjust_day();break;//按2键调整日期casekey3:n=0;adjust_time();break;//按3键调整时间casekey1:n=0;alarm_set();break;default:break;}if(time[0]==alarm[0]&&time[1]==alarm[1]&&time[2]==alarm[2]&&time[3]==alarm[3]&&time[4]==alarm[4]&&time[5]==alarm[5]){while(1){if(n==key3){n=0;buzzer=1;break;}elsebuzzer=0;}}}}/****************************************//*外部中断0函数*//****************************************/voidint_int0()interrupt0{n=indata();IE0=0;}/****************************************//*CH452操作命令子程序(单-452)*//****************************************/voidoutdata(unsignedinto_data){unsignedchari;for(i=0;i<12;i++)//输出12数据{din=o_data&0x0001;//取位o_data=o_data>>1;dclk=0;dclk=1;}load=0;//加载12位数据load=1;}/****************************************//*读按键键值子程序(452-单)*//****************************************/unsignedcharindata(){unsignedchari,i_data;i_data=0;outdata(0x7ff);//读按键命令for(i=0;i<7;i++){i_data=(i_data<<1)|dout;dclk=0;dclk=1;}//读键值returni_data;}/****************************************//*CH452的初始化*//****************************************/voidinit_ch452(){din=0;din=1;outdata(reset);//芯片内部复位outdata(sys);//设置系统参数,开键盘显示outdata(dispmode);//设置显示不译码方式、开8位显示、显示亮度为8/16}/****************************************//*定时器T0的初始化*//****************************************/voidinit_t0(){TMOD=0x02;//工作于方式2,自动加载TL0=0xCE;//100usTH0=0xCE;IE=0x82;//允许T0中断TR0=1;//开启定时器}/****************************************//*延时函数*//****************************************/voiddelay(unsignedcharx)//延时1s*x{unsignedchari,j,k;//延时1sdo{for(i=10;i>0;i--)for(j=108;j>0;j--)for(k=249;k>0;k--);}while(--x);}/****************************************//*显示函数*//****************************************/voiddisplay(unsignedchardis_data[8])//8位LED显示dis[4][5][6][7][0][1][2][3]{outdata(0x0800+ledtab[dis_data[4]]);outdata(0x0900+ledtab[dis_data[5]]);outdata(0x0a00+ledtab[dis_data[6]]);outdata(0x0b00+ledtab[dis_data[7]]);outdata(0x0c00+ledtab[dis_data[0]]);outdata(0x0d00+ledtab[dis_data[1]]);outdata(0x0e00+ledtab[dis_data[2]]);outdata(0x0f00+ledtab[dis_data[3]]);}/****************************************//*日期显示函数*//****************************************/voiddisp_day()//日期显示day_[6][7]日[4][5]月[0][1][2][3]年{day_show[0]=day[6];day_show[1]=day[7];day_show[2]=day[4];day_show[3]=day[5];day_show[4]=day[0];day_show[5]=day[1];day_show[6]=day[2];day_show[7]=day[3];display(day_show);}/****************************************//*时间显示函数*//****************************************/voiddisp_time()//时间显示time[4][5]秒[2][3]分[[0][1]时{unsignedchardis_data[8];dis_data[7]=time[1];dis_data[6]=time[0];dis_data[5]=10;dis_data[4]=time[3];dis_data[3]=time[2];dis_data[2]=10;dis_data[1]=time[5];dis_data[0]=time[4];display(dis_data);}/****************************************//*闹钟显示*//****************************************/voiddisp_alarm()//时间显示alarm[4][5]秒[2][3]分[[0][1]时{unsignedchardis_data[8];dis_data[7]=alarm[1];dis_data[6]=alarm[0];dis_data[5]=10;dis_data[4]=alarm[3];dis_data[3]=alarm[2];dis_data[2]=10;dis_data[1]=alarm[5];dis_data[0]=alarm[4];display(dis_data);}/****************************************//*设置日期*//****************************************/voidadjust_day()//设置年月日{chari;for(i=0;i<8;i++){while(1) {if(i<4)outdata(0x600|(0x01<<(i+4)));//闪烁if(i>=4)outdata(0x600|(0x01<<(i-4)));disp_day(); if(n==key1)//按key1调整{switch(i){case0:day[6]=day[6]+1;n=0;if(day[6]==10){day[6]=0;};break;case1:day[7]=day[7]+1;n=0;if(day[7]==10){day[7]=0;};break;case2:day[4]=day[4]+1;n=0;if(day[4]==10){day[4]=0;};break;case3:day[5]=day[5]+1;n=0;if(day[5]==10){day[5]=0;};break;case4:day[0]=day[0]+1;n=0;if(day[0]==10){day[0]=0;};break;case5:day[1]=day[1]+1;n=0;if(day[1]==10){day[1]=0;};break;case6:day[2]=day[2]+1;n=0;if(day[2]==10){day[2]=0;};break;case7:day[3]=day[3]+1;n=0;if(day[3]==10){day[3]=0;};break;default:break;}} if(n==key2){n=0;//key2移位if(i==7)i=-1;break;}if(n==key4){outdata(0x600);break;}//key4设置完成}if(n==key4)break;outdata(0x600);}while(1){if(n==key4)break;}}/****************************************//*设置时间*//****************************************/voidadjust_time()//设置时分秒{chari;TR0=0;for(i=0;i<6;i++){while(1){if(i==0)outdata(0x600|0x10);//闪烁控制if(i==1)outdata(0x600|0x20);if(i==2)outdata(0x600|0x80);if(i==3)outdata(0x600|0x01);if(i==4)outdata(0x600|0x04);if(i==5)outdata(0x600|0x08);disp_time(); if(n==key1){switch(i)//按key1调整{case0:time[4]=time[4]+1;n=0;if(time[4]==6){time[4]=0;};break;//秒个位加1case1:time[5]=time[5]+1;n=0;if(time[5]==10){time[5]=0;};break;//秒十位加1case2:time[2]=time[2]+1;n=0;if(time[2]==6){time[2]=0;};break;//分个位加1case3:time[3]=time[3]+1;n=0;if(time[3]==10){time[3]=0;};break;//秒十位加1case4:time[0]=time[0]+1;n=0;if(time[0]==10){time[0]=0;};break;//时个位加1case5:time[1]=time[1]+1;n=0;if(time[1]==10){time[1]=0;};break;//时十位加1default:break;}} if(n==key3)//按key3移位{n=0;if(i==5)i=-1;break;}if(n==key4){outdata(0x600);break;}//key4完成设置}if(n==key4)break;outdata(0x600);}while(1){if(n==key4)break;}TR0=1;}/****************************************//*设置闹钟*//****************************************/voidalarm_set(){chari;for(i=0;i<6;i++){while(1){if(i==0)outdata(0x600+0x10);if(i==1)outdata(0x600+0x20);if(i==2)outdata(0x600+0x80);if(i==3)outdata(0x600+0x01);if(i==4)outdata(0x600+0x04);if(i==5)outdata(0x600+0x08);disp_alarm(); if(n==key1){switch(i){case0:alarm[4]=(alarm[4]+1)%6;n=0;break;//秒个位加1case1:alarm[5]=(alarm[5]+1)%10;n=0;break;//秒十位加1case2:alarm[2]=(alarm[2]+1)%6;n=0;break;//分个位加1case3:alarm[3]=(alarm[3]+1)%10;n=0;break;//秒十位加1case4:alarm[0]=(alarm[0]+1)%3;n=0;break;//时个位加1case5:alarm[1]=(alarm[1]+1)%10;n=0;break;//时十位加1default:break;}} if(n==key3){n=0;if(i==5)i=-1;break;}if(n==key4){outdata(0x600);break;}}if(n==key4)break;outdata(0x600);}while(1){if(n==key4)break;}TR0=1;}/******************************************************//*定时器0中断处理函数秒、分、时、天时间增长子程序*//******************************************************/voidtimego()interrupt1{intyear,bool

温馨提示

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

评论

0/150

提交评论