找回密码
 立即注册

QQ登录

只需一步,快速开始

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

能不能不用DS1302做一个1602的液晶显示的时钟电路

  [复制链接]
跳转到指定楼层
楼主
最近看了很多时钟电路,大部分都采用了DS1302时钟芯片,想要一个不采用DS1302时钟芯片做的基于AT89C52的用LCD1602显示的时钟电路的仿真和程序呀,想研究一下~
谢谢~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:47286 发表于 2017-6-9 14:29 | 只看该作者
当然可以啊 但会比较麻烦啊 你用计数器做一个1s中断 每60个1s就是1分钟 以此类推 再存进去当前日期 满小时就加一天 然后再算月 够30或31加月 再算平润年 只要数值算出来 显示根本不是事啊

这么干纯学习还行 真干点什么太累了 还不如几块钱买个1302得了 呵呵
回复

使用道具 举报

板凳
ID:86421 发表于 2017-6-9 15:43 | 只看该作者
  1. /*-----------------------------------------------
  2.   名称:定时器时钟数码管显示
  3.   内容:定时器时钟数码管显示,时间和日期切换显示 按下按键,调节时间
  4.         时间格式xx-xx-xx 时分秒
  5.         
  6. ------------------------------------------------*/
  7. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

  8. #define KeyPort P3 //定义按键端口

  9. #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换

  10. sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
  11. sbit LATCH2=P2^3;//                 位锁存

  12. unsigned char hour,minute,second;//定义时分秒

  13. bit UpdateTimeFlag;//定义读时间标志

  14. unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
  15. unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
  16. unsigned char TempData[8]; //存储显示值的全局变量

  17. void DelayUs2x(unsigned char t);//us级延时函数声明
  18. void DelayMs(unsigned char t); //ms级延时
  19. void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数
  20. unsigned char KeyScan(void);//键盘扫描
  21. void Init_Timer0(void);//定时器初始化
  22. /*------------------------------------------------
  23.                     主函数
  24. ------------------------------------------------*/
  25. void main (void)
  26. {
  27. unsigned char num;                  

  28. Init_Timer0();

  29. while (1)         //主循环
  30.   {


  31. num=KeyScan();
  32. switch(num)
  33.   {
  34.                case 1:hour++;if(hour==24)hour=0;     //正常时间 小时 加1
  35.              break;
  36.                 case 2:hour--;if(hour==255)hour=23;   //正常时间 小时减1
  37.                  break;
  38.                 case 3:minute++;if(minute==60)minute=0;     //分钟加1
  39.                  break;
  40.                 case 4:minute--;if(minute==255)minute=59;   //分钟减1
  41.                  break;
  42.                 default:break;
  43.   }
  44. if(UpdateTimeFlag==1)
  45. {
  46.   UpdateTimeFlag=0;

  47. TempData[0]=dofly_DuanMa[hour/10]; //时                        //数据的转换,因我们采用数码管0~9的显示,将数据分开
  48. TempData[1]=dofly_DuanMa[hour%10];
  49. TempData[2]=0x40;                                                            //加入"-"
  50. TempData[3]=dofly_DuanMa[minute/10];//分
  51. TempData[4]=dofly_DuanMa[minute%10];
  52. TempData[5]=0x40;
  53. TempData[6]=dofly_DuanMa[second/10];//秒
  54. TempData[7]=dofly_DuanMa[second%10];       

  55.   }       
  56. }
  57. }
  58. /*------------------------------------------------
  59. uS延时函数,含有输入参数 unsigned char t,无返回值
  60. unsigned char 是定义无符号字符变量,其值的范围是
  61. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  62. 长度如下 T=tx2+5 uS
  63. ------------------------------------------------*/
  64. void DelayUs2x(unsigned char t)
  65. {   
  66. while(--t);
  67. }
  68. /*------------------------------------------------
  69. mS延时函数,含有输入参数 unsigned char t,无返回值
  70. unsigned char 是定义无符号字符变量,其值的范围是
  71. 0~255 这里使用晶振12M,精确延时请使用汇编
  72. ------------------------------------------------*/
  73. void DelayMs(unsigned char t)
  74. {
  75.      
  76. while(t--)
  77. {
  78.      //大致延时1mS
  79.      DelayUs2x(245);
  80.          DelayUs2x(245);
  81. }
  82. }
  83. /*------------------------------------------------
  84. 显示函数,用于动态扫描数码管
  85. 输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
  86. 如输入0表示从第一个显示。
  87. Num表示需要显示的位数,如需要显示99两位数值则该值输入2
  88. ------------------------------------------------*/
  89. void Display(unsigned char FirstBit,unsigned char Num)
  90. {
  91.       static unsigned char i=0;
  92.           

  93.            DataPort=0;   //清空数据,防止有交替重影
  94.        LATCH1=1;     //段锁存
  95.        LATCH1=0;

  96.        DataPort=dofly_WeiMa[i+FirstBit]; //取位码
  97.        LATCH2=1;     //位锁存
  98.        LATCH2=0;

  99.        DataPort=TempData[i]; //取显示数据,段码
  100.        LATCH1=1;     //段锁存
  101.        LATCH1=0;
  102.       
  103.            i++;
  104.        if(i==Num)
  105.               i=0;


  106. }
  107. /*------------------------------------------------
  108.                     定时器初始化子程序
  109. ------------------------------------------------*/
  110. void Init_Timer0(void)
  111. {
  112. TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
  113. //TH0=0x00;              //给定初值
  114. //TL0=0x00;
  115. EA=1;            //总中断打开
  116. ET0=1;           //定时器中断打开
  117. TR0=1;           //定时器开关打开
  118. }
  119. /*------------------------------------------------
  120.                  定时器中断子程序
  121. ------------------------------------------------*/
  122. void Timer0_isr(void) interrupt 1
  123. {
  124. static unsigned int num,i;
  125. TH0=(65536-2000)/256;//重新赋值 2ms
  126. TL0=(65536-2000)%256;

  127. Display(0,8);       // 调用数码管扫描
  128. i++;
  129. if(i==10)          //20ms更新一次
  130.     {
  131.         i=0;
  132.         UpdateTimeFlag=1; //更新时间志位置1
  133.         }
  134. num++;
  135. if(num==500)        //大致1s
  136.    {
  137.     num=0;
  138.         second++;
  139.         if(second==60)  //秒到60,分钟加1
  140.          {
  141.           second=0;          
  142.           minute++;
  143.           if(minute==60)//分钟到60,小时加1
  144.             {
  145.                  minute=0;
  146.                  hour++;
  147.                  if(hour==24)//小时到24,回零
  148.                    hour=0;
  149.                 }
  150.          }
  151.    
  152.   }
  153. }

  154. /*------------------------------------------------
  155. 按键扫描函数,返回扫描键值
  156. ------------------------------------------------*/
  157. unsigned char KeyScan(void)
  158. {
  159. unsigned char keyvalue;
  160. if(KeyPort!=0xff)
  161.    {
  162.     DelayMs(10);
  163.     if(KeyPort!=0xff)
  164.            {
  165.             keyvalue=KeyPort;
  166.             while(KeyPort!=0xff);
  167.                 switch(keyvalue)
  168.                 {
  169.                  case 0xfe:return 1;break;
  170.                  case 0xfd:return 2;break;
  171.                  case 0xfb:return 3;break;
  172.                  case 0xf7:return 4;break;
  173.                  case 0xef:return 5;break;
  174.                  case 0xdf:return 6;break;
  175.                  case 0xbf:return 7;break;
  176.                  case 0x7f:return 8;break;
  177.                  default:return 0;break;
  178.                 }
  179.           }
  180.    }
  181.    return 0;
  182. }

