电子技术论坛

 找回密码
 快速注册

QQ登录

只需一步,快速开始

搜索
下载方法|用单线程|避免多扣帖子规范|求助必读|发帖建议积分策略|勋章介绍|新人必读获取金币|推广论坛|出售帖子基本礼节|致会员信|版规总则
禁涉政治|反对低俗|举报专帖征集相片|留下足迹|推荐精华上传附件|制作分卷|使用网盘禁发qq群|恶意灌水|纯表情帖加入团队|监督机制|安全上网
查看: 5013|回复: 8

二进制时钟设计

[复制链接]
发表于 2011-5-23 18:07:43 | 显示全部楼层 |阅读模式

注册家电维修技术论坛,与同行畅聊维修技术,享更多技术论坛功能。

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
二进制时钟
#include<reg52.h>
sbit  key1= P3^1;          //秒、分、时间的切换键
sbit  key2 =P3^2        ;  //加1
sbit  key3 =P3^3        ;  //减1
sbit  speaker=P3^7;
unsigned char count1=0 ;
/****************************************************/

unsigned char hour = 11, min = 0,sec = 0;         //时钟赋初值

/******************T0__50mS中断程序*******************/

void  T0_1s(void) interrupt 1                  // 50mS中断程序
{
    static unsigned char count = 0;
    TR0 = 0;
    TH0 = (65536 - 50000 ) / 256;         //设置T0初始值为:15536
        TL0 = (65536 - 50000 ) % 256;         //记数为50000次//50000*1us=50ms*20=1s
    TR0 = 1;
        count++;
       
        if(count == 20)                   //中断服务程序
                {                                        //定时1s时间到(需要中断20次)
                          count = 0;
                        sec++;
                          if(sec==60)          //1分钟时间到
                              {
                            sec=0;
                                   min++;
                                   if(min==60)                 //1小时时间到
                                   {
                                     min=0;
                                    hour++;   
                                    if(hour==12)        //24小时时间到
                                      {
                                       sec =0;
                                        min =0;
                                        hour=0;
                                     }
                                   }
                            }
                }
}

/*************************************************************

void delay_5ms()   //动态扫描显示--软件延时
{
        unsigned char i,j;
        for(i=0;i<20;i++)
                for(j=0;j<50;j++)             //50
                ;

}

***************************************************************/
void disp_led()
{
/****************显示时钟 ******************************/
                           P1=~(((hour/10<<4)|(hour%10)));   //显示时钟                              
               
                 

                           P2=~(((min/10<<4)|(min%10)));                  //显示分钟
               
                                                                          
         

                           P0=~(((sec/10<<4)|(sec%10)));                   //显示秒   
}               
/*******************闹钟程序****************************/
void clock()
{        unsigned int i;
        if(hour==8 && min==0 && sec==0)          
        {        speaker=0;
                for(i=0;i<500;i++)                        //15秒蜂鸣器
                        {
                                disp_led();
                        }
                speaker=1;
        }
}
/*********************蜂鸣器按键声*****************************/
void speak()
{        unsigned char m;
        speaker=0;
        for(m=0;m<3;m++)               
                {
                        disp_led();
                }
        speaker=1;
}
/********************按键扫描程序***************************/
void delay_10ms()                   //键盘去抖动--软件延时                       
{
        unsigned char i,j;
        for(i=0;i<20;i++)
                for(j=0;j<40;j++)  
                ;
}  
/*******************调时钟按键扫描*******************************/
void key_scan()                                           //键盘扫描子程序
{
if(key1==0)                                //检测是否有键按下
        {           
                 delay_10ms();               //去抖动延时
                 if(key1==0)                //再次确认否有键按下
                 {        {        speak();
                                 count1++;                //切换次数
                                TR0=0;                        //关计时
                                ET0=0;
                        }
                        if(count1==4)
                        {        count1=0;                 //到4次后重新记
                                TR0=1;                         //开计时
                                ET0=1;
                        }
                 }       
                while(key1==0) disp_led(); //等待按键释放,并且调用显示程序                               
        }  
        if(count1==1)
        {        if(key2==0)                //调整秒钟加//检测是否有键按下
                  {  
                                  delay_10ms();        //去抖动延时
                                   if(key2==0)                     //再次确认否有键按下
                                {        speak();                  //按键声
                                        sec++;
                                        if(sec==60)        sec=0;
                                }
                                while(key2==0) disp_led();  //等待按键释放,并且调用显示程序                               
                   }
                   if(key3==0)                        //调整秒钟减//检测是否有键按下
                  {            
                                   delay_10ms();               //去抖动延时
                                    if(key3==0)                    //再次确认否有键按下
                                 {        speak();
                                         sec--;
                                        if(sec==-1) sec=59;
                                       
                                 }       
                                 while(key3==0) disp_led(); //等待按键释放,并且调用显示程序
                   }
        }
        if(count1==2)
        {
                if(key2==0)                         //调整分钟加//检测是否有键按下
                  {           
                                  delay_10ms();            //去抖动延时
                                   if(key2==0)                        //再次确认否有键按下
                                {        speak();
                                        min++;
                                        if(min==60)         min=0;
                                       
                                }       
                                while(key2==0) disp_led();  //等待按键释放,并且调用显示程序                               
                   }
                   if(key3==0)                         //调整分钟减//检测是否有键按下
                  {           
                                  delay_10ms();            //去抖动延时
                                   if(key3==0)                        //再次确认否有键按下
                                {        speak();
                                        min--;
                                        if(min==-1)        min=59;
                                       
                                }       
                                while(key3==0) disp_led();  //等待按键释放,并且调用显示程序                               
                  }
               
        }
        if(count1==3)
        {         if(key2==0)                         //调整小时加//检测是否有键按下
                  {            
                                  delay_10ms();            //去抖动延时
                                   if(key2==0)                        //再次确认否有键按下
                                {        speak();
                                        hour++;
                                        if(hour==12)
                                                {        hour=0;
                                                        min=0;
                                                        sec=0;
                                                }
                                }       
                                while(key2==0) disp_led();  //等待按键释放,并且调用显示程序                               
                   }
                   if(key3==0)                         //调整小时减//检测是否有键按下
                   {           
                                  delay_10ms();           //去抖动延时
                                   if(key3==0)                        //再次确认否有键按下
                                {        speak();
                                        hour--;
                                        if(hour==-1)        hour=11;
                               
                                }       
                                while(key3==0) disp_led();  //等待按键释放,并且调用显示程序                               
                    }
        }
}
/*********************主函数***********************/
void main()
{
        TMOD = 0x01;
    TH0 = (65536 - 50000 ) / 256;         //设置T0初始值
        TL0 = (65536 - 50000 ) % 256;

        ET0 = 1;           //开中断
        EA  = 1;            //开CPU
        TR0 = 1;           //开定时

        while(1)
        {
                disp_led();                 //时钟显示
                key_scan();                 //时钟扫描
                clock();             //闹钟
        }
}
/***********************************************************/
二进制钟.jpg
发表于 2011-5-23 18:56:18 | 显示全部楼层
看不懂。。。。。。
发表于 2011-5-23 22:04:21 | 显示全部楼层
天书???????
发表于 2011-5-27 21:56:22 | 显示全部楼层
有什么用,不如LED数码管。
发表于 2011-5-31 00:16:49 | 显示全部楼层
还是数码管的好,都看不懂
发表于 2011-6-15 14:46:51 | 显示全部楼层
模拟时钟,不精准!!!!
发表于 2018-8-17 13:36:58 | 显示全部楼层
能不能下载?
发表于 2018-10-2 19:24:15 | 显示全部楼层
学习学习
发表于 2018-10-17 16:12:25 | 显示全部楼层
我在看天书
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|家电维修技术论坛 ( 鄂ICP备09003585号-2 )

GMT+8, 2024-5-15 05:31 , Processed in 0.080113 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

CopyRight © 电子技术论坛
电子邮箱:8794149@qq.com | 联系 QQ:3081868839 | 官方网址:www.dzdu.com

Qiji. All Rights Reserved


服务条款 | 站长声明

Wuhan Qiji Technology Co., Ltd.武汉奇迹科技有限公司版权所有


鄂ICP备09003585号-2鄂公网安备42010602000420号

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