单片机数码管电子时钟Proteus仿真图

发布者:达文西happy最新更新时间:2020-08-04 来源: 51hei关键字:单片机  数码管  电子时钟 手机看文章 扫描二维码
随时随地手机看文章

①开机为走时模式,正常显示时间。
②共设置3个按键,分别为模式键、功能键1、功能键2。按动模式键,模式将在“走时/调时/日期显示及调整/闹钟显示及调整”4个模式下切换。
③走时模式下按动功能键1/功能键2停止闹钟。
④调时模式下,功能键1上调时间,功能键2下调时间。


仿真原理图如下

单片机源程序如下:

#include 

#define uchar unsigned char

uchar code tab[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};

//共阳极数码管显示"0~9","灭"和"-"的字段码

//uchar code tab[]={0x3f,0x06,05b,0x4f,0x66,0x6d,07d,0x07,0x7f,0x6f,0x00,0x40};//共阴数码管

uchar code wetab[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};  //位选

uchar data dis[8]={0x00,0x00,0x0b,0x00,0x00,0x0b,0x00,0x00};

//显示数据缓冲区,时十、个位、分十、个位、秒十、个位初始为0,0x0b为"-"编码

uchar data timedat[3]={0x00,0x00,0x00};  //分别为秒、分和小时的计数值(记录K1和K2次数)

uchar data  ms50=0x00, num=0x00,  n1=0x00,  n2=0x00;

//定义定时次数变量,调整模式变量,按加1键次数变量,按减1键次数变量

sbit  key0=P1^0 ;  //调整键--模式

sbit  key1=P1^1 ;  //加1键

sbit  key2=P1^2 ;  //减1键

//---------------------------------------

void  delay1ms( unsigned  int  z )  //定义延时1ms函数

{ unsigned  int  x, y ;

for  ( x=z;  x>0;  x-- )

                for  ( y=120; y>0 ;  y-- )        ;

}


//---------------------------------------

//按键处理函数。如果没有按键则时钟正常走时。当按K0键1次→暂停走时进入调小时状态;再按K0键1次→进入调分钟状态;再按K0键1次→回到正常走时状态。对于K1和K2键,如果正常走时下→按K1K2键不起作用;如果进入调时或者调分状态→按K1键可对时或分加1操作,小时加到24则回0,分钟加到60则回0。按K2键可对时或分减1操作,小时减到负则回23,分钟减到负则回59。


void keyscan(  void )

{        EA=0;  //关中断

        if(timedat[0]==0&timedat[1]==0&timedat[2]==7)  {P1=0xff;}

if (key0==0)         { delay1ms(10);         while (key0==0);

                        num++; TR0=0; ET0=0;  // 调整键K0每按1次--模式变量num加1

                        if (num>=3)         {num=0;  ET0=1;  TR0=1;  }  // 启动T0校时

        }

                if (num!=0)        //模式变量不等于0

{        if (key1==0)        // K1键确实按下

         {        delay1ms(10);         while (key1==0);           timedat[num]++;  //记录按键K1按下次数

                                if (num==2) n1=24;  else n1=60;                //模式变量等于小时2--则回迟到一天或60分钟

if (timedat[num]>=n1)          { timedat[num]=0; }          }

                }

                if (num!=0)

                 {        if (key2==0)        

{        delay1ms(10);        while (key2==0);                 timedat[num]--;  //记录按键K2按下次数

                                if (num==2) n2=23;else n2=59;                        

                                if (timedat[num]<=0)                  {timedat[num]=n2; }          }

                }

                 EA=1;

        }


//---------------------------------------

//数码管显示函数。时间显示先秒个位计算显示→秒十位计算显示→再分个位计算显示→分十位显示→再时个位计算显示→时十位显示。

         void  display( void )

        {          uchar k;

                if(timedat[0]==0&timedat[1]==0&timedat[2]==7)  {P1=0xff;}

                 dis[0]=timedat[0]%10;  dis[1]=timedat[0]/10;   //秒

dis[3]=timedat[1]%10;  dis[4]=timedat[1]/10;  //分

dis[6]=timedat[2]%10;  dis[7]=timedat[2]/10;  //时

for ( k=0;  k<8;  k++ )

                        {         P0=tab[ dis[k] ];  P2=wetab[k];    delay1ms(1);     P2=0x00;         }

}        

//---------------------------------------

