找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机电子钟程序如何修改为静态显示?6位 时分秒 74hc595 6个74HC595 D1302

[复制链接]
跳转到指定楼层
楼主


电子钟程序 6位 时分秒 74hc595 6个74HC595 D1302 电子数码钟
具体见2楼
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:475031 发表于 2020-3-20 13:02 | 只看该作者
或者怎么把下面代码改动增加实时时钟模块+DS1302模块


简单的来说,我需要静态数码钟,。不需要那种动态扫描的数码钟


  1. #include <reg51.h>                       //包含访问sfr库函数reg51.h
  2. sbit  K0=P1^2;                         //定义K0为P1.2(时钟修正标志键)
  3. sbit  K1=P1^1;                         //定义K1为P1.1(修正移位键)
  4. sbit  K2=P1^0;                         //定义K2为P1.0(修正加1键)
  5. sbit  OEs=P1^3;                        //定义OEs为P1.3(秒输出控制端,0有效)
  6. sbit  OEm=P1^4;                        //定义OEm为P1.4(分输出控制端,0有效)
  7. sbit  OEh=P1^5;                        //定义OEh为P1.5(时输出控制端,0有效)
  8. sbit  RCK=P1^6;                        //定义RCK为P1.6(输出锁存控制端,上升沿有效)
  9. sbit  LED=P1^7;                        //定义LED为P1.7(秒闪烁控制端,0有效)
  10. unsigned int  ms05=0;                    //定义0.5ms计数器ms05,并清0
  11. unsigned char  h=0, m=0, s=0;             //定义时分秒计数器h、m、s,并清0
  12. unsigned char  n=0;                      //定义修正位序号n
  13. unsigned char  code  c[10]={             //定义共阳逆序字段码数组,并赋值
  14. 0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};
  15. void  disp6 ( ){                         //6位显示子函数
  16. unsigned char  i;                      //定义序号变量i
  17. unsigned char  a[6];                   //定义时分秒数组a[6]
  18. a[5]=c[h/10]; a[4]=c[h%10];             //取出时显示字段码
  19. a[3]=c[m/10]; a[2]=c[m%10];            //取出分显示字段码
  20. a[1]=c[s/10]; a[0]=c[s%10];              //取出秒显示字段码
  21. for (i=0; i<6; i++){                     //6位显示字段码依次串行输出
  22. SBUF=a[i];                         //串行发送一帧数据
  23. while (TI==0); TI=0;}                 //等待一帧数据串行发送完毕,完毕后TI清0
  24. RCK=0; RCK=1;}                     //595 RCK端输入触发正脉冲
  25. void  key ( ){                           //时钟修正键处理子函数
  26. TR1=1;                              //时钟修正键按下,T1运行(用于修正位闪烁)
  27. if (K1==0){                          //若移位键按下,则
  28. while (K1==0);                      //等待移位键释放
  29. n++;                              //移位键释放后,修正位序号加1
  30. if (n==3)  n=0;}                    //若序号超限,复0
  31. if (K2==0){                           //若加1键按下,则
  32. while (K2==0);                      //等待加1键释放
  33. switch (n){                         //switch散转,根据修正位序号修正时分秒
  34. case 0: {h++;                      //时计数器加1
  35. if (h==24)  h=0; break;}          //若时计数器超限,复0,跳出加1循环
  36. case 1: {m++;                     //分计数器加1
  37. if (m==60)  m=0; break;}         //若分计数器超限,复0,跳出加1循环
  38. case 2: {s++;                      //秒计数器加1
  39. if (s==60)  s=0; break;}}         //若秒计数器超限,复0,跳出加1循环
  40. disp6 ();}}                         //刷新显示
  41. void  main ( ){                          //主函数  
  42. TMOD=0x12;                         //置T0定时器方式2,T1定时器方式1(定时131ms)
  43. SCON=0;                            //置串口方式0
  44. TH0=TL0=0x06;                      //置T0定时0.5ms初值(fosc=6MHz)
  45. IP=0x02;                             //置T0高优先级
  46. TR0=1;                              //T0运行
  47. IE=0x8a;                             //T0、T1开中,串行禁中
  48. P1=0xc7;                             //秒闪烁暗
  49. disp6 ();                              //595允许输出,初始显示0
  50. while (1) {                           //无限循环
  51. while (K0==1);                      //等待时钟修正键按下
  52. if (K0==0)  key ();}}                //修正键按下,调用时钟修正键处理子函数


  53. void  t0( )  interrupt 1{                  //T0中断函数(0.5ms中断)
  54. ms05++;                             //0.5ms计数器加1
  55. if (K0==1) {TR1=0;                    //若时钟修正键已释放,T1停运行
  56. OEh=0; OEm=0; OEs=0;}             //时分秒显示停闪烁
  57. if (ms05==1000)  LED=!LED;           //0.5s到,秒闪烁亮
  58. if (ms05==2000)  {LED=!LED;          //1s到,秒闪烁暗
  59. ms05=0;                           //0.5ms计数器清0
  60. if (++s==60) {s=0;                   //秒计数器加1,满60s,秒计数器清0
  61. if (++m==60) {m=0;                //分计数器加1,满60m,分计数器清0
  62. if (++h==24)  h=0;}}            //时计数器加1,满24h,时计数器清0
  63. disp6 ();}}                          //满1s,刷新显示


  64. void  t1( )  interrupt 3{                  //T1中断函数(修正位闪烁中断)
  65. switch (n) {                           //switch散转,根据修正位序号闪烁
  66. case 0: {OEh=!OEh; OEm=0; OEs=0; break;}           //时显示闪烁
  67. case 1: {OEm=!OEm; OEh=0; OEs=0; break;}           //分显示闪烁
  68. case 2: {OEs=!OEs; OEh=0; OEm=0; break;}}}          //秒显示闪烁
复制代码


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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