数字钟实验报告_第1页
数字钟实验报告_第2页
数字钟实验报告_第3页
数字钟实验报告_第4页
数字钟实验报告_第5页
已阅读5页,还剩3页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

PAGE1-徐州工业职业技术学院单片机综合实验报告题目:多功能数字时钟指导老师:张江伟班级:电子与电气081学号:830702043姓名:王雯立时间:2009-11-摘要:随着科学技术的发展,人类的计时工具也随之发展,从日晷到水滴,从水滴到沙漏,从沙漏到机械钟,从机械钟再到电子钟……通过前一阶段的学习,我们已经学习了有关数码管显示的知识,为了巩固并提升,本次设计一个数字时钟。显示范围为00:00:00~23:59:59。并可以通过适当的方法显示年、月、日。显示范围为00—00—00~99—12—31。有方便的校时功能。对于8051单片机的I/O口仅有32个,本实验采用若使单片机直接控制数码管,仅能实现4位显示。为了充分利用单片机的I/O口,我们可以使用动态显示8位数码管,通过较高频率的动态扫描使数码管依次点亮,利用人类的视觉暂留效应实现8位显示。也可以使用移位寄存器74HC595的级联来实现串行输入并行输出,即实现数码管的静态显示。从而为单片机节省引脚。为确保时间的准确性,在程序中用定时器控制时间。关键字:数字钟、切换开关、动态显示、数码管闪烁、定时器、静态显示内容:一、用动态显示数码管实现时间显示1、实验电路设计根据设计要求,用Protues绘出如下电路图:如图所示:四个按钮由上至下分别表示K1,K2,K3,K4。2、根据电路功能画出主函数流程图开始开始定义变量、定义数组,编写子函数,设置定时器工作方式标志位置1按键K1按下且标志位为一按钮松开且标志位为0按钮仍处按下标志位置0,闪烁位变量fun加1,且在0~3内循环延时消抖标志位置0,显示类别class取反NNNNYYY按键K1按下且标志位为一按钮仍处按下延时消抖YY标志位置1按钮松开且标志位为0NY按键K3按下且标志位为一按钮仍处按下延时消抖标志位置0,NYYN闪烁位变量fun为1若显示类别class为0则秒变量加1,否则天变量加1闪烁位变量fun为2闪烁位变量fun为3若显示类别class为0则分变量加1,否则月变量加1若显示类别class为0则时变量加1,否则年变量加1标志位置1按钮松开且标志位为0Y语句基本同K3,仅变量减1按键K3按下且标志位为一Y标志位置1按钮松开且标志位为0Y控制信号flash为0且闪烁变量fun不为0若显示类别class为0显示缓存赋时、分、秒值,类别指示口P2_0低电平,否则显示缓存赋年、月、日值,类别指示口P2_0高电平Y若闪烁位变量fun为1若闪烁位变量fun为2若闪烁位变量fun为3左边两位闪烁左边两位闪烁中间两位闪烁NNYYYNYYYYYNNNNNNN开关K1用于切换时分秒显示/年月日显示;开关K2用于切换时间设置(调节时钟)状态;开关K3用于在调节时钟状态下增加时、分、秒/年、月、日数值;开关K4用于在调节时钟状态下减小时、分、秒/年、月、日数值;D1点亮表示时分秒显示输出,D2点亮表示年月日显示输出。单片机P0口用于对7段数码管的显示,P3口用于数码管的动态扫描。三极管用于对P3口输出电流进行放大,以驱动数码管。3、根据流程图在keil中编写并调试代码#include<AT89X51.H>unsignedcharcodea[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};unsignedcharcodex[11]={0xc0,0xf9,0xa4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};unsignedchardatadis[8];unsignedchardatamon[12]={31,28,31,30,31,30,31,31,30,31,30,31};unsignedcharsec=0,disp1,disp2;unsignedchars=0,m=0,h=12,year=10,month=1,day=1,d,fun=0;//闪烁循环变量sbitk1=P1^0;sbitk2=P1^3;sbitk3=P1^6;sbitk4=P1^7;bite1=1,e2=1,e3=1,e4=1,class=1;//显示方式bitflash=0;//闪烁////////////////////////////////////////////////////////////////////////////子程序voiddelay(unsignedintx)/////////延时程序{unsignedchari;while(x--)for(i=0;i<125;i++){;}}///////////////////////////////////unsignedcharleap(unsignedcharyear)//判断是否闰年并返回二月份的天数{//闰年返回29,平年返回28if((year%4!=0)||(year%100==0&&year%400!=0))return28;elsereturn29;}//////////////////////////////////////////////////////////////////////////////主程序main(){TMOD=0x11;//工作方式TH0=(65536-50000)/256;TL0=(65536-50000)%256;TH1=(65536-5000)/256;TL1=(65536-5000)%256;IE=0x8a;//中断允许PT0=1;//定时器0高优先级 TR0=1;TR1=1; TF0=0;TF1=0;while(1){///////////////////////////////////////////////////按钮响应程序if(k1==0&&e1==1)////////////////////显示时间、日期{delay(10);if(k1==0){class=~class;e1=0;}}if(k1==1&&e1==0){e1=1;}if(k2==0&&e2==1)///////////////////校时闪烁{delay(10);if(k2==0){e2=0;fun++;}}if(k2==1&&e2==0){e2=1;}if(fun>3)fun=0;if(k3==0&&e3==1)///////////////////加1{delay(10);if(k3==0){e3=0;if(fun==1){if(class==1)s++;elseday++;} if(fun==2){if(class==1)m++;elsemonth++;} if(fun==3){if(class==1)h++;elseyear++;}}}if(k3==1&&e3==0){e3=1;}if(k4==0&&e4==1)///////////////////减1{delay(10);if(k4==0){e4=0;if(fun==1){if(class==1)s--;elseday--;} if(fun==2){if(class==1)m--;elsemonth--;} if(fun==3){if(class==1)h--;elseyear--;}}}if(k4==1&&e4==0){e4=1;}//////////////////////////////////////////////////显示数组赋值if(class==1)////显示类别选择{dis[0]=s%10;dis[1]=s/10;dis[2]=10;dis[3]=m%10;dis[4]=m/10;dis[5]=10;dis[6]=h%10;dis[7]=h/10;P2_0=0;}///////显示类别指示灯else{dis[0]=day%10;dis[1]=day/10;dis[2]=10;dis[3]=month%10;dis[4]=month/10;dis[5]=10;dis[6]=year%10;dis[7]=year/10;P2_0=1;}if(flash==1&&fun!=0)///////////////////闪烁{if(fun==1){P3_7=0;P3_6=0;}elseif(fun==2){P3_4=0;P3_3=0;}elseif(fun==3){P3_1=0;P3_0=0;}}}}//////////////////////////////////////////////////////////////////////////主程序结束//////////////////////////////////定时器1服务程序(控制时间)voidtimer0(void)interrupt1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;sec++;//定时50ms,计20次为1秒if(sec>20){sec=0;s++;};/////////////////////时分秒计算if(s>59){s=0;m++;}if(m>59){m=0;h++;}if(h>23){h=0;day++;}/////////////////////年月日计算if(year>99){year=0;}if(month>12){month=1;year++;}if(month==2)d=leap(year);elsed=mon[month];if(day>d){day=1;month++;}}//////////////////////////////////定时器2服务程序(控制动态扫描)voidtimer1(void)interrupt3{staticcharxx=0,i=0;TH1=(65536-5000)/256;TL1=(65536-5000)%256;P3=a[i];///////////////////////动态扫描P0=x[dis[i]];i++;xx++;if(xx>60){xx=0;flash=~flash;}if(i>7){i=0;}}二、用移位寄存器74HC595实现静态时间显示1、实验电路设计根据设计要求,用Protues绘出如下电路图2、因实现相同的功能,主程序流程图相同。3、根据流程图在keil中编写并调试代码#include<AT89X51.H>sbitsh595=P2^0;//74HC595引脚控制sbitds595=P2^1;sbitst595=P2^2;sbitclr595=P2^3;sbitoe1=P2^4;sbitoe2=P2^5;sbitoe3=P2^6;sbitk1=P1^0;//按钮定义sbitk2=P1^1;sbitk3=P1^4;sbitk4=P1^7;bite1=1,e2=1,e3=1,e4=1,class=0;//显示类别bitflash=0;//闪烁变量bitshuaxin=1;//显示刷新允许chardis[6],x[10]={0xc0,0xf9,0xa4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90};unsignedchardatamon[12]={31,28,31,30,31,30,31,31,30,31,30,31};unsignedcharsec=0,j,tt;signedchars=0,m=0,h=12,year=9,month=11,day=1,d,fun=0;//闪烁循环变量///////////////////////////////////////////////////////////////////////////////////////////////////////////////子程序voiddisplay(unsignedchartemp)/////////////显示子程序{unsignedchari,t;for(i=0;i<8;i++){t=temp&0x80;if(t==0)ds595=0;elseds595=1;sh595=0;//上升沿sh595=1;temp=temp<<1;}st595=0;//数据输出st595=1;}voiddelay(unsignedintx)//////////////////延时程序{unsignedchari;while(x--)for(i=0;i<125;i++){;}}unsignedcharleap(unsignedcharyear)///////判断是否闰年并返回二月份的天数{//闰年返回29,平年返回28if((year%4!=0)||(year%100==0&&year%400!=0))return28;elsereturn29;}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////主程序main(){TMOD=0x01;//工作方式TH0=(65536-50000)/256;TL0=(65536-50000)%256; ET0=1; EA=1; TR0=1; TF0=0;while(1){oe1=0;oe2=0;oe3=0;//输出使能端置0,使输出if(class==0)////显示类别选择{dis[0]=s%10;dis[1]=s/10;dis[2]=m%10;dis[3]=m/10;dis[4]=h%10;dis[5]=h/10;P2_7=0;}///////显示类别指示灯else{dis[0]=day%10;dis[1]=day/10;dis[2]=month%10;dis[3]=month/10;dis[4]=year%10;dis[5]=year/10;P2_7=1;}///////////////////////////////////////////刷新显示内容if(shuaxin==1){shuaxin=0;for(j=0;j<6;j++){tt=dis[j];display(x[tt]);}}//////////////////////////////////////////////按钮校时if(k1==0&&e1==1)/////显示时间、日期{delay(10);if(k1==0){e1=0;class=~class;}}if(k1==1&&e1==0){e1=1;}if(k2==0&&e2==1)/////校时闪烁{delay(10);if(k2==0){e2=0;fun++;if(fun>3)fun=0;}}if(k2==1&&e2==0){e2=1;}if(k3==0&&e3==1)/////加1{delay(10);if(k3==0){e3=0;if(fun==1){if(class==0)s++;elseday++;} if(fun==2){if(class==0)m++;elsemonth++;} if(fun==3){if(class==0)h++;elseyear++;}}}if(k3==1&&e3==0){e3=1;}if(k4==0&&e4==1)/////减1{delay(10);if(k4==0){e4=0;if(fun==1){if(class==0)s--;elseday--;}elseif(fun==2){if(class==0)m--;elsemonth--;}elseif(fun==3){if(class==0)h--;elseyear--;}}}if(k4==1&&e4==0){e4=1;}if(flash==1&&fun!=0)///////////////////闪烁{if(fun==1){oe3=1;}elseif(fun==2){oe2=1;}elseif(fun==3){oe1=1;}}}}//////////////////////////////////定时器1服务程序(控制时间)voidtimer0(void)interrupt1{staticcharxx;TH0=(65536-50000)/256;TL0=(65536-50000)%256;shuaxin=1;//显示刷新sec++;//定时50ms,计20次为1秒if(sec>20){

温馨提示

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

最新文档

评论

0/150

提交评论