您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 日历时钟单片机课程设计
1单片机课程设计——日历时钟与键盘显示程序设计姓名:管曌学号:3081109003班级:J通信0801指导老师:熊书明2日历时钟与键盘显示程序设计一、设计目的(1)能在LED显示器上实现正常的时分秒计时(2)能通过键盘输入当前时间,并从该时间开始计时(3)有校时、校分功能(4)有报时功能,通过指示灯表示(5)有闹时功能,闹时时间可以设定,通过指示灯表示二、设计内容该课程设计是利用MCS-51单片机内部的定时/计数器、中断系统、以及行列键盘和LED显示器等部件,设计一个单片机电子时钟。设计的电子时钟通过数码管显示,并能通过按键实现设置时间和暂停、启动控制等。三、MCS-51单片机系统简介单片机应用系统由硬件系统和软件系统两部分组成。硬件系统是指单片机以及扩展的存储器、I\O接口、外围扩展的功能芯片以及接口电路。软件系统包括监控程序和各种应用程序。在单片机应用系统中,单片机是整个系统的核心,对整个系统的信息输入、处理、信息输出进行控制。与单片机配套的有相应的复位电路、时钟电路以及扩展的存储器和I\O接口,使单片机应用系统能够运行。在一个单片机应用系统中,往往都会输入信息和显示信息,这就涉及键盘和显示器。在单片机应用系统中,一般都根据系统的要求配置相应的键盘和显示器。配置键盘和显示器一般都没有统一的规定,有的系统功能复杂,需输入的信息和显示的信息量大,配置的键盘和显示器功能相对强大,而有些系统输入/输出的信息少,这时可能用几个按键和几个LED指示灯就可以进行处理了。在单片机应用系统在中配置的键盘可以是独立键盘,也可能是矩阵键盘。显示器可以是LED指示灯,也可以是LED数码管,也可以是LCD显示器,还可以使用CRT显示器。单片机应用系统中键盘一般用的比较多的是矩阵键盘,显示器用的比较多的是LED数码管还LCD显示器。四、设计方案3通过键盘输入,设置当前时间存入S-3530A,然后从S-3530A读取实时时间并显示在七段码LED显示上,键盘和LED显示通过键盘专用芯片HD7279A进行控制,7279A也是I2C总线接口的芯片,系统中采用并行口线模拟I2C实现C8051F020和HD7279A的通信,用硬件实现S-3530A和HD7279A的连接。用定时/计数器T0,工作于定时,采用方式1,对系统时钟进行定时计数,初值设为23时59分50秒。定时时间为50ms。用片内RAM的7BH单元对50ms计数,计20次产生秒计数器78H单元加1,秒计数器加到60则分计数器79H单元加1,分计数器加到60则时计数器7AH单元加1,时计数器加到24则时计数器清0。然后把秒、分、时计数器分成十位和个位放到8个数码管的显示缓冲区,通过数码管显示出来。显示格式为小时十位、小时个位---分十位、分个位---秒十位、秒个位。在处理过程中加上了按键判断程序,能对按键处理,1是时加一,2是时减一,3是分加一,4是分减一,5是秒清零,D是闹钟时间的设定,E是进行校时,F是暂停键。五、系统软件设计流程:1.主程序流程如图所示:2.时间设定程序流程如图所示:开始初始化显示初始时间调用显示子程序进入功能程序按下键否?否是43.闹铃设定流程图如图所示:开始初始化选择闹铃读出数据放入RAM中显示闹铃扫描按键进行闹铃设置读出数据并保存返回主菜单开始初始化读出数据放入RAM中调用显示子程序显示时间扫描按键进行时间设置读出数据并保存返回主菜单5六、程序#includec8051f020.h#includeintrins.h#includetest7279.hunsignedcharCount1ms,set,set1,set2;//intcount;staticinttime[3]={23,59,50};//currenttimestaticchardisptime[6]={'2','3','5','9','5','0'};//显示时间intdertime[3]={00,00,01};intnowtime[3]={00,01,00};//闹钟时间voidDelay1us(unsignedcharus){while(us){_nop_();_nop_();_nop_();_nop_();_nop_();//占用一个指令周期--us;}}voidSYSCLK_Init(void){inti;OSCXCN=0x67;for(i=0;i256;i++);while(!(OSCXCN&0x80));OSCICN=0x88;}#definePRT0CFP0MDOUT#definePRT1CFP1MDOUT#definePRT2CFP2MDOUTvoidPORT_Init(void){XBR0=0x07;XBR1=0x00;XBR2=0x44;EMI0TC=0x21;P74OUT=0xFF;P0MDOUT=0x15;P1MDOUT|=0x3C;6P1&=0xc3;}voidSPI0_Init(void){SPI0CFG=0x07;SPI0CFG|=0xC0;SPI0CN=0x03;SPI0CKR=SYSCLK/2/8000000-1;}voidTimer0_Init(void){CKCON&=0xf7;//12TMOD=0x01;//t01TR0=0;Count1ms=40;TL0=0x58;TH0=(-SYSCLK/1000)8;TL0=-SYSCLK/1000;TR0=1;IE|=0x2;}charGetKeyValue(void){charKeyValue;if(CPT1CN&0x40)return-1;//无键按下Send7279Byte(0x15);//发读键盘指令00010101KeyValue=Receive7279Byte();NOSELECT7279;//置CS高电平returnKeyValue;}voidWaitKeyOff(void){while(!(CPT1CN&0x40));}voidinputnum(void)//i=5开始,输入数字显示disptime[5-i]i=5--0{charj,KeyValue,i;i=5;while(1){KeyValue=GetKeyValue();WaitKeyOff();if(((KeyValue%16)=0)&&((KeyValue%16)=9))//i=5432170{disptime[5-i]=KeyValue;if(((disptime[0]=1)||((disptime[0]==2)&&(disptime[1]4)))&&(disptime[2]6)&&(disptime[4]6)){Send7279Byte(0xC8+i);Send7279Byte(KeyValue);NOSELECT7279;i--;}}if(i0)break;}for(j=0;j3;j++)//int-char{dertime[j]=disptime[2*j]*10+disptime[2*j+1];}if(set1){set1=!set1;//设置时间}if(set2){set2=!set2;//设置时间}}voidFlashLED(unsignedcharNo){chari;Send7279Byte(0x88);//发闪烁指令i=0x1;while(No){i=i1;No--;}Send7279Byte(~i);//1闪烁NOSELECT7279;//置CS高电平}voidmain(void){charj,KeyValue;WDTCN=0xde;8WDTCN=0xad;//关看门狗SYSCLK_Init();//初始化时钟Timer0_Init();//初始化定时器PORT_Init();//初始化IO口SPI0_Init();//初始化SPI0CPT1CN|=0x80;//使能比较器1REF0CN=0x03;//使能片内参考电压DAC0CN|=0x80;//使能DAC0DAC0H=0;DAC0L=0;EA=1;//开中断Delay1us(25000);//等待25ms复位时间Send7279Byte(0xA4);//发复位指令NOSELECT7279;DispLED(disptime,0);//显示初始时间while(1){KeyValue=GetKeyValue();WaitKeyOff();if((KeyValue%16)==0x0f){set=!set;}if(set)//起停*****{if((KeyValue%16)==0x0e){set1=!set1;//设置时间}if((KeyValue%16)==0x0d){set2=!set2;//设置闹钟}if(set1)//设置时间**********{DispLED(------,0);inputnum();for(j=0;j3;j++)//int-char{time[j]=dertime[j];}}if(set2)//设置闹钟********{DispLED(------,0);inputnum();9for(j=0;j3;j++)//int-char{nowtime[j]=dertime[j];//nowtime[j]闹钟时间}}}else{switch(KeyValue%16)//校时{case1:time[0]=(time[0]+1+24)%24;break;case2:time[0]=(time[0]-1+24)%24;break;case3:time[1]=(time[1]+1+60)%60;break;case4:time[1]=(time[1]-1+60)%60;break;case0xd:FlashLED(8);break;//暂停闪烁default:break;}}}}voidTimer0_ISR(void)interrupt1{inti;TH0=0x9e;TL0=0x58;if(set==1)return;Count1ms--;//unsignedcharCount1ms会小于0,因为无符号会溢出,计数次数变大所以延迟大if(Count1ms==0)//秒{Count1ms=40;time[2]=time[2]+1;if((time[1]==59)&&(time[2]==55))//报时功能***********Send7279Byte(0xbf);//闹钟功能***********if((time[0]==nowtime[0])&&(time[1]==nowtime[1])&&(time[2]==nowtime[2]))Send7279Byte(0xbf);if(((time[1]*60+time[2]-nowtime[1]*60-nowtime[2])10)&&(time[0]==nowtime[0]))FlashLED(8);if(time[2]=60)//分{10time[2]=0;time[1]=time[1]+1;if(time[1]=60)//时{time[1]=0;time[0]=time[0]+1;if((time[1]==00)&&(time[2]==00))FlashLED(8);if(time[0]=24){time[0]=0;}}}if(set!=1){for(i=0;i3;i++)//int-char{disptime[2*i]=time[i]/10;disptime[2*i+1]=time[i]%10;}DispLED(disptime,0);//显示时间************}}}test7279.h#includec8051f020.h#includeintrins.hsbitHD7279_DAT=P1^7;sbitHD7279_CLK=P1^6;#defineNOSELECT7279P5|=0x80//SPICS4(P57)=1#defineSELECT7279P5&=~(0x80)//SPICS4(P57)=0;#defineSet7279DATHD7279_DAT=
本文标题:日历时钟单片机课程设计
链接地址:https://www.777doc.com/doc-7202393 .html