找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机数字钟

[复制链接]
跳转到指定楼层
楼主
1.6位共阴极数码管显示时,分,秒。
2.调时功能,且在调时时具体调整位闪烁显示。仿真图及效果:

程序:
//------头文件------
#include<reg51.h>
//------宏定义-------                 
#define uchar unsigned char
#define uint unsigned int
//------端口定义-----
sbit duan=P2^6;
sbit wei=P2^7;
sbit fm=P2^2;
sbit S2=P3^4;
sbit S3=P3^5;
sbit S4=P3^6;
sbit S5=P3^7;
//------变量定义-----
uchar code table_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//公阴极数码管显示0~9;
uint shi=23,fen=59,miao=55,counter=0;
uchar flag_1s,flag_m,num=0,i=0,m=0;
//------函数声明-----                                       
void csh();                                 
void mode();
void zoushi();
void tiaoshi();
void xianshi();
void baoshi();
void delay(uchar x);
//---------主函数------------
void main()
{
         csh();
         while(1)
         {
                 mode();
                 if(flag_m==1)
                         {
                                TR0=1;
                                zoushi();
                                baoshi();
                        }
                 else
                 {
                                tiaoshi();
                 }
                 xianshi();
            }
}
//-----------初始化函数--------------
void csh()
{        
        EA=1;
        TMOD=0x11;                //选择两个定时器/计数器的方式一
        ET0=1;                        //定时器/计数器0溢出中断允许
        TH0=15536/256;
        TL0=15536&256;

        ET1=1;                        //定时器/计数器1溢出中断允许
        TH1=(65535-50000)/256;
        TL1=(65535-50000)%256;
        TR1=1;                        //启动定时器/计数器1
}
//-----------时钟秒变量---------
void T0_ser() interrupt 1
{
        TH0=15536/256;
        TL0=15536&256;
        counter++;
        if(counter==20)
        {               
                flag_1s=1;
                counter=0;
        }
}
//---------闪烁显示变量---------
void T1_ser() interrupt 3
{
        TH1=15536/256;
           TL1=15536&256;
        m++;
        if(m==20)
        {               
                m=0;
        }
}
//-----------------切换模式函数---------------
void mode()
{
        if(S2==0)
        {
                delay(10);
                if(S2==0)
                {
                        num=num+1;
                        while(!S2)xianshi();
                        switch(num%2)
                        {
                                case 0:flag_m=0;break;
                                case 1:flag_m=1;break;        
                        }
                        if(num==2)
                                num=0;
                }        
        }
}
//---------------走时函数--------------------
void zoushi()
{
        if(flag_1s==1)
        {
                flag_1s=0;
                if(++miao>59)
                {
                         miao=0;
                         if(++fen>59)
                         {
                          fen=0;
                          if(++shi>23)
                          shi=0;
                          }
                }
          }
}
void tiaoshi()                                           //调时函数定义
{
   if(flag_m==0&&S3==0)
   {
      delay(10);
      if(S3==0)                  
      {
              i++;
                  while(!S3)
                  xianshi();               
          }
          if(i==3)
          {
                  i=1;
          }
   }

   if(i==1)
   {
      if(S4==0)
          {
             delay(10);
             if(S4==0)
             {
                shi++;
                if(shi==24)
                shi=0;
                while(!S4)
                        xianshi();
             }
          }
             if(S5==0)
          {
             delay(10);
             if(S5==0)
             {
                shi--;
                if(shi==-1)
                shi=23;
                while(!S5)
                        xianshi();
                 }
          }
        }
        if(i==2)
   {  
      if(S4==0)
          {
             delay(10);
             if(S4==0)
             {
                fen++;
                if(fen==60)
                fen=0;
                while(!S4)
                        xianshi();
             }
          }
             if(S5==0)
          {
             delay(10);
             if(S5==0)
             {
                fen--;
                if(fen==-1)
                fen=59;
                while(!S5)
                        xianshi();
                 }
          }
        }
}   
void xianshi()
{        
                P0=0xdf;   
                wei=1;
                wei=0;
                P0=table_du[miao%10];   
                duan=1;
                duan=0;
                delay(10);
        
                P0=0xef;   
                wei=1;
                wei=0;
                P0=table_du[miao/10];   
                duan=1;
                duan=0;
                delay(10);
               
                P0=0xf7;  
                wei=1;
                wei=0;
                if(flag_m==0&&i==2)        //调时显示判断
                {        
                        if(m<10)                //闪烁显示
                        P0=table_du[fen%10]|0x80;
                        else
                        P0=0x00|0x80;
                }
                else                        
                P0=table_du[fen%10]|0x80;
                duan=1;
                duan=0;
                delay(10);

                P0=0xfb;   
                wei=1;
                wei=0;
                if(flag_m==0&&i==2)
                {        
                        if(m<10)        
                        P0=table_du[fen/10];
                        else
                        P0=0x00;
                }
                else
                P0=table_du[fen/10];
                duan=1;
                duan=0;
                delay(10);
               
                P0=0xfd;   
                wei=1;
                wei=0;
                if(flag_m==0&&i==1)
                {        
                        if(m<10)        
                        P0=table_du[shi%10]|0x80;
                        else
                        P0=0x00|0x80;
                }
                else
                P0=table_du[shi%10]|0x80;
                duan=1;
                duan=0;
                delay(10);
               
                P0=0xfe;  
                wei=1;
                wei=0;
                if(flag_m==0&&i==1)
                {               
                        if(m<10)
                        P0=table_du[shi/10];
                        else
                        P0=0x00;                        
                }
                else
                P0=table_du[shi/10];
                duan=1;
                duan=0;
                delay(10);        
}
//-----------------整点提醒函数-------------
void baoshi()   
{
         if (fen==0&&miao==0)
                                fm=0;
                         if(miao==5)
                                fm=1;
}
//-----------------延时函数---------------
void delay(uchar x)  
{
        uchar a,b;
        for(a=x;a>0;a--)
                for(b=200;b>0;b--);
}







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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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