找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的串口通信+带I2C存储+时间+闹钟+按键+状态机+定时中断源码

[复制链接]
跳转到指定楼层
楼主
分享个基于51单片机设计的 串口通信+带I2C存储+时间+闹钟+按键+状态机+定时中断
矩阵 按键 中 随意抽取 6个按键 来完成一下功能:
1)    K1 ,K3,K5 分别为 秒钟,分钟,小时的+1功能;
2)    K2 ,K4,K6 分别为 秒钟,分钟,小时的 -1功能;
3)    K7 切换显示 时间 和闹钟的;



全时钟自动运行 的逻辑

全时钟自动运行 代码 逻辑(流程)分析

时钟的原理
   小时  -             分钟            -        秒钟
分钟由59>0时刻+1  秒钟由59>0时刻 +1     每一秒加1

/*******************************************************************/
定义全局变量a_mstime=0 累计本代码的总共毫秒数量(最后看这个定义)
定义全局变量 flag=0 , 让秒钟自动加1的一个信号。  (最后看这个定义)

主函数
{
   定义 数码管显示数组 00-00-00 ,长度为8;
   定义 时间数组       23,55,35   (小时,分钟,秒钟)
  while(1)
   {
      判断flag == 1 ;
           秒钟+1 ;(还要确保 0 – 59 之间)
           判断秒钟 >= 60
                秒钟 = 0;( 由60变成 0 , 60出现的时间多长?4us左右,4us之前59出现了1秒了)  59(1s)—>60(4us) —>0(1秒)
                分钟 +1;(也要控制分钟取值范围0-59)
                判断分钟 >= 60
                    分钟 = 0;
                    小时 +1;(控制小时取值范围0-23)
           
           
      判断按键1是否按下
          如果按下,去抖,等待完全松开
          让秒钟加1;(你可以写任何你想做的事情)
      
      判断按键2是否按下
          如果按下,去抖,等待完全松开
          让分钟加1;(你可以写任何你想做的事情)
      
      判断按键3是否按下
          如果按下,去抖,等待完全松开
          让小时加1;(你可以写任何你想做的事情)
      
      把时间数组[3] 拆解到 显示数组[8]里面去;
      通过函数LED7_display(a, 8); 把拆解后的时间显示出来

}
}

子函数LED7_display(a, 8)
{
   把a里面的8个内容逐个的送到每个数码管显示,
   调用8次ms_delay(2);(每个数码管 要消耗2ms 的点亮时间;)
}

子函数ms_delay(毫秒数量) // 就是模仿小孩子 等人 时的 数数(动名)
{
2个空循环;

///////////////////////////

a_mstime += 毫秒数量;(把本代码的毫秒数累计起来)

判断a_mstime 大于等于 1000 的时刻,

    flag =1 ;秒钟加1的信号

    a_mstime = a_mstime-1000 ;

}

-------------------------------------
秒钟自动+1 的逻辑

秒钟自动加1 代码 逻辑(流程)分析

定义全局变量a_mstime=0 累计本代码的总共毫秒数量(最后看这个定义)
定义全局变量 flag=0 , 让秒钟自动加1的一个信号。  (最后看这个定义)

主函数
{
   定义 数码管显示数组 00-00-00 ,长度为8;
   定义 时间数组       23,55,35   (小时,分钟,秒钟)
  while(1)
   {
      判断flag == 1 ;
           秒钟+1 ;(还要确保 0 – 59 之间)
            
           
      
      判断按键1是否按下
          如果按下,去抖,等待完全松开
          让秒钟加1;(你可以写任何你想做的事情)
      
      判断按键2是否按下
          如果按下,去抖,等待完全松开
          让分钟加1;(你可以写任何你想做的事情)
      
      判断按键3是否按下
          如果按下,去抖,等待完全松开
          让小时加1;(你可以写任何你想做的事情)
      
      把时间数组[3] 拆解到 显示数组[8]里面去;
      通过函数LED7_display(a, 8); 把拆解后的时间显示出来

}
}

子函数LED7_display(a, 8)
{
   把a里面的8个内容逐个的送到每个数码管显示,
   调用8次ms_delay(2);(每个数码管 要消耗2ms 的点亮时间;)
}

子函数ms_delay(毫秒数量) // 就是模仿小孩子 等人 时的 数数(动名)
{
2个空循环;

///////////////////////////

a_mstime += 毫秒数量;(把本代码的毫秒数累计起来)

判断a_mstime 大于等于 1000 的时刻,

    flag =1 ;秒钟加1的信号

    a_mstime = a_mstime-1000 ;

}


单片机源程序如下:

  1.          
  2. #include <reg52.h>
  3. #include <type_h.h>
  4. #include <timer.h>
  5. #include  <key.h>
  6. #include  <LED_7.h>
  7. #include  <alarm.h>
  8. #include  <I2CROM.h>
  9. #include  <com.h>



  10. void main()
  11. {
  12.         uint8  key = 0;
  13.         uint16 ms = 50 ;  
  14.   //uint8  LED7_len = 8 ;     // 显示长度 初始8 ,闹钟长度为5               
  15.   ms_delay(100);
  16.   Timer0_set() ;  //初始化 定时器 T0
  17.         x24c02_init();
  18.   read_time()  ;  //包含了 数据校验
  19.         Com_Init()   ;

  20.    while(1)
  21.          {
  22.                   
  23.                   maketime(b);
  24.                   Naozhong() ;
  25.                         key = Keyx_scanf(); // 此 函数 内部已经 做好了 去抖动 等一系列操作                 
  26.                         key_do_something(key);       
  27.                         // 根据 显示指针 所指向的 对象,来确定 显示的长度                  
  28.       LED7_display(disp, 8); //数码管显示 耗时16ms
  29.                         Task_sendtime() ;
  30.                         ms_delay(1);
  31.                      
  32.    }
  33. }
  34. ……………………

  35. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:

串口通信 带I2C存储 时间 闹钟 按键 状态机 定时中断.rar (105.16 KB, 下载次数: 119)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:273495 发表于 2019-4-24 21:10 | 只看该作者
学习一下
回复

使用道具 举报

板凳
ID:1097263 发表于 2023-12-2 17:56 | 只看该作者
期盼坛主能发电路仿真图protues
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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