历史上的今天
今天是:2025年04月18日(星期五)
2020年04月18日 | 利用51单片机做一个简易时钟
2020-04-18 来源:eefocus
利用独立键盘,数码管完成一个简易的时钟,按键一可以修改时间,按键二可以设置闹钟,按键三进行加一操作,按键四进行减一操作。
主函数:
void main()
{
bsp_init();
while(1)
{
TimeTim(); //正常时间在走
bsp_KeyScan(); //键盘扫描看哪个功能键被按下
bsp_KeyProc(keyvalue); //根据键值进行相应的功能处理
SetValueShow(); //数码管上显示的值
ShowSegCC(); //显示在数码管上
bsp_CheckAlarm(); //闹钟检查
}
}
时钟模块:
unsigned char hour = 2, min = 2, sec = 3; //设置时间初值
unsigned char ahour = 0, amin = 0, asec = 0; //设置闹钟初值
unsigned char time = 0;
void delay_us(unsigned char t)
{
while(--t);
}
void delay_ms(unsigned int t) //t最大为255
{
while(t--)
{
delay_us(245);
delay_us(245);
}
}
void TimeTim()
{
if(settype == 0 && alarmvalue == 0) //当不在闹钟状态也不在修改时间状态的时候时间正常走
{
if(count == 20)
{
count = 0;
sec++;
if(sec == 60)
{
sec = 0;
min++;
if(min == 60)
{
min = 0;
hour++;
if(hour == 24)
{
hour = 0;
}
}
}
}
}
}
//检查时间是否到了闹钟时间
void bsp_CheckAlarm(void)
{
if((hour == ahour) && (min == amin) && (sec == asec))
{
hour = 0;
min = 0;
sec = 0;
}
}
键盘模块:
sbit SETTIME = P0^0; //修改时间
sbit SETALARM = P0^1; //设置闹钟
sbit INC = P0^2; //加1
sbit DEC = P0^3; //减1
unsigned char keyvalue = 0;
unsigned char settype = 0; //0是初始状态正常显示,1是修改秒,2是修改分,3是修改时
unsigned char alarmvalue = 0; //0是初始状态,1是修改秒,2是修改分,3是修改时
void bsp_KeyScan(void)
{
if(SETTIME == 0)//K1按键被按下
{
keyvalue = 1;
while(!SETTIME);//等待按键释放
}
if(SETALARM == 0)
{
keyvalue = 2;
while(!SETALARM);
}
if(INC == 0)
{
keyvalue = 3;
while(!INC);
}
if(DEC == 0)
{
keyvalue = 4;
while(!DEC);
}
}
void bsp_KeyProc(unsigned char keyv)
{
if(keyv == 1)
{
settype++;
if(settype == 4)
{
settype = 0;
}
keyvalue = 0; //键值要清0!!!
}
if(keyv == 2)
{
alarmvalue++;
if(alarmvalue == 4)
{
alarmvalue = 0;
}
keyvalue = 0;
}
if(keyv == 3)
{
timeadd();
keyvalue = 0;
}
if(keyv == 4)
{
timedec();
keyvalue = 0;
}
}
void timeadd()
{
//设置时间加1
if(settype == 1)
{
if(sec < 59)
{
sec++;
}
else
{
sec = 0;
}
}
else if(settype == 2)
{
if(min < 59)
{
min++;
}
else
{
min = 0;
}
}
else if(settype == 3)
{
if(hour < 23)
{
hour++;
}
else
{
hour = 0;
}
}
//设置闹钟加1
if(alarmvalue == 1)
{
if(asec < 59)
{
asec++;
}
else
{
asec = 0;
}
}
else if(alarmvalue == 2)
{
if(amin < 59)
{
amin++;
}
else
{
amin = 0;
}
}
else if(alarmvalue == 3)
{
if(ahour < 23)
{
ahour++;
}
else
{
ahour = 0;
}
}
}
void timedec()
{
//设置时钟减1
if(settype == 1)
{
if(sec > 0)
{
sec--;
}
else
{
sec = 59;
}
}
else if(settype == 2)
{
if(min > 0)
{
min--;
}
else
{
min = 59;
}
}
else if(settype == 3)
{
if(hour > 0)
{
hour--;
}
else
{
hour = 23;
}
}
//设置闹钟减1
if(alarmvalue == 1)
{
if(asec > 0)
{
asec--;
}
else
{
asec = 59;
}
}
else if(alarmvalue == 2)
{
if(amin > 0)
{
amin--;
}
else
{
amin = 59;
}
}
else if(alarmvalue == 3)
{
if(ahour > 0)
{
ahour--;
}
else
{
ahour = 23;
}
}
}
数码管模块:
#define SEGPORT P1
sbit WEI = P2^1;
sbit DUAN = P2^0;
unsigned char code TableCA[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳数码管段选码表,无小数点
unsigned char code TableSel[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//共阴数码管位选码表
unsigned char code TableCC[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴数码管段选码表,无小数点
unsigned char Show[8] = {0};
//unsigned int showvalue = 0;
//unsigned int time = 0;
void ShowSegCA(unsigned char t)
{
SEGPORT = TableCA[t];
}
//1到255显示
void ShowSegCC(void)
{
static unsigned char i = 0;
//消隐
SEGPORT = 0x00;
DUAN = 1;
DUAN = 0;
//选通位码
WEI = 1;
SEGPORT = TableSel[i];
WEI = 0;
//选通位码
DUAN = 1;
SEGPORT = Show[i];
DUAN = 0;
i++;
if(i == 8)
{
i = 0;
}
下一篇:51单片机定时时间的计算
史海拾趣
|
求购,《Tornado/VxWorks入门与提高》,哪里能买到呢? 网上的书店找了好多都是缺货,那位仁兄帮帮忙 谢谢 mryanzh@126.com… 查看全部问答> |
|
我用evc做了一个基于对话框的工程,我用代码来加上Menu,但我怎么控制菜单的checked属性呢? 我就是想实现选择一个菜单后有个小勾,就想windows里面的查看方式一样,比如列表,缩略图,小图标什么的,选择后有小勾的效果。 谁知道啊?… 查看全部问答> |
|
本人购买了一块STM32F103ZET6评估板,配有KEIL3和ULINK下载器。后因需要防止程序被读出,想尝试下读保护功能,于是在程序中添加了使能读保护的代码。板子复位后正常运行,查询读保护状态位已置位,但无法更新程序。查阅资料得知使能读保护后 ...… 查看全部问答> |
|
New head job opportunity for you Here are some new job opportunities for you from EMC China,if it\'s fit for you .Plz touch me,thanks for your support! Christina(028)86701200 QQ:1106525264 Principal Software QA Engineer - USD/Chengdu Responsibilities ...… 查看全部问答> |
|
小弟最近在做毕业设计,用到了高阶FIR滤波器,一头雾水,查找了一些资料后,了解了一种方法:利用分布式串并结合的算法可以实现。里面有用到FPGA的查找表和流水线,我对FPGA不怎么熟悉,不知道怎么调用这两个东西,或是自己设计?怎么设计?哪位大 ...… 查看全部问答> |
|
EEWORLD大学堂----电源设计小贴士39:同步整流带来的不仅仅是高效率 电源设计小贴士39:同步整流带来的不仅仅是高效率:https://training.eeworld.com.cn/course/479 电源设计小贴士39:同步整流带来的不仅仅是高效率 … 查看全部问答> |




