打印

单片机做的时钟怎么实现一位一位调时

[复制链接]
4312|37
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liyang6105|  楼主 | 2010-9-23 20:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机做的时钟,一个功能键,按一下调秒个位,让数码管秒个位闪烁,再按下第二个键,实现调秒个位,从0到9,再按下功能键,数码管秒十位闪烁,再按下第二个键,实现调秒十位,从0到5,同理分钟位和小时位……这个程序怎么实现啊?请那位高手帮我一下,谢谢了!

相关帖子

沙发
xwj| | 2010-9-23 20:45 | 只看该作者
自己先去想!

使用特权

评论回复
板凳
liyang6105|  楼主 | 2010-9-23 20:49 | 只看该作者
高手我想了两个星期了,就是动态显示时,怎样同时让一位闪烁?

使用特权

评论回复
地板
xwj| | 2010-9-23 20:57 | 只看该作者
Flash=闪烁开关n;
if(Flag_Half_Sec && Flash)
    Out=OFF;
else
    Out=Display_Buf[n];

使用特权

评论回复
5
liyang6105|  楼主 | 2010-9-23 21:05 | 只看该作者
高手,谢谢了,我是刚学单片机,看的不是很明白啊!

使用特权

评论回复
6
mcu_lover| | 2010-9-23 21:42 | 只看该作者
看明白基本就入门60%了。加油。

使用特权

评论回复
7
liyang6105|  楼主 | 2010-9-23 21:57 | 只看该作者
谢谢啊 我会加油的

使用特权

评论回复
8
328500920| | 2010-9-23 23:29 | 只看该作者
想想是可以做出来的,
慢慢来,

使用特权

评论回复
9
ocon| | 2010-9-23 23:32 | 只看该作者
在定时中断里隔一段时间(例如200毫秒)把一个位变量取反一次,在显示循环中不断查询这个位变量,根据他的值来点亮和熄灭LED.

使用特权

评论回复
10
liyang6105|  楼主 | 2010-9-23 23:38 | 只看该作者
谢谢啊  不过我真的想了好长时间了 就是想不出来啊 怎么在动态显示的同时让一位闪烁

使用特权

评论回复
11
chunyang| | 2010-9-23 23:41 | 只看该作者
先看懂4楼的代码。

使用特权

评论回复
12
xwj| | 2010-9-23 23:42 | 只看该作者
看懂我4楼的简单代码你就入门了

使用特权

评论回复
13
liyang6105|  楼主 | 2010-9-23 23:44 | 只看该作者
看不懂啊 高手你帮我解释一下 谢谢了

使用特权

评论回复
14
liyang6105|  楼主 | 2010-9-23 23:46 | 只看该作者
高手 帮我解释一下 谢了

使用特权

评论回复
15
原野之狼| | 2010-9-23 23:46 | 只看该作者
1、先实现动态显示,这个会吧。
2、设个定时器,每隔一段时间交替关掉一个位以及打开一个位。
3、通过按键来切换目前操作哪个位

使用特权

评论回复
16
liyang6105|  楼主 | 2010-9-23 23:49 | 只看该作者
Flash=闪烁开关n;
if(Flag_Half_Sec && Flash)
    Out=OFF;
else
    Out=Display_Buf[n];
n是按键次数吗?Flag_Half_Sec什么意思啊?

使用特权

评论回复
17
xwj| | 2010-9-23 23:51 | 只看该作者
唉.......
现在的小朋友啊...

使用特权

评论回复
18
liyang6105|  楼主 | 2010-9-23 23:56 | 只看该作者
高手 就帮我解释一下 谢谢

使用特权

评论回复
19
原野之狼| | 2010-9-24 00:01 | 只看该作者
不要着急 先自己想想 把思路理清楚

使用特权