复制代码

这是定时器的时钟程序,显示部分可以自己改。
回复

使用道具 举报

地板
ID:96682 发表于 2017-6-9 16:30 | 只看该作者
使用单片机的定时器就能做到,只是没有 DS1302 的断电时间保持功能
回复

使用道具 举报

5#
ID:203500 发表于 2017-6-9 16:35 | 只看该作者
就是利用定时器设计一个时钟,只是精度没有DS1302时钟芯片高
回复

使用道具 举报

6#
ID:194255 发表于 2017-6-9 17:07 | 只看该作者
可以呀,但是那样的话,单片机一断电,就会复位了,之后时间就不准了
回复

使用道具 举报

7#
ID:111634 发表于 2017-6-9 18:19 | 只看该作者
实时时钟是单片机控制系统的常见课题。若采用单片机片内定时/计数器,一方面需要占用宝贵的硬件资源;另一方面,停电、关机等因素又使得计时不连续,复位时需要重新初始化和校时。采用外接实时时钟芯片,则能很好地解决这个问题。DS1302是目前性价比最高的时钟芯片。
回复

使用道具 举报

8#
ID:111634 发表于 2017-6-9 18:21 | 只看该作者
本帖最后由 zl2168 于 2017-6-9 18:22 编辑

实例94  模拟电子钟(由80C51定时器产生秒时基)
Proteus仿真一下,确认有效。
实例94 模拟电子钟(由80C51定时器产生秒时基).rar (43.05 KB, 下载次数: 20)

以上摘自张志良编著80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行书中电路和程序设计有详细说明,程序语句条条有注解。仿真电路和Hex文件能在清华出版社网站免费下载,程序源代码只能到书上看了。到图书馆借,或到新华书店翻阅,或到网上书店打折购买。
回复

使用道具 举报

9#
ID:209608 发表于 2017-6-9 20:28 | 只看该作者
我前两天就用定时器做了一个
回复

使用道具 举报

10#
ID:123289 发表于 2017-6-9 20:32 | 只看该作者
已有单片机时,再用时钟芯片,一般来说就是浪费,除非有极其特殊的需求。
回复

使用道具 举报

11#
ID:209529 发表于 2017-6-9 22:15 | 只看该作者
其实不管用外部时钟芯片还是直接单片机定时,精度都难保证的。一个是晶振我们无法保证就精准,但是外部时钟芯片,可以在掉电后保持时钟继续运行。
回复

使用道具 举报

12#
ID:197788 发表于 2017-6-10 12:35 | 只看该作者
你可以用定时器做,麻烦了点,只是没有ds1302精准,而且1302做的话断电后上电复位还能保持时钟运行。
回复

使用道具 举报

13#
ID:471066 发表于 2019-2-7 15:28 | 只看该作者
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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