//主函数,时间显示先秒个位计算显示,然后是秒十位计算显示;再就是分个位计算显示,然后是分十位显示;再就是时个位计算显示,然后是时十位显示。定时器中断先检测1秒是否到→1秒如果到则秒单元加1;1秒如果没到就检测1分钟是否到→1分钟如果到则分单元加1;如果没到就检测1小时是否到→1小时如果到则时单元加1;如果没到→则显示时间。

         void main( void )

        {   TMOD=0x01;   //T0定时50ms,方式1

                EA=1;  ET0=1;  TR0=1;  //开中断,允许T0中断,启动T0

                TH0=0x3c;  TL0=0xb0;

                while (1)

                        {         display( ) ;

                                keyscan( ) ;

                        }

}


//定时器/计数器T0中断服务函数。定时器中断先检测1秒是否到→1秒如果到则秒单元加1;1秒如果没到就检测1分钟是否到→1分钟如果到则分单元加1;如果没到就检测1小时是否到→1小时如果到则时单元加1;如果没到→则显示时间。


void  timer0(void)  interrupt  1

{ ET0=0; TR0=0;   //不许T0中断也不启动

TH0=0x3c;  TL0=0xb0;  

TR0=1;  //启动T0

ms50++;

P1=0xf7;

         if(timedat[0]==0&timedat[1]==0&timedat[2]==7)  {P1=0xff;}

if (ms50==20)         {        ms50=0x00;  timedat[0]++;  //变量m回0,且秒加1

                if (timedat[0]==60)          {         timedat[0]=0;timedat[1]++;  //秒到60后回0,且分加1

                        if (timedat[1]==60)         {         timedat[1]=0;timedat[2]++;  //分到60后回0,且时加1

                                if (timedat[2]==24)         {         timedat[2]=0;         }         }        }  //时到24后回0

                                 

        }

        ET0=1;   //允许T0中断

}

关键字:单片机  数码管  电子时钟 引用地址:单片机数码管电子时钟Proteus仿真图

上一篇:单片机DS18B20温度测控系统
下一篇:51单片机蜂鸣器播放小星星两只老虎欢乐颂

推荐阅读最新更新时间:2024-11-12 21:16

