吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4882|回复: 17
收起左侧

[其他转载] 利用单片机设计电子时钟,求助程序

[复制链接]
失忆少年132 发表于 2018-1-16 11:04
利用单片机设计一个有16个按键输入,6位数字输出显示的电子时钟。1.能用6位数码管实时显示时间,格式为XX.XX.XX,初始显示为12.00.00,
即12时0分0秒,计时周期为24小时;
2.按下“设置”键进入时、分、秒预调试状态;
3.按下“时、分、秒”键可进行相应的初始值设置;
4.设置完成后,按“启动”键即可启动时钟;
5.按下“清除”键可清除已输入的初始值,重新进行设置。
具体情况下面图片介绍的有。

急用,有会的单片机大神,帮帮忙,在这里先谢谢了。

第二章

第二章

第二张

第二张

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
snccwt + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 失忆少年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[6];
uchar mm[20];
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[20]=0;break;//启动
                        }

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

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

   if(flag2==3&&flag3==1)
   {
            shi=mm[y]+mm[y-1]*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上拉电阻):
timg.jpg
然后写出对应的扫描程序。扫描程序会写吧? 高4位分别置一,然后读取低四位的值,或者反过来也行根据实际硬件编写就行了。 就可以得出当前所按下的按键了。

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

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


免费评分

参与人数 1热心值 +1 收起 理由
死宅松柏叶 + 1 我很赞同!

查看全部评分

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
自己写 做自己坚强的后盾!上大学都成年了 不会就去思考,查资料
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 10:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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