0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于51单片机数码管动态时钟电路图原理图

2oON_changxuemc 2019-09-17 09:36 次阅读

首先准备材料吧:SEG数码管4个共阴极(小编用的共阳极的)、10k排阻(小编没有直接做了个)、51单片机、按钮、30p电容、12MHz晶振、10k电阻、10uf电容、插针、74ls245(小编用三极管代替了)。

成品图

原理图

主程序:

#include "Key.h"

#include "led.h"

uchar timeSetBuff[8]={'0','0',LED_MODE_COUNT,'0','0',LED_MODE_COUNT,'0','0'};//时钟数据缓冲区

uchar alarmSetBuff[8]={'0','0',LED_MODE_ALARM,'0','0',LED_MODE_ALARM,'0','0'};//闹钟时间数据缓冲区

uchar timeDisMod=0x24; //00100100

uchar secondTemp,minuteTemp,hourTemp;

uchar secondAlarm,minuteAlarm,hourAlarm;

uchar timer0Temp;

uchar alarmKeyCount; //闹钟起停键计数

bit alarm_is_ok; //闹钟起停状态

bit time_is_ok; //时间是否到

bit interface_mod; // 显示界面模式,0为主时间界面,1为设置界面

/********************************************************************************************

* 函数名称:定时器0

* 功 能:定时器0初始化

* 入口参数:无

* 出口参数:无

*********************************************************************************************/

void initTimer0(void) //定时10ms

{

TMOD |= 0x01; //GATE=0,TR=1运行;C/T=1,counter,0,timer;01十六进制

TH0 = 0xdc;

TL0 = 0x00;

TR0 = 1; //timer0 控制位,为1时启动timer0

ET0 = 1; //timer0 中断使能

}

/********************************************************************************************

* 函数名称:时钟比较

* 功 能:比较时钟和闹钟的时间缓冲区,只比较时和分

* 入口参数:无

* 出口参数:无

*********************************************************************************************/

void timeCompare(void)

{

if((minuteTemp == minuteAlarm) && (hourTemp == hourAlarm))

{

time_is_ok = 1;

alarm_is_ok = 0;

interface_mod = 1;

}

}

/********************************************************************************************

* 函数名称:主函数

* 功 能:调用并执行各个子函数

* 入口参数:无

* 出口参数:无

*********************************************************************************************/

void main()

