失忆少年132 发表于 2018-1-16 11:04

利用单片机设计电子时钟,求助程序

利用单片机设计一个有16个按键输入,6位数字输出显示的电子时钟。1.能用6位数码管实时显示时间,格式为XX.XX.XX,初始显示为12.00.00,
即12时0分0秒,计时周期为24小时;
2.按下“设置”键进入时、分、秒预调试状态;
3.按下“时、分、秒”键可进行相应的初始值设置;
4.设置完成后,按“启动”键即可启动时钟;
5.按下“清除”键可清除已输入的初始值,重新进行设置。
具体情况下面图片介绍的有。
急用,有会的单片机大神,帮帮忙,在这里先谢谢了。

失忆少年132 发表于 2018-1-17 09:11

答案:#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
void delayms(uchar);
uint shi=12,fen=0,miao=0,num,key,y,flag2,flag3;
bit flag,flag1;
uchar code tb1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
                  0x7d,0x07,0x7f,0x6f,0x77,0x7c,
                  0x39,0x5e,0x79,0x71};
uchar tb2;
uchar mm;
void keyscan()
{
        uchar temp,temph,templ,k;
        P3=0xf0;
        temp=P3;
        temph=temp&0xf0;
       
        if(temph!=0xf0)
        {       
               delayms(10);          
                temp=P3;
                temph=temp&0xf0;
               
                if(temph!=0xf0)
                {
                        P3=0x0f;
                        temp=P3;
                        templ=temp&0x0f;
                        k=temph^templ;
                        switch(k)
                        {
                        case 0xee:key=0;break;
                        case 0xde:key=1;break;
                        case 0xbe:key=2;break;
                        case 0x7e:key=3;break;
                        case 0xed:key=4;break;
                        case 0xdd:key=5;break;
                        case 0xbd:key=6;break;
                        case 0x7d:key=7;break;
                        case 0xeb:key=8;break;
                        case 0xdb:key=9;break;                                  
                        case 0xbb:key=10;flag3=1;TR1=0;break;                         //设置键
                        case 0x7b:key=11;shi=fen=miao=0;TR1=0;break;                  //清零键
                        case 0xe7:key=12;flag2=3;break;                //设置时
                        case 0xd7:key=13;flag2=2;break;          //设置分
                        case 0xb7:key=14;flag2=1;break;                        //设置秒
                        case 0x77:key=15;TR1=1;flag2=0;mm=0;break;//启动
                        }

                        if(flag2>=1)
                        {
                           mm=key;
                        }
                        while(temph!=0xf0)          
                        {
                                P3=0xf0;
                                temp=P3;
                                temph=temp&0xf0;
                        }
           }
        }
}
void display()   //显示
{
uchar k,t=0x01;
tb2=shi/10;
tb2=shi%10;
tb2=fen/10;
tb2=fen%10;
tb2=miao/10;
tb2=miao%10;       
for(k=0;k<6;k++)
   {
   dula=1;
   if(k==1|k==3)
   P0=tb1]|0x80;
       else P0=tb1];
       dula=0;
       P0=0xff;
       wela=1;
       P0=~t;
       wela=0;
   delayms(10);
   t=t<<1;
   }
}
void shezhi()      //设置
{
   if(flag2==1&&flag3==1)
   {
   miao=mm+mm*10;       
   }

   if(flag2==2&&flag3==1)
   {
          fen=mm+mm*10;       
   }

   if(flag2==3&&flag3==1)
   {
          shi=mm+mm*10;       
   }
}
void delayms(uchar xms)             //延时
{
   uchar i,j;
   for(i=xms;i>0;i--)
   for(j=110;j>0;j--);
}
void main()
{
   TMOD=0x20;//定时器T1工作方式2
   TH1=(256-250);
   TL1=(256-250);//周期为250us
   EA=1;
   ET1=1;
   TR1=0;
while(1)
   {
   display();
       if(flag2>=1)
       shezhi();
       keyscan();
        }        
}
void t1_time() interrupt 3   //定时器中断
{
   num++;
   if(num==4000)//4000*250us=1s
    {
          num=0;
          if(flag==0)//正计时       
          {
          miao++;
          if(miao>=60)
          {
             miao=0;
             fen++;
          }
         if(fen>=60)
             {
              fen=0;
              shi++;
         }
          if(shi>=24)
              {
             shi=0;
             P0=0x00;
              }
           }
                  if(flag==1) //倒计时
                  {
                     miao--;
                       if(miao==0)
                       {
                          if(fen!=0)
                           {
                          fen--;
                          miao=60;
                          miao--;
                           }
                           else
                           if(shi!=0)
                           {
                          shi--;
                          fen=60;
                          fen--;
                          miao=60;
                          miao--;
                           }
                           else
                           if(miao==0&&fen==0&&shi==0)
                           TR1=0;
                       }
                   }
       }
}
在这里也谢谢大家对我的帮助。谢谢大家

mengyu287 发表于 2018-1-16 17:03

首先规划设计比如I/O口的分配,键盘列阵方式,数码管扫描方式。
假设最简单的16位键盘就是4x4 矩阵键盘 用到8个I/O口 如下(记得接10K上拉电阻):

然后写出对应的扫描程序。扫描程序会写吧? 高4位分别置一,然后读取低四位的值,或者反过来也行根据实际硬件编写就行了。 就可以得出当前所按下的按键了。

然后就是数码管了。 数码管6位,纯粹I/O口驱动的话 需要 6+8个I/O即段选8位位选6位(位选需要接三极管驱动,具体哪个三极管方便看你用共阴共阳了。记得加限流电阻)
如果是用单体数码管 用6只的话可以用6个锁存器用静态显示方式。程序设计会方便很多。

然后根据要求编写程序就行了。
主要是要注意键盘扫描以及如果是动态显示的话数码管的扫描,合理分配机器时间。计时采用定时器去做,千万不要用延迟去做哈,main里面扫描和显示即可,定时器计时。
自己动手做吧,这个算是单片机入门的一个小进步,就像易语言你刚开始学会了做hello world后突然学会做个钓鱼软件一个道理。


zhaolisheng 发表于 2018-1-16 11:28

网上有很多类似的代码,自己去百度

狼本善 发表于 2018-1-16 11:37

课程设计?还是毕业设计?

wwwmirage 发表于 2018-1-16 11:52

多用度娘~~~~~~~~~~~~~~~

peecehood 发表于 2018-1-16 11:56

不难的,你可以在设计中学到很多东西。

彼时日暮 发表于 2018-1-16 12:19

你这不会是微机原理的实验作业吧

huste 发表于 2018-1-16 12:46

认真设计一个,进步才大

红小茶 发表于 2018-1-16 13:11

我有电子时钟程序,目前唯一缺一个全部清零的功能,不过可以加上去

落叶@枫林 发表于 2018-1-16 13:20

发错论坛了,应该去电子论坛

Kios 发表于 2018-1-16 13:23

自己写 做自己坚强的后盾!上大学都成年了 不会就去思考,查资料
页: [1] 2
查看完整版本: 利用单片机设计电子时钟,求助程序