基于51单片机的可调式电子仿真日历(时钟)

51单片机的使用十分简单,用它可以来做很多设计,而且51单片机结实耐造,我觉得用51来完成我的这个设计就可以满足相关的需求了。毕竟是仿真设计,这个是初代,经过一部分修改和提升,就可以在硬件上实现了(实物已经做出来了,效果还行)。

接下来我就简单介绍以下我的时钟。


 

文章目录


前言

其实51单片机挺好用的,操作简单,结实可靠,51可以满足本科阶段的相当部分的设计要求,而且还不需要什么高深的编码能力,只要简单学过c语言就可以掌握。这个时钟日历的设计十分的简单,不需要太多的知识,接下来我就简单介绍一下。


一、51单片机的性能和分析

       stc89c52是STC公司设计和生产的一款8位的控制器,功能;8k字节的Flash,512字节的RAM,32位I/O口线,看门狗定时器,内置4KBEEPROW,3个16位定时器,另外还有4个外部中断。还有一款单片机是stc89c51,有两个定时器,3个外部中断,其他与52没有多大的差异。不过51系列的单片机在编程时代码容量不大,没有具体的参数,不过我去年打算做一个游戏机,不过代码太长,最终编译失败,然后我就用32做了一个,在以后的文章中会给大家分享的。

       尽管我很喜欢51系列的单片机,不过它确实有些落后了,想想还是有点英雄落幕的感觉,现在在大学的一些比赛中,51还是可以承担一部分主控要求的,不过越来越少了,因为近些年来电子设计类比赛的题目越来越难了,或者说变得灵活了。从最开始的设计制作电压表、稳压电路、升降压装置、遥控类装置,到近些年的颜色识别、形状识别、球板平衡、立杆不倒,控制和自动化类的题目越来越灵活,每一届电赛在控制题上都有创新,要用到新的东西,大部分都用的不太熟悉,不过电源题在框架上没有太多的延申,基本都是工程上学过的东西,不过对于精度的要求越来越高,一定要对电路原理和设计有所了解,也要掌握PID控制的方法,这个在精密控制的应用上十分广泛。抱歉扯远了,回归正题,51确实落后了,不过,我们可以通过学习51来锻炼我们的编码能力,现阶段的编程c语言就足够了,在以后学习32的过程中,编码能力显得十分重要。

      

二、设计部分

1.设计思路

 上图就是电子时钟日历的仿真设计,这个是刚开机的状态,可以通过右下脚的按钮来校准时间和日期。接下来我们就来介绍并操作一下。

我们可以看到上图屏幕中的第二行,从左到右分别表示年、月、日、时、分、秒。

接下来我们按右下脚的第一个按钮(选择),显示屏的第一行就会出现一个‘*”号,这个星号在那个数字上面,就表示这个数字可以调整了。

 现在星号在月份的上面,就表示月份可以调整,这时我们可以通过按第二个按钮和第三个按钮来调整月份的大小,“加”键表示按下去后,月份数字加一,“减”键相反,比如我们把调整为12月,我们可以通过长按“加“键,或长按减键。效果如下图所示。

 接下来,我们可以可以继续调整日期的数字,这里我设置了每个月,大月,小月的天数,也就是说,你的日期输调整的最大值,即不会大于现实中日期的天数。比如说,2022年的二月,有28 天,所以当日期数字加到28 时,再加的话就会变成1.

最下面的那两个键,基本没有什么作用,我就不一一介绍了。这个日历的时间还算精准,一个小时会差一秒,有时快一秒,有时慢一秒,所以一天下来的话,会差10-25秒,这个是我测出来的,因为51的定时器是16位的,所以调整的范围有限,对了,这个调时和数字可以长按加减键,效果其实都是一样的,所以我们仅用三个键就可以完成对时钟日历的校准。本人技术有限,写的不太完整请谅解。

实物展示;这个要电池才行,我电池去做别的项目了。

2.代码

部分代码:

下面的代码是显示相关数字的函数

void lcdprint(unsigned int nia,unsigned int yue,unsigned int day,unsigned int h,unsigned int min,unsigned int sec)
{
     int n2=nia/10;
     int n1=nia%10;

     int y2=yue/10;
     int y1=yue%10;

     int d2=day/10;
     int d1=day%10;

     int h2=h/10;
     int h1=h%10;

     int m2=min/10;
     int m1=min%10;

     int s2=sec/10;
     int s1=sec%10;
     lcdstation(0,1);年份数字
     wc51ddr(n2+0x30);
     lcdstation(1,1);
     wc51ddr(n1+0x30);

     
     lcdstation(3,1);
     wc51ddr(y2+0x30);月份数字
     lcdstation(4,1);
     wc51ddr(y1+0x30);

     
     lcdstation(6,1);
     wc51ddr(d2+0x30);日期数字
     lcdstation(7,1);
     wc51ddr(d1+0x30);

   
     lcdstation(9,1);
     wc51ddr(h2+0x30);小时数
     lcdstation(10,1);
     wc51ddr(h1+0x30);

     
     lcdstation(12,1);
     wc51ddr(m2+0x30);分
     lcdstation(13,1);
     wc51ddr(m1+0x30);

     lcdstation(14,1);
     wc51ddr(s2+0x30);秒
     lcdstation(15,1);
     wc51ddr(s1+0x30);
     
}

void timer1_int (void) interrupt 3
{
     TH1=(65536-9960)/256;
     TL1=(65536-9960)%256;
     ms++;
     if(ms==80){
        ms=0;
        sec++;
        if(sec==60){
        sec=0;
        min++;
        if(min==60){
        min=0;
        h++;
          if(h==24){
          h=0;
          day++;
          if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12){
             if(day>31){
             day=1,yue++;
             if(yue>12){
             yue=1;
             nia++;
              if(nia==100){nia=0;}
             }            
             }
             
          }

这个是中断中应该设置的函数(部分)。


总结

这个日历时钟是不是有一定的作用,我觉得不算难,可以尝试动手做一下,可以给我留言。

要完整资料的可以加我QQ,2649191761

  • 5
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值