{

uchar keyRead;

init_led();

init_key();

initTimer0();

timer0Temp = 0x00;

secondTemp = 0x00;

minuteTemp = 0x00;

hourTemp = 0x00;

secondAlarm = 0x00;

minuteAlarm = 0x00;

hourAlarm = 0x00;

alarmKeyCount = 0x02;

alarm_is_ok = 0; //默认状态停止

time_is_ok = 0; //默认时间未到

interface_mod = 0;

sei();

while(1)

{

if(interface_mod == 1)

ledSweepDisplay(alarmSetBuff,timeDisMod);

else

ledSweepDisplay(timeSetBuff,timeDisMod);

if(alarm_is_ok == 1)

timeCompare();

keyRead = get_key_value();

if(keyRead == KEY_ALARM)

{

if(alarm_is_ok == 1 || time_is_ok == 1)

{

alarm_is_ok = 0;

time_is_ok = 0;

interface_mod = 0;

alarmKeyCount = 0x00;

}

else

{

if(alarmKeyCount

alarmKeyCount++;

else

alarmKeyCount = 0x00;

if(alarmKeyCount == 0x01)

interface_mod = 1;

if(alarmKeyCount == 0x02)

{

alarm_is_ok = 1;

interface_mod = 0;

}

}

}

if(keyRead == KEY_SECOND)

{ if(interface_mod == 1)

{

if(secondAlarm

secondAlarm++;

else

secondAlarm = 0x00;

alarmSetBuff[S_L] = secondAlarm % 10 + '0';

alarmSetBuff[S_H] = secondAlarm / 10 + '0';

}

else

{

if(secondTemp

secondTemp += 1;

else

secondTemp = 0x00;

timeSetBuff[S_L] = secondTemp % 10 + '0';

timeSetBuff[S_H] = secondTemp / 10 + '0';

}

}

if(keyRead == KEY_MINUTE)

{ if(interface_mod == 1)

{

if(minuteAlarm

minuteAlarm++;

else

minuteAlarm=0x00;

alarmSetBuff[M_L]=minuteAlarm%10+'0';

alarmSetBuff[M_H]=minuteAlarm/10+'0';

}

else

{

if(minuteTemp

minuteTemp += 1;

else

minuteTemp = 0x00;

timeSetBuff[M_L] = minuteTemp % 10 + '0';

timeSetBuff[M_H] = minuteTemp / 10 + '0';

}

}

if(keyRead == KEY_HOUR)

{

if(interface_mod == 1)

{

if(hourAlarm

hourAlarm++;

else

hourAlarm = 0x00;

alarmSetBuff[H_L] = hourAlarm % 10 + '0';

alarmSetBuff[H_H] = hourAlarm / 10 + '0';

}

else

{

if(hourTemp

hourTemp += 1;

else

hourTemp = 0x00;

timeSetBuff[H_L] = hourTemp%10+'0';

timeSetBuff[H_H] = hourTemp/10+'0';

}

}

}

}

/*, */

/********************************************************************************************

* 函数名称:定时器0中断函数

* 功 能:定时器0溢出中断入口处,定时10ms

* 入口参数:无

* 出口参数:无

*********************************************************************************************/

void timer0_overflow(void) interrupt 1

{

TH0 = 0xdc;

TL0 = 0x00;

if(time_is_ok == 1) //报警

WARN_TRUMPET = ~WARN_TRUMPET;

if(timer0Temp

timer0Temp++;

else //进中断100次

{

timer0Temp = 0x00;

if(secondTemp

{

secondTemp++;

}

else

{

secondTemp = 0x00;

if(minuteTemp

minuteTemp++;

else

{

minuteTemp = 0x00;

if(hourTemp

hourTemp++;

else

hourTemp = 0x00;

}

}

}

timeSetBuff[S_L] = secondTemp%10+'0';

timeSetBuff[S_H] = secondTemp/10+'0';

timeSetBuff[M_L] = minuteTemp%10+'0';

timeSetBuff[M_H] = minuteTemp/10+'0';

timeSetBuff[H_L] = hourTemp%10+'0';

timeSetBuff[H_H] = hourTemp/10+'0';

sei();

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 电路图
    +关注

    关注

    10212

    文章

    10645

    浏览量

    510402
  • 51单片机
    +关注

    关注

    269

    文章

    5648

    浏览量

    120681
  • 数码管
    +关注

    关注

    31

    文章

    1826

    浏览量

    89938

原文标题:51单片机数码管动态时钟电路图

文章出处:【微信号:changxuemcu,微信公众号:畅学单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    51单片机实验板电路图原理图

    51单片机实验板电路图原理图51单片机实验板电路图
    发表于 07-19 01:24

    51单片机入门之数码管介绍

    ,但是却浪费单片机的IO口。数码管动态显示(使用专用芯片)可以做到节省IO的目的。 动态显示的原理:动态显示的特点是将所有位
    发表于 07-19 01:11

    动态流动数码管技术资料下载

    动 态 流 动 数 码 以此文件夹的内容为例,所谓流动,就是8个数码管轮流显示一位数,采用两个共阳极四位数码管组成一个八位显示屏;使用AT89C51
    发表于 07-19 02:12

    多位数码管动态扫描原理分析

    微信公众号电子芯往期回顾51单片机开机复位、按键复位原理讲解51单片机晶振电路原理矩阵键盘电路
    发表于 09-11 09:15

    请问有51单片机原理图吗?

    51单片机(6位数码管原理图
    发表于 04-10 01:33

    如何对八位数码管时钟电路进行仿真

    外加上拉电阻的电阻排,由于仿真的单片机模块内有时钟电路以及复位电路,这里省略了。2、硬件设计与分析电路
    发表于 07-21 07:39

    51单片机实现动态数码管显示的方法

    51单片机动态数码管显示- 模块- 显示原理– 消抖静态数码管技术 + 人眼视觉停留显示原理
    发表于 11-18 08:43

    如何使用51单片机控制动态数码管

    简要地写了如何使用51单片机控制动态数码管的过程,内含模块信息、源代码、原理图等。
    发表于 11-18 06:03

    基于51单片机的LED数码管动态显示的设计资料

    51单片机数码管显示基于51单片机的LED数码管动态
    发表于 11-19 06:56

    数码管电路原理图

    51单片机关于数码管的实验电路中,采用的硬件是一个八位八段共阴极数码管,通过两个锁存器74HC573来控制。
    发表于 11-22 06:53

    使用51单片机实现数码管的显示

    写在前面:以下涉及到的程序及电路图不保证为最优方案,会存在很多不足之处,望谅解。正文学习目标:使用51单片机实现数码管的显示。学习内容:1.程序一:点亮
    发表于 11-22 07:11

    proteus单片机数码管显示要求

    proteus单片机数码管显示要求:单片机AT89C51外接6个共阳LED数码管,P3.0和P3.1引脚分别外接一独立按键。开机时
    发表于 12-06 07:01

    动态数码管的使用方法

    历年的蓝桥杯单片机组比赛都会考到数码管模块;对于省赛以及国赛来说,动态数码管都是必考模块!现在来给大家介绍动态
    发表于 01-12 06:19

    单片机数码管显示驱动封装成一个函数

    单片机数码管显示驱动封装成一个函数,方便需要用到的时候直接调用1、数码管电路原理图2、数码管
    发表于 01-24 06:21

    51单片机动态数码管

    简要地写了如何使用51单片机控制动态数码管的过程,内含模块信息、源代码、原理图等。
    发表于 11-11 20:06 15次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>:<b class='flag-5'>动态</b><b class='flag-5'>数码管</b>