评论回复
20
liyang6105|  楼主 | 2010-9-24 14:32 | 只看该作者
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code dis_7[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
             0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
uchar data timedata[6]={0x06,0x05,0x07,0x05,0x02,0x01};
uchar data weisao[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar data BUFFER[1]={0};   
uchar s1num=-1;         
char c=0;                  
bit flag=0;                 
char j=128;                  
uchar FlagFlashDN,Tick0FlashDN,FlagDNONOFF,ComSelect,Cursor,
                 Tick0ScanDN;
sbit key1=P3^6;
sbit key2=P3^7;
void keyscan();
void Scan_DN(void);
void display();
void delayms(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)               
                for(j=110;j>0;j--);               
}
void init()
{
        TMOD=0x11;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        TH1=(65536-1000)/256;
        TL1=(65536-1000)%256;

        EA=1;
        ET0=1;
        TR0=1;
        ET1=1;
        TR1=1;

}

void main()
{        init();

        while(1)
                {
                        if(s1num==0)
                                FlagFlashDN=0;
                        else
                                FlagFlashDN=1;       
                         keyscan();
               
                       
               
                       
                               
                }
               
}
void timer0() interrupt 1
{       
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
    BUFFER[0]=BUFFER[0]+1;
    if(BUFFER[0]==20) //1秒时间到加1
  {
     BUFFER[0]=0;//时间到附0
     timedata[0]++;   //秒个位加1
     if(timedata[0]>=10)  //秒个位到10则进秒十位
     {
       timedata[0]=0;timedata[1]++;
       if(timedata[1]>=6)   //秒十位到6则进分个位  
         {
           timedata[1]=0;timedata[2]++;
           if(timedata[2]>=10)    //分个位位到10则进分十位
              {
                timedata[2]=0;timedata[3]++;
                if(timedata[3]>=6)     //分十位到6则进小时个位
                  {
                    timedata[3]=0;timedata[4]++;
                    if(timedata[4]>=10)    //小时个位到10则进小时十位
                      {
                         timedata[4]=0;timedata[5]++;                                    
                      }
                        if(timedata[5]==2)       //当小时为24时下一个变0
                           {
                              if (timedata[4]==4)
                               {
                                   timedata[4]=0;timedata[5]=0;
                                }
                            }
                       }
                   }
                }
             }

        }
}

void keyscan()
{
   
   if(key1==0)
    {
      delayms(10);
      if(key1==0)
      {
            s1num++;
        while(!key1);
       if(s1num==6)
            {
              TR0=1;
              s1num=-1;
            }
      }
    }
   if(s1num==0)
           {
                        
               
             TR0=0;
             if(key2==0)
            {       
                  
              delayms(10);
              if(key2==0)
              {   
                          
                           if(timedata[s1num]<9)     // 秒个位时加到10时返回0
             {

             timedata[s1num]=timedata[s1num]+1;
                  }
                       else
                        {
                        timedata[s1num]=0;
                        }
                        while(!key2);
              }
            }
          }
         if(s1num==1)
           {
          
             if(key2==0)
            {       
                  
              delayms(10);
              if(key2==0)
              {   
                          
                           if(timedata[s1num]<5)     // 秒个位时加到10时返回0
             {

             timedata[s1num]=timedata[s1num]+1;
                  }
                       else
                        {
                        timedata[s1num]=0;
                        }
                        while(!key2);
              }
            }
          }
                         if(s1num==2)
           {
            
             if(key2==0)
            {       
                  
              delayms(10);
              if(key2==0)
              {   
                          
                           if(timedata[s1num]<9)   
             {

             timedata[s1num]=timedata[s1num]+1;
                  }
                       else
                        {
                        timedata[s1num]=0;
                        }
                        while(!key2);
              }
            }
          }
                 if(s1num==3)
           {
          
             if(key2==0)
            {       
                  
              delayms(10);
              if(key2==0)
              {   
                          
                           if(timedata[s1num]<5)     
             {

             timedata[s1num]=timedata[s1num]+1;
                  }
                       else
                        {
                        timedata[s1num]=0;
                        }
                        while(!key2);
              }
            }
          }
   
                    if(s1num==4)
           {
            
             if(key2==0)
            {       
                  
              delayms(10);
              if(key2==0)
              {   
                          
                           if(timedata[s1num]<4)  
             {

             timedata[s1num]=timedata[s1num]+1;
                  }
                       else
                        {
                        timedata[s1num]=0;
                        }
                        while(!key2);
              }
            }
          }
                 if(s1num==5)
           {
             if(key2==0)
            {       
                  
              delayms(10);
              if(key2==0)
              {   
                          
                           if(timedata[s1num]<2)     
             {

             timedata[s1num]=timedata[s1num]+1;
                  }
                       else
                        {
                        timedata[s1num]=0;
                        }
                        while(!key2);
              }
            }
          }
   
}
void timer1() interrupt 3
{

          TH1=(65536-1000)/256;
        TL1=(65536-1000)%256;
        if(s1num==-1)
          FlagFlashDN=0;
        else
          
         FlagFlashDN=1;
        if(FlagFlashDN==1)                                                        
                   {
                           if(++Tick0FlashDN>7)
                         {
                                Tick0FlashDN=0;
                                FlagDNONOFF=~FlagDNONOFF;
                        }
                   }
                   else
                         FlagDNONOFF=0;
                 
    Scan_DN();
}

void Scan_DN(void)
{
     uchar temp;
         if(++Tick0ScanDN>4)
         {
                 Tick0ScanDN=0;
            P2=0x00;
       
                if(++ComSelect>5)
                        ComSelect=0;
                switch(ComSelect)
                {
                        case 0:
                                 temp=dis_7[timedata[0]];
                                 if((s1num==0)&& (FlagDNONOFF==1))
                                 temp=0xff;
                                 break;
                        case 1:
                                 temp=dis_7[timedata[1]];
                                 if((s1num==1)&& (FlagDNONOFF==1))
                                         temp=0xff;
                                 break;
                        case 2:
                                 temp=dis_7[timedata[2]];
                                 if((s1num==2)&& (FlagDNONOFF==1))         
                                         temp=0xff;
                                 break;
                        case 3:
                                 temp=dis_7[timedata[3]];
                                 if((s1num==3)&& (FlagDNONOFF==1))         
                                         temp=0xff;
                                 break;
                        case 4:
                                 temp=dis_7[timedata[4]];
                                 if((s1num==4)&& (FlagDNONOFF==1) )         
                                         temp=0xff;
                                 break;
                        case 5:
                                 temp=dis_7[timedata[5]];
                                 if((s1num==5)&& (FlagDNONOFF==1) )         
                                         temp=0xff;
                                 break;
                }
            P0=temp;
                switch(ComSelect)
                {
                        case 0:
                                 P2=0x01;
                                 break;
                        case 1:
                                 P2=0x02;
                                 break;
                        case 2:
                             P2=0x04;
                                 break;
                        case 3:
                                 P2=0x08;
                                 break;
                        case 4:
                                P2=0x10;
                                break;
                        case 5:
                                 P2=0x20;
                                 break;
                }
         }
}

那个高手帮我指导一下,谢谢!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

37

帖子

1

粉丝