找回密码
 立即注册

QQ登录

只需一步,快速开始

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

arduino+proteus8.6仿真 简易可调时钟

[复制链接]
跳转到指定楼层
楼主
其实我看到论坛中已经有许多相似教程了,但我想既然已经做了,那就分享出来吧。
本程序使用延时函数作为时钟的来源,根本无法保证精度,仅作为演示。
串口传回的数据为实际刷新一次所需要的时间,从仿真结果来看,时钟大约每一秒都差50us以上,就是说每33分钟将慢1秒钟,24小时将慢48秒以上
通过调节延时的话精度应该还可以提高。
有一篇讲产生高精度方波的帖子我觉得可以给大家一些提高时间精度的灵感。
http://www.51hei.com/bbs/dpj-138357-1.html

当然外接时钟源也是可行的方案,或者尝试用中断应该也是不错的方法。
如果还有其他方案也欢迎大家分享。

改成万年历也是可行的,我就不弄了(懒)。

GIF演示:




代码如下:


  1. //2018.10.19 QQ:775913024
  2. //1604/1602显示时间,串口显示的是实际刷新一次所用的时间,单位us
  3. #include <LiquidCrystal.h>
  4. LiquidCrystal lcd(13,12,11,10,9,8 );
  5. int m,h,s;
  6. int bsel=5;   //buttonSelsect
  7. int bss=4;    //buttonStart/Stop
  8. int bup=6;    //buttonUp
  9. int bdown=7;  //buttonDown
  10. int selflag;  //selectflag
  11. int flag=1;   

  12. void setup()
  13. {
  14. pinMode(bsel,INPUT_PULLUP);//选择按钮
  15. pinMode(bss,INPUT_PULLUP);//开始停止按钮
  16. pinMode(bup,INPUT_PULLUP);//加按钮
  17. pinMode(bdown,INPUT_PULLUP);//减按钮
  18. Serial.begin(9600);
  19.   //时间初始化
  20. h=9;//小时
  21. m=59;//分种
  22. s=55;//秒
  23. selflag=0;
  24. flag=1;
  25. lcd.begin(16,4); //使用1602就把4改成2即可
  26. }

  27. void loop() {


  28.      if(digitalRead(bss)==0)//停止开始
  29.    {
  30.     delay(700);
  31.     flag=!flag;
  32.     lcd.setCursor(0,1);
  33.     if(flag==0)
  34.     lcd.print("       stop");
  35.     if(flag==1)
  36.     {lcd.setCursor(0,1);
  37.     lcd.print("runing         ");
  38.      }
  39.     }
  40. else if(flag==1&&digitalRead(5)==1)//正常显示
  41.    {
  42.   uint32_t start = micros();
  43.   delay(995);//一秒刷新一次的时间
  44.   s++;//秒s
  45.   if(s==60)
  46.   s=0;

  47.   if(s==0)//分m
  48.   m=m+1;
  49.   if(m==60)
  50.   m=0;

  51.   if(m==0&&s==0)//小时h
  52.   h=h+1;
  53.   if(h==24)
  54.   h=0;

  55. delayMicroseconds(800);//细调刷新一次的时间
  56. shownowtime();

  57. Serial.println(micros()-start);
  58. }



  59. if((digitalRead(bsel)==0)&&flag==0)//选择事件
  60. {delay(300);
  61. lcd.setCursor(0,1);
  62. selflag++;
  63. if(selflag==3)
  64. selflag=0;
  65. if(selflag==0)//小时
  66. lcd.print("hour");//
  67. if(selflag==1)//分钟
  68. lcd.print("min ");
  69. if(selflag==2)
  70. lcd.print("Sec ");//秒钟

  71. }

  72. if((digitalRead(bup)==0)&&flag==0)//加事件
  73. {delay(300);
  74. if(selflag==0)//小时
  75. {h++;
  76. if(h==24||h<0)
  77. h=0;
  78. shownowtime();
  79. }

  80. if(selflag==1)//分钟
  81. {
  82. m++;
  83. if(m==60||m<0)
  84. m=0;
  85. shownowtime();
  86. }
  87. if(selflag==2)//秒钟
  88. {
  89. s++;
  90. if(s==60||s<0)
  91. s=0;
  92. shownowtime();
  93. }
  94. }

  95. if((digitalRead(bdown)==0)&&flag==0)//减事件
  96. {delay(300);
  97. if(selflag==0)//小时
  98. {h--;
  99. if(h==24||h<0)
  100. h=0;
  101. shownowtime();
  102. }

  103. if(selflag==1)//分钟
  104. {
  105. m--;
  106. if(m==60||m<0)
  107. m=0;
  108. shownowtime();
  109. }
  110. if(selflag==2)//秒钟
  111. {
  112. s--;
  113. if(s==60||s<0)
  114. s=0;
  115. shownowtime();
  116. }
  117. }

  118. }


  119. void shownowtime()
  120. {
  121. lcd.setCursor(0,0);
  122. if(h<10)
  123. lcd.print('0');
  124.   lcd.print(h);
  125.     lcd.print(":");
  126.      if(m<10)
  127. lcd.print('0');
  128.       lcd.print(m);
  129.       lcd.print(":");
  130.        if(s<10)
  131. lcd.print('0');
  132.          lcd.print(s);
  133. }
复制代码

文件在2楼下载

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:284589 发表于 2018-10-19 22:54 | 只看该作者

仿真程序:
showtime.zip (29.57 KB, 下载次数: 54)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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