找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2582|回复: 0
打印 上一主题 下一主题
收起左侧

电子数字时钟课程设计报告 论文下载 有跑表功能

[复制链接]
跳转到指定楼层
楼主
工程设计结题报告


数字时钟课程设计报告


    : 6

作    者:

指导老师:

日期:2017年7月29日



功能要求
制作一个电子时钟,该时钟能够正确显示分秒,且分秒都能显示两位数。同时具有跑表功能。
二 方案论证
按系统功能要求,决定控制系统采用AT89C52单片机。系统除能确保实现要求的功能外,还可以方便地进行其它的扩展。电子时钟系统设计方案框图如下所示


三 系统硬件电力的设计
单片机的P1口,P3.0-P3.3端口作为4为LED数码管显示控制。P3.5端口按狃可用作时钟显示和调节转换/秒表显示转换,P3.6端口按钮可用作:时间调节/秒表工作转换。
四 系统程序的设计
2.4.1 主函数
  系统上电后,程序先将P2口置0,然后调用显示子函数和A/D转换测量子函数并进入循环。系统默认为循环显示8个通道的电压值,每个通道的数据显示时间在1S左右,电压测量的周期为8ms。主函数执行的流程图如图2.3所示。
2.4.2显示子函数
显示功能采用动态扫描发实现4位数码管的数值显示。测量所得的A/D转换数据放在8个定义的ad_data[8]内存单元中,测量所得的A/D数据在显示时需要经过转换变成十进制BCD码。列扫描采用扫字代码,每位LED显示器显示时间为1ms,每路电压数据显示时间约为1s。




                           图2.2 数字电表电路原理图


                        
调试及性能分析
2.5.1 调试与测试
     采用Kei C51 ver 7.09版的C编译器进行C程序编译及调试,同时进行硬件电路板的设计制作,烧好程序后进行软件联调
1 程序调试
  程序编写好烧入芯片,装在电路板上基本能记时。但是由于数码管(共阳)的亮度不够硬件又加上了三极管,结果显示就乱了。将程序扫描数组的数据取反后,芯片就能够正常工作,时钟的调试和显示都正常了。可是当用秒表的时候又发现了新的问题,当手动停止秒表跑动的时候数码管的显示就不清楚,数码管里一些不应该亮的发光二极管也出现不同程度的发光,使得显示的数据不正常。为了解决这个问题就修改了跑表的子函数,在这个子函数的末加上了延时(delay1ms(1))以及赋值(P3=0xff)。最后数码管显示都正常了。
通过这次实验,我们对单片机以原理的了解以及利用C语言来编程序都有了很大的进步。单片机的原理和程序的编辑,是设计的关键部分,我们应该尽最大的努力去学好他们,这对我们以后的学习也是非常有用的。                                             
2硬件调试
    在这次实验中,由于我们用的上次是实验板,所以在硬件上并没有做过多的改动。但我们上次实验中有些部分的原理不是很理解,所以做的作品不是很理想。其中数码管不是很亮是最大的问题,所以我们在这次的实验中做了改进:我们加入了9015的三极管。结果数码管的显示果然好了很多,基本达到所需要求。