车规MCU的软件开发套件
Non-AUTOSAR软件 虽然AUTOSAR是一个开发软件架构,在代码重用性、可维护性、开发效率和代码质量方面有诸多优势,但是使用AUTOSAR标准需要一定的授权费用且大多数AUTOSAR软件和配置工具都是商用付费软件,需要额外购买license授权。因此,只有量大的平台化项目,Car OEM和Tier-1才会完全采用AUTOSAR架构软件进行开发 , 以cover上百万的AUTOSAR软件费用。 对于项目预算有限、非平台化的小项目,非AUTOSAR(Non-AUTOSAR)软件开发是一个不错的选择。虽然很多大客户有自己在某个/多个应用开发方面多年积累的软件库可以使用,但是面对更新换代越来越快且越来越复杂的车规MCU硬件和日
[嵌入式]
车规<font color='red'>MCU</font>的软件开发套件
51单片机数据传递类指令举例介绍
(1)以直接地址为目的操作数的 指令 MOV direct,A 例: MOV 20H,A MOV direct,Rn MOV 20H,R1 MOV direct1,direct2 MOV 20H,30H MOV direct,@Ri MOV 20H,@R1 MOV direct,#data MOV 20H,#34H (2)以间接地址为目的操作数的指令 MOV @Ri,A 例:MOV @R0,A MOV @Ri,direct MOV @R1,20H MOV @Ri,#data MOV @R0,#34H (3)十六位数的传递指令 MOV DPTR,#data16 8051是一种8位机,这是唯一的一条16位立即数
[单片机]
MSP430单片机各种寄存器总结(2)——UCS
第二章 UCS寄存器 2.1 UCSCTL0 上述的两个区域并不需要设置,在配置FFL的时候直接设置成0即可,FLL配置完成后会自动被设置。 2.2 UCSCTL1 DCORSEL,DCOCLK的频率范围设置参数,通过它来设置DCOCLK的频率范围,比如:设置DCOCLK的输出频率范围为0.64~14.0MHz 如下图所示,可知设置频率为0.64~14.0MHz的DCO需要将DCORSEL的值设置为3. UCSCTL1 = DCORSEL_3; //DCORSEL_3是宏定义,为0x0030 2.3 UCSCTL2 & UCSCTL3 2.3.1 寄存器示意图 2.3.2 锁频环FLL 上述两个是
[单片机]
MSP430<font color='red'>单片机</font>各种寄存器总结(2)——UCS
8位微控制器W78E54简介
1. 概述 W78E54B是宽频率范围、低功耗的8位微控制器。它的指令集同标准8051指令集完全兼容。W78E54B包含16K字节的Flash EPROM;256字节的RAM;4个8位双向、可位寻址的I/O口;一个附加的4位I/O口P4;3个16位定时/计数器;一个硬件看门狗定时器及一个串行口。这些外围设备都由有7个中断源和2级中断能力的中断系统支持。为了方便用户进行编程和验证,W78E54B内含的Flash EPROM允许电编程和电读写。一旦代码确定后,用户就可以对代码进行保护。 W78E54B有2种节电模式,空闲模式和掉电模式,2种模式均可由软件来控制选择。空闲模式下,处理器时钟被关闭,但外设仍继续工作。在掉电模式下晶体振荡
[单片机]
MSP430单片机的中断机制
msp430教程之四 上次和大家聊到了GPIO的使用,但是讲的不是很全面,要是全面涉及的话就是我们后面要讲的内容了,这里我们就不多加描述。在后期的讲解中也会慢慢涉及我们没有讲到的一些功能的。今天我们要涉及一个对于单片机来说非常重要的一个概念和功能。 什么是中断? 我们不以专业术语来描述这个东西,我们以一个比较好理解的方式来讲。首先大家要有一个理解就是我们单片机是按照程序一步一步的执行的,通过仿真的时候大家也可以看出来我们点击单步运行我们就可以看到光标向下移动一步,也就是单片机向下移动一步。就是单步运行的。就像我们人一样,你只能在一个时刻内做一件事情,没有办法说一边吃饭一边喝水吧(极短的时刻内你不行的吧),当你要做另外一件事
[单片机]
单片机12232 C语言的驱动程序
/****************点阵12232函数调用库**********************/ ////////////////////////////////////////////////////////// #include reg52.h #include intrins.h #include dewei.h #include table.h #define uchar unsigned char #define uint unsigned int #define frist_page 0xb8 //页地址设置(0~3) #define frist_row 0xc0 //扫描行 (0~31)
[单片机]
STM8单片机ADC连续扫描模式
  当STM8单片机使用ADC功能读取多个通道的值时,可以使用连续模式,但是连续模式一次只能采样一个通道的值,那么如果要采样多个通道时怎么办呢?STM8提供了一个多通道连续采样扫描模式。也就是说多个通道采样时才有扫描模式,从第0通道开始依次向后扫描,扫描完成后会自动开始第二次扫描。而不像单次扫描模式那样,依次结束后ADC就会自动关闭,需要手动开启第二次扫描。连续扫描模式只需要开启一次,就会一直重复的采样,直到手动关闭,才会结束。   连续扫描模式相比单次扫描模式,在初始化的时候,只是多了一行代码,就是设置COUNT位为1.   下面开始分析要使用连续扫描模式,需要设置哪些寄存器的哪些位。   首先要设置最大的采样通道。
[单片机]
STM8<font color='red'>单片机</font>ADC连续扫描模式
【GD32 MCU 入门教程】二、GD32 MCU 烧录说明(1)ISP 烧录
GD32 MCU提供了多种烧录方法,可在调试和生产等阶段进行便捷的烧录。GD32目前主要烧录方法有ISP烧录、SWD/JTAG在线下载、脱机烧录三种类型。 ISP烧录:使用串口或USB即可烧录,无需特殊工具支持。可根据协议自行定制下载方式,需要控制BOOT0引脚电平选择启动模式。 SWD/JTAG在线下载:无需切换MCU启动方式,使用仿真器等可进行下载。需使用仿真器和上位机进行操作。 脱机烧录:适用于大批量的产线生产,烧录过程无需PC和软件,可脱机进行烧录,批量烧录效率高。 本章对三种烧录方法有以下三个方面介绍。 1 烧录工具和硬件连接:介绍各烧录方法需使用的工具,以及硬件所需接口。 2 软件操作和烧录流程:介绍烧录软件的
[单片机]
【GD32 <font color='red'>MCU</font> 入门教程】二、GD32 <font color='red'>MCU</font> 烧录说明(1)ISP 烧录
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
    做任何事情之前,一定要想好目标。没有目标的事情是做不好的,也做不成。我的目标就是学习ARM开发,当然是深入的学习。目标如下 :1、学习A ...
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
  • 学习ARM开发(7)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved