1.实现功能:日期、时间显示功能,定时功能
2.所用器件:89C52最小系统,按键,LED灯,八位七段数码管,74ls138,74ls245
3.各部分功能:138:选择数码管的位置,245:驱动数码管显示字符,按键依次是:调整位数,暂停时间,调整个数,切换显示功能(时间,日期,定时)
4.

``

#include<reg52.h>

#define uChar unsigned char

#define uInt unsigned int

uChar
a[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段选表 共阴极

uChar
b[8]={0xff,0xfb,0xf7,0xf3,0xef,0xeb,0xe7,0xe3}; //为选表 共阴极

uChar
second=10,minute=25,hour=12,year=19,month=11,day=21,count,timinghour=12,timingminute=13;

sbit Key1 = P3^1; //计时停止

sbit Key2 = P3^0; //调位

sbit Key3 = P3^2; //加一

sbit Key4 = P3^3; //切换

sbit Buzzer = P3^4; //报警器

/*延迟函数/

void Delay(uInt t)

{

   while(t){t--;}

}

/**时,分,秒显示函数/

void Dispaly1(uChar second,uChar
minute,uChar hour) //秒,分,时

{

/第一位数码管/

P2=b[0]; //选择数码管

P0=a[hour/10]; //显示小时的十位

Delay(200); //延时

/第二位数码管/

P2=b[1];

P0=a[hour%10]; //显示小时的个位

Delay(200);

/第三位数码管/

P2=b[2];

P0=0x40; //显示分隔符

Delay(200);

/第四位数码管/

P2=b[3];

P0=a[minute/10]; //显示分钟的十位

Delay(200);

/第五位数码管/

P2=b[4];

P0=a[minute%10]; //显示分钟的个位

Delay(200);

/第六位数码管/

P2=b[5];

P0=0x40; //显示分隔符

Delay(200);

/第七位数码管/

P2=b[6];

P0=a[second/10]; //显示秒钟的十位

Delay(200);

/第八位数码管/

P2=b[7];

P0=a[second%10]; //显示秒钟的个位

Delay(200);

}

/*年,月,日显示函数/

void Dispaly2(uChar day,uChar month,uChar
year) //日,月,年

{

P2=b[0]; //选择数码管

P0=a[day/10]; //显示日的十位

Delay(200);
//延时

P2=b[1];

P0=a[day%10]; // 显示日的个位

Delay(200);

P2=b[2];

P0=0x40; //显示分隔符

Delay(200);

P2=b[3];

P0=a[month/10]; //显示月的十位

Delay(200);

P2=b[4];

P0=a[month%10]; //显示月的个位

Delay(200);

P2=b[5];

P0=0x40; //显示分隔符

Delay(200);

P2=b[6];

P0=a[year/10]; //显示年的十位

Delay(200);

P2=b[7];

P0=a[year%10]; //显示年的个位

Delay(200);

}

/时钟按键扫描函数/

void Keyscan1()

{

   static

uChar i=0,j=0; //定义两个内部静态变量i和j

   if(Key1==0)//扫描按键k1按下一次i变量加一{Delay(10);//消抖 if(Key1==0)while(!Key1);                                     //等待按键弹开i++;i=i%2;                                                       //让i在0和1之间循环}/*时钟暂停功能*/if(i==1){TR0=0;                                                    //如果是1按键自然关闭定时器0}if(i==0){TR0=1;                                                    //如果是0按键则打开定时器0}/*时钟调位和数值加一功能*/if(Key2==0){Delay(10);if(Key2==0)while(!Key2);j++;j=j%3;                                                       //让j在0,1,2之间循环 }if(j==0)                                                    //调节秒钟{if(Key3==0){Delay(10);if(Key3==0)while(!Key3);second++;if(second==60)second=0;}}if(j==1)                                                    //调节分钟{if(Key3==0){Delay(10);if(Key3==0)while(!Key3);minute++;if(minute==60)minute=0;}}if(j==2)                                                    //调节时钟{if(Key3==0){Delay(10);if(Key3==0)while(!Key3);hour++;if(hour==24)hour=0;}}

}

/日期按键扫描函数/

void Keyscan2()

{

   static

uChar m=0,n=0; //定义两个内部静态变量

   if(Key1==0){Delay(10);if(Key1==0)while(!Key1);m++;m=m%2;                                       //让m在0和1之间循环}if(m==1){TR0=0;                                      /*奇数次按键则关闭定时器0*/}if(m==0){TR0=1;                                      /*偶数次按键则打开定时器0*/ }if(Key2==0){Delay(10);if(Key2==0)while(!Key2);n++;n=n%3;//让n在0,1,2之间循环}/*日期调位和日期加一功能*/if(n==0)                                            //调节日期{if(Key3==0){Delay(10);if(Key3==0)while(!Key3);day++;if(day==30)day=0;}}if(n==1)                                 //调节月份{if(Key3==0){Delay(10);if(Key3==0)while(!Key3);month++;if(month==12)month=0;}}if(n==2)                               //调节年份{if(Key3==0){Delay(10);if(Key3==0)while(!Key3);year++;if(year==99)year=0;}}

}

/定时按键扫描函数/

void Keyscan3()

{

   static

uChar j=0; //定义两个内部静态变量i和j

   /*定时调位和数值加一功能*/if(Key2==0){Delay(10);if(Key2==0)while(!Key2);j++;j=j%2;                                                       //让j在0,1之间循环 }if(j==0)                                                    //调节小时{if(Key3==0){Delay(10);if(Key3==0)while(!Key3);timinghour++;if(timinghour==24)timinghour=0;}}if(j==1)                                                    //调节分钟{if(Key3==0){Delay(10);if(Key3==0)while(!Key3);timingminute++;if(timingminute==60)timingminute=0;}}

}

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

/主函数************/

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

void main()

{

   TMOD=0x01;/*定时器以方式一工作*/TH0=(65536-10000)/256;TL0=(65536-10000)%256;                  /*10ms计时*/EA=1;

//允许打开中断

   ET0=1;                                              /*允许定时器0中断*/TR0=1;                                             /*打开定时器0*/while(1){static

uChar h=0; //定义内部静态变量

          /*时钟和日期切换功能*/ if(Key4==0){Delay(10);if(Key4==0)while(!Key4);h++;h=h%3;}if(h==0)/*如果按键为0则显示时钟*/{Dispaly1(second,minute,hour);Keyscan1();}if(h==1)/*如果按键为1则显示日期*/ {Dispaly2(year,month,day);Keyscan2();}if(h==2)

/如果按键为2则显示闹钟时间/

          {Dispaly1(00,timingminute,timinghour);Keyscan3();}}

}

/中断函数****/

void time0_int(void) interrupt 1

{

   TH0=(65536-10000)/256;TL0=(65536-10000)%256;count++;if(count==100)/*每一秒计时一次*/{count=0;                              //每一秒将count清零一次second++;                                   //秒钟计时if(second==60)                            //满60秒产生分钟计时{second=0;                           //秒钟清零minute++;                           //分钟加一if(minute==60)                     //满60分钟产生小时计时{minute=0;                   //分钟清零hour++;                      //小时加一if(hour==24)          //满24小时产生天数计时{      hour=0;                //小时清零day++;                   //天数加一if(day==30)

//满30天产生月进位

                               {day=0;

//天数清零

                                      month++;        //月数加一if(month==12)      //满12月产生年进位{month=0;      //月数清零year++;         //年数加一if(year==99)  //满99直接清零{year=0;}}}}}}}/*判断整点提醒*/if((hour==timinghour)&&(minute==timingminute))                                                    Buzzer=1;elseBuzzer=0;

}

``

5仿真:

基于51单片机的简单时钟电路相关推荐

  1. c51单片机时钟c语言程序设计,基于51单片机的电子时钟设计..doc

    -- I -- - - I -- 设计题目: 基于 51 单片机的电子时钟设计 摘要 单片机,是集 CPU ,RAM ,ROM ,定时器,计数器和多种接口于一体的微控制器.自 20 世纪 70 年代问 ...

  2. 基于微型计算机系统的实时时钟设计,基于51单片机的实时时钟设计报告.doc

    基于51单片机的实时时钟设计报告 PAGE PAGE 24 课程设计(论文)任务书 信息工程 学 院 信息工程 专 业 (2) 班 一.课程设计(论文)题目 嵌入式课程设计 二.课程设计(论文)工作自 ...

  3. 基于51单片机LCD1602电子时钟实物制作

    之前写了51单片机的LCD1602的程序,现在画了电路图,焊接了电路板,做出了基于51单片机LCD1602电子时钟的实物. 注意事项: 焊接过程中,注意提前布局电路. 对应好端口(避免接线错误),我由 ...

  4. 基于51单片机的数字时钟(万年历)

    具体实现功能 系统由STC89C52单片机+DS1302时钟芯片+按键模块+LCD1602显示+电源构成. 具体功能: 1.可以显示年.月.日.时.分.秒.星期.农历: 2.按键可以设置闹钟及报警: ...

  5. 基于51单片机的电子时钟设计

    基于51单片机的电子时钟设计 0 功能介绍 1.从DS1302中读取时间显示 2.一共4个按键,按键1按下进入修改时间模式,再按下切换修改的时间变量,这个时候第2和3个按键就是修改时间变量的按键,修改 ...

  6. 基于51单片机的自动浇花系统设计/基于51单片机的智能抽奖系统控制设计/基于51单片机的数字时钟与日历显示控制设计 毕业设计

    1147基于51单片机的自动浇花系统设计 设计思路:通湿度传感器实时监测湿度,通过LCD显示出实时的湿度采集值,可以通过按键设定目标界限,当达到这个界限值时,浇花系统的电机装置运行. 电路包含:LCD ...

  7. 基于51单片机、DS1302时钟模块的电子闹钟设计

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.设计原理 1.DS1302介绍 2.闹钟音乐播放原理 二.程序设计 1.DS1302.h 2.ds1302.c 3.mu ...

  8. 基于51单片机的1602LCD时钟、可以设置闹钟(带仿真)

    基于51单片机的1602LCD时钟.可以设置闹钟 最近做了个51单片机的时钟.具有设置时间.闹钟等功能 程序分为3个模块.程序比较简单.由于用于学习交流用没有做掉电运行功能. 供大家学习. isis仿 ...

  9. 基于51单片机远近光灯切换电路设计方案

    STC89C52单片机设计, 自动模式:通过光敏电阻检测光照强度,正常情况下,白天灯不亮,晚上的时候开启远光灯,通过超声波检测距离,如果距离小于30cm,那么远光灯转化为近光灯,超过30cm,近光灯转 ...

最新文章

  1. mysql alter engine_MySQL_mysql下修改engine引擎的方法,修改my.ini,在[mysqld]下加上 - phpStudy...
  2. (筆記) 如何使用Visual C++ 6.0開發Win32 DLL? (C/C++) (VC++)
  3. SQL应用中级指南 Part4:(数据字典)
  4. c语言练习题及答案)(1),c语言练习题(带详解答案)1.pdf
  5. Hystrix降级逻辑中如何获取触发的异常?
  6. Metasploit的三种启动方式
  7. Servlet3.0 || IDEA与tomcat的相关配置
  8. ALV分类合计功能实现
  9. Intellij启动界面导入maven工程,且该maven工程不具备intellij配置文件
  10. VS2010附加进程调试DLL时断点无法断下的解决方法
  11. 关于目录操作walk
  12. Linux终端命令(6)--ifconfig,(find -name ‘*.txt‘ | xargs rm -rf)
  13. python的编程方式模块化_我的Python笔记·模块化编程(一)
  14. smote算法_SMOTE过采样框架+逻辑回归模型案例
  15. TripleDES加解密Java、C#、php通用代码
  16. 谷歌紧急修复已遭在野利用的0day
  17. PHP文件上传实现的注意点
  18. 背包问题九讲 2.0 beta1.1
  19. Teechart 的用法详解:在VC6.0 跟Visual Studio 2005及之后版本的区别
  20. ffmpeg利用crop滤镜进行视频裁剪

热门文章

  1. 跟眼睛开个玩笑:15幅经典的强迫透视摄影作品
  2. 深度学习计划(3)图片质量评估PSNR和SSIM
  3. 数学建模—降维—主成分分析(PCA)
  4. 【Android基础】setTextColor(),setBackgroundColor的参数设置方式
  5. uniapp配置简易网络请求(h5端适配)
  6. 工欲善其事,必先利其器,推荐5款效率神器
  7. Eureka 集群搭建
  8. 研究生入学一个月的感想
  9. ghostblog主题_Ghost-template-dodo
  10. Adobe Acrobat DC pro 打开PDF文件后目录默认折叠,或默认展开