源程序:
#include<AT89X52.h>
unsigned char codetable[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
unsigned char codepower[4]={0xfe,0xfd,0xfb,0xf7};
unsigned char time[4]={1,0,0,0};//时间数组
unsigned char dingshi[4]={0,0,0,0};//定时数组
unsigned char paomiao[4]={0,0,0,0};//跑秒数组
unsigned char temp[4];//跑秒临时数组
unsigned char count=0;//计数变量
unsigned char k,n,t;
//延时函数
delay1ms(unsigned char t)
{
       unsignedchar i,j;
       for(i=0;i<t;i++)
              for(j=0;j<120;j++);
}
//定时用的设定分钟函数
void alarm1()
{     while(1)
       {     for(k=2;k<4;k++)//扫描显示
                     {     P1=table[dingshi[k]];
                            P3=power[k];
                            delay1ms(1);
                     }
              if(P3_6==0) dingshi[2]++;
              while(P3_6==0)  ;
              if(dingshi[2]==10){dingshi[3]++;dingshi[2]=0;}
              if(dingshi[3]==6){dingshi[2]=0;dingshi[3]=0;}
              if(P3_5==0) break;//响应按键
       }
}
//定时用的设定秒钟函数
void alarm2()
{     while(1)
       {     for(k=0;k<2;k++)
                     {     P1=table[dingshi[k]];
                            P3=power[k];
                            delay1ms(1);
                     }
              if(P3_6==0) dingshi[0]++;
              while(P3_6==0);
              if(dingshi[0]==10){dingshi[1]++;dingshi[0]=0;}
              if(dingshi[1]==6){dingshi[0]=0;dingshi[1]=0;}
              if(P3_5==0) break;
       }
}
//设定分钟函数
void minute()
{     for(;;)
       {     for(k=2;k<4;k++)
                     {     P1=table[time[k]];
                            P3=power[k];
                            delay1ms(1);
                     }
              if(P3_6==0) time[2]++;
              while(P3_6==0)    ;
              if(time[2]==10) {time[3]++;time[2]=0;}
              if(time[3]==6) {time[2]=0;time[3]=0;}
              if(P3_5==0) break;
       }
}
//设定秒钟函数
void second()
{     for(;;)
       {     for(k=0;k<2;k++)
                     {     P1=table[time[k]];
                            P3=power[k];
                            delay1ms(1);
                     }
              if(P3_6==0) time[0]++;
              while(P3_6==0);   
              if(time[0]==10) {time[1]++;time[0]=0;}
              if(time[1]==6) time[1]=0;
              if(P3_5==0) break;
       }
}
//
void timer() interrupt 1//定时器中断程序
{     paomiao[0]++;count++;
       if(paomiao[0]==10){paomiao[1]++;paomiao[0]=0;}
       if(paomiao[1]==10){paomiao[2]++;paomiao[1]=0;}
       if(paomiao[2]==10){paomiao[3]++;paomiao[2]=0;}
       if(paomiao[3]==6)
       for(k=0;k<4;k++)
                     paomiao[k]=0;
       if(count==100)
              {     time[0]++;count=0;
                     if(time[0]==10){time[1]++;time[0]=0;}
                     if(time[1]==6){time[2]++;time[1]=0;}
                     if(time[2]==10){time[3]++;time[2]=0;}
                     if(time[3]==6){time[0]=0;time[1]=0;time[2]=0;time[3]=0;}
              }
       TH0=0xd8;TL0=0xf0;
       TF0=0;
}
//计数器中断程序
void counter() interrupt 3
{     while(P3_5==0);
       alarm1();while(P3_5==0);
       alarm2();while(P3_5==0);
       minute();while(P3_5==0);
       second();while(P3_5==0);
       TH1=0XFF;TL1=0XFF;
       TF1=0;
}            
//
void main()
{     
       TMOD=0x51;
       TH1=0xff;
       TL1=0xff;
       TH0=0xd8;
       TL0=0xf0;
       EA=1;
       ET0=1;
       ET1=1;
       TR0=1;
       TR1=1;
       while(1)
       {     if(P3_6==0)//跑秒程序
              {            while(P3_6==0);
                            for(k=0;k<4;k++)
                                   paomiao[k]=0;
                            for(;P3_6!=0;)
                            {     for(k=0;k<4;k++)
                                   {     P1=table[paomiao[k]];
                                          if(k==2) P1_7=1;
                                          P3=power[k];delay1ms(3);
                                   }
                            }
                            while(P3_6==0);
                            for(k=0;k<4;k++)
                                          temp[k]=paomiao[k];
                            for(;P3_6!=0;)
                                          {     for(k=0;k<4;k++)
                                                        {     P1=table[temp[k]];
                                                               if(k==2)P1_7=1;
                                                               P3=power[k];delay1ms(5);
                                                        }
                                          }                                               
                            while(P3_6==0);
              }     
              for(k=0;k<4;k++)//平常显示
              {     P1=table[time[k]];
                     if(k==2&&time[0]%2==0)P1_7=1;
                     P3=power[k];
                     delay1ms(1);
              }
              if(time[0]==dingshi[0]&&time[1]==dingshi[1]&&time[2]==dingshi[2]&&time[3]==dingshi[3])//定时程序
                     for(;;)
                     {     for(n=0;n<250;n++)//时间到时闪烁
                                   for(k=0;k<4;k++)
                                   {     P1=0xff;
                                          P3=power[k];
                                          delay1ms(1);
                                   }
                            for(n=0;n<250;n++)
                                   {P3|=0x0f;delay1ms(1);}
                            if(P3_6==0) {while(P3_6==0);break;}
                     }
       }
}
      
      
        
元件清单:AT89C52,四联数码管,按钮开关(3个),晶振(12MHZ),电容,电阻,电路板

以上是部分内容,完整版本的请下载附件
word格式的完整设计论文下载: 数字时钟设计实验报告.doc.rar (23.05 KB, 下载次数: 21)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表