分享个基于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 ; }
单片机源程序如下:
-
- #include <reg52.h>
- #include <type_h.h>
- #include <timer.h>
- #include <key.h>
- #include <LED_7.h>
- #include <alarm.h>
- #include <I2CROM.h>
- #include <com.h>
- void main()
- {
- uint8 key = 0;
- uint16 ms = 50 ;
- //uint8 LED7_len = 8 ; // 显示长度 初始8 ,闹钟长度为5
- ms_delay(100);
- Timer0_set() ; //初始化 定时器 T0
- x24c02_init();
- read_time() ; //包含了 数据校验
- Com_Init() ;
- while(1)
- {
-
- maketime(b);
- Naozhong() ;
- key = Keyx_scanf(); // 此 函数 内部已经 做好了 去抖动 等一系列操作
- key_do_something(key);
- // 根据 显示指针 所指向的 对象,来确定 显示的长度
- LED7_display(disp, 8); //数码管显示 耗时16ms
- Task_sendtime() ;
- ms_delay(1);
-
- }
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
串口通信 带I2C存储 时间 闹钟 按键 状态机 定时中断.rar
(105.16 KB, 下载次数: 119)
|