基于51单片机的可调数字时钟程序

发布者:码农创想家最新更新时间:2020-12-08 来源: 51hei关键字:51单片机  可调数字时钟  定时器  中断方式 手机看文章 扫描二维码
随时随地手机看文章

使用51单片机内部定时器中断方式一计算时间,在LCD1602液晶显示小时、分钟、秒,并且可以使用按键调整小时和分钟,每次到整点时整点报时。


代码如下:


//=============================================================

//功能描述:液晶显示时钟,可调时间,准备整点时报时

//MCU:STC89C51,晶振频率:11.0592MHz

//=============================================================

#include  

#include  

#include  


sbit RS=P2^0;    //寄存器选择位,将RS位定义为P2.0引脚

sbit RW=P2^1;    //读写选择位,将RW位定义为P2.1引脚

sbit E=P2^2;     //使能信号位,将E位定义为P2.2引脚

sbit BF=P0^7;    //忙碌标志位,,将BF位定义为P0.7引脚

sbit k1=P1^0;    //按键调小时加

sbit k2=P1^1;    //按键调小时减

sbit k3=P1^2;    //按键调分钟加

sbit k4=P1^3;    //按键调分钟减

sbit beep=P1^4;  //蜂鸣器


unsigned char code digit[ ]={"0123456789"}; //定义字符数组显示数字

unsigned char code string[ ]={"Weather:Sunny"}; //定义字符数组显示提示信息

unsigned char count;   //定义变量统计中断累计次数

unsigned char s,m,h;   //定义变量储存秒、分钟和小时

/*==================================================

函数功能:延时

(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒

==================================================*/

void delay1ms()        //@11.0592MHz

{

   unsigned char i,j;        

         for(i=0;i<10;i++)

          for(j=0;j<33;j++);                 

}


void delay100ms()                //@11.0592MHz

{

        unsigned char i, j;

        i = 180;

        j = 73;

        do

        {

                while (--j);

        } while (--i);

}


/*==================================================

函数功能:延时若干毫秒

==================================================*/

void delay(unsigned char n)

{

   unsigned char i;

         for(i=0;i         delay1ms();

}


/*==================================================

函数功能:蜂鸣器发出声音

==================================================*/

void sound(){

         beep=0;

         delay100ms();

         beep=1;

         delay100ms();

}


/*==================================================

函数功能:判断液晶模块的忙碌状态

==================================================*/

unsigned char BusyTest(void)

  {

    bit result;

                RS=0;       //根据规定,RS为低电平,RW为高电平时,可以读状态

    RW=1;

    E=1;        //E=1,才允许读写

    _nop_();   //空操作

    _nop_();

    _nop_();

    _nop_();   //空操作四个机器周期,给硬件反应时间        

    result=BF;  //将忙碌标志电平赋给result

    E=0;         //将E恢复低电平

    return result;

  }

/*==================================================

函数功能:将模式设置指令或显示地址写入液晶模块

==================================================*/

void WriteInstruction (unsigned char dictate)

{   

   while(BusyTest()==1); //如果忙就等待

         RS=0;                  //根据规定,RS和R/W同时为低电平时,可以写入指令

         RW=0;   

         E=0;                   //E置低电平(根据表8-6,写指令时,E为高脉冲,

                          // 就是让E从0到1发生正跳变,所以应先置"0"

         _nop_();

         _nop_();             //空操作两个机器周期,给硬件反应时间

         P0=dictate;            //将数据送入P0口,即写入指令或地址

         _nop_();

         _nop_();

         _nop_();

         _nop_();               //空操作四个机器周期,给硬件反应时间

         E=1;                   //E置高电平

         _nop_();

         _nop_();

         _nop_();

         _nop_();               //空操作四个机器周期,给硬件反应时间

          E=0;                  //当E由高电平跳变成低电平时,液晶模块开始执行命令

}

/*==================================================

函数功能:指定字符显示的实际地址

==================================================*/

void WriteAddress(unsigned char x)

{

     WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"

}

/*==================================================

函数功能:将数据(字符的标准ASCII码)写入液晶模块

==================================================*/

void WriteData(unsigned char y)

{

    while(BusyTest()==1);  

          RS=1;           //RS为高电平,RW为低电平时,可以写入数据

          RW=0;

          E=0;            //E置低电平(根据表8-6,写指令时,E为高脉冲,

                       // 就是让E从0到1发生正跳变,所以应先置"0"

          P0=y;           //将数据送入P0口,即将数据写入液晶模块

          _nop_();

          _nop_();

           _nop_();

     _nop_();       //空操作四个机器周期,给硬件反应时间

          E=1;          //E置高电平

          _nop_();

          _nop_();

          _nop_();

          _nop_();        //空操作四个机器周期,给硬件反应时间

          E=0;            //当E由高电平跳变成低电平时,液晶模块开始执行命令

}

/*==================================================

函数功能:对LCD的显示模式进行初始化设置

==================================================*/

void LcdInitiate(void)

{

  delay(15);             //延时15ms,首次写指令时应给LCD一段较长的反应时间

  WriteInstruction(0x38);  //显示模式设置:16×2显示,5×7点阵,8位数据接口

        delay(5);               //延时5ms ,给硬件一点反应时间

  WriteInstruction(0x38);

        delay(5);

        WriteInstruction(0x38); //连续三次,确保初始化成功

        delay(5);

        WriteInstruction(0x0c);  //显示模式设置:显示开,无光标,光标不闪烁

        delay(5);

        WriteInstruction(0x06);  //显示模式设置:光标右移,字符不移

        delay(5);

        WriteInstruction(0x01);  //清屏幕指令,将以前的显示内容清除

        delay(5);


}

/*==================================================

函数功能:显示小时、调整小时时间                          

==================================================*/

void DisplayHour()

{

  unsigned char i,j;

        if(k1==0)           //按钮k1按下时

                delay(10);        //延时消抖

        if(k1==0)            //判断k1按下

        {

                while(!k1);         //k1状态取反

                h++;               //小时数增加

        }

        if(k2==0)            //按钮k2按下时

                delay(10);         //延时消抖

        if(k2==0)            //判断k1按下

        {

                while(!k2);        //k2状态取反

                if(h/10==0&&h%10==0)  //判断时间是否在24小时上

                {

                h=24;                 //当小时在24小时

                h--;                  //小时数减少为23

                }

                else

                        h--;                //小时数减少

        }

        i=h/10;                //取整运算,求得十位数字

        j=h%10;                //取余运算,求得各位数字

  WriteAddress(0x44);   //写显示地址,将十位数字显示在第2行第5列

        WriteData(digit[i]);  //将十位数字的字符常量写入LCD

        WriteData(digit[j]);  //将个位数字的字符常量写入LCD


}

/*==================================================

函数功能:显示分钟、调整分钟时间                           

==================================================*/

void DisplayMinute()

{

  unsigned char i,j;

  i=m/10;                //取整运算,求得十位数字

        j=m%10;                //取余运算,求得各位数字

                if(k3==0)             //按钮k3按下时

[1] [2]
关键字:51单片机  可调数字时钟  定时器  中断方式 引用地址:基于51单片机的可调数字时钟程序

上一篇:基于单片机的带温度显示的电子钟
下一篇:温湿度传感器sht20 STC15单片机驱动程序

推荐阅读最新更新时间:2024-11-03 19:23

mc9s12dg128使用定时器的输出比较产生定时中断代码亮1S灭1S
#include hidef.h /* common defines and macros */ #include mc9s12dg128.h /* derivative information */ #pragma LINK_INFO DERIVATIVE mc9s12dg128b unsigned int i; void main(void) { DDRB=0XFF;//PORTBÉ趨ΪÊä³ö PORTB=0XFF;//PORTB³õʼ»¯ÎªÈ«¸ß TSCR1=0x90;//¶¨Ê±Æ÷ʹÄÜÇÒTFLG1Äܱ»×Ô¶¯Çå³ý TSCR2=0x00;//¶¨Ê±Æ÷Ô¤·ÖƵÏ
[单片机]
51单片机: A/D 模数转换实验
51单片机: A/D 模数转换实验 一、实验内容 利用实验台上的0809做A/D转换实验,实验台上的W1电位器提供模拟量输入。编制程序,将模拟量转换成数字量。(要求模拟量由0809的IN2采集) 二、仿真图 三、代码 C语言实现: #include reg51.h #include absacc.h #define AD XBYTE //定义AD0808的地址 Y4(20) Y1(01) Y7(31) #define PA XBYTE //定义8255A中PA段的地址 #define PB XBYTE //定义8255A中PB段的地址 #define PC XBYTE
[单片机]
<font color='red'>51单片机</font>: A/D 模数转换实验
《手把手教你学51单片机-C语言版》之十五----实时时钟DS1302
在前面的课程中我们已经了解到了不少关于时钟的概念,比如我们用的单片机的主时钟是11.0592M、I2C总线有一条时钟信号线SCL等,这些时钟本质上都是一个某一频率的方波信号。那么除了这些在前面新学到的时钟概念外,还有一个我们早已熟悉的不能再熟悉的时钟概念 年-月-日 时:分:秒 ,就是我们的钟表和日历给出的时间,它的重要程度我想就不需要多说了吧,在单片机系统里我们把它称作实时时钟,以区别于前面提到的几种方波时钟信号。实时时钟,有时也被称作墙上时钟,很形象的一个名词,对吧,大家知道它们讲的一回事就行了。本章,我们将学习实时时钟的应用,有了它,你的单片机系统就能在漫漫历史长河中找到自己的时间定位啦,可以在指定时间干某件事,或者记
[单片机]
《手把手教你学<font color='red'>51单片机</font>-C语言版》之十五----实时时钟DS1302
51单片机控制RTL8019AS实现以太网通讯
摘要:介绍以太网的帧协议和以太网控制芯片RTL8019AS的结构特性;介绍51单片机控制RTL8019AS实现以太网通讯的硬件设计方案;采用C51语言实现ARP协议(地址解析协议),并进行了系统的调试与验证。 关键词:RTL8019AS Ethernet 51单片机 TCP/IP协议 互联网络硬件、软件的迅猛发展,使得网络用户呈指数增长,在使用计算机进行网络互联的同时,各种家电设备、仪器仪表以及工业生产中的数据采集与控制设备在逐步地走向网络化,以便共享网络中庞大的信息资源。在电子设备日趋网络化的背景下,利用廉价的51单片机来控制RTL8019AS实现以太网通讯具有十分重要的意义。 1 以太网(Ethernet)协议 一个标
[应用]
西门子S7系列的保持型接通延时定时器介绍
保持型接通延时定时器时序如下: 例3.2.4 STL语句表如下: A I 0.0 L S5T#2s 装入定时时间到ACCU1 SS T5 启动保持型延时接通定时器T5 A I 0.1 R T 5 定时器T5复位 A T 5 = Q 4.0 FBD 功能图如下: 时序图如下:
[嵌入式]
西门子S7系列的保持型接通延时<font color='red'>定时器</font>介绍
利用555定时器构成白光LED电压调节器的方法
本文以一个555定时器为主要器件构成电压调节电路(如图所示),用来控制一个或多个白光LED。定时器IC1与R1、R2、C2构成了可复位非稳态多谐振荡器。 首次输入电压V S 后,D1将使存储电容器C1充电直到其电压略低于V S 。最初,晶体管Q2处于截止状态,IC1的复位输入为高电平,输出端(OUTPUT)为高电平,以让电流能经过R1给C2充电。 这段时间内,R4拉动放电端(DISCHARGE)导通晶体管Q1,电感L1中的电流I L 开始斜线增大。由于Q1饱和,因此D3和LED都处于反向偏压状态。 当C2的电压超过IC1中管脚6的极限电压(THRESHOLD)时,输出端(OUTPUT)与放电端(DISCHARGE)都变为低电平
[工业控制]
89C2051单片机无线遥控电铃
如电路图所示。AC220V市电经降压、整流、滤波后,得到12V直流电压,再经稳压得到Sv直流电压,分别为继电器J1、89C2051单片机和315接收模块供电。 未 按遥控器的A键时,接收模块⑩脚没有指令信号输出,单片机Pl.0口的绿色指示灯Dl每隔0.5秒闪一下,Dl既作电源指示又作遥控指令信号。此时,如果 按下遥控器的A键,接收模块收到信号后从⑩脚输出高电平信号到单片机的P3.0口,单片机从P1.2口输出低电平,P1.1口输出高电平,令绿灯灭红灯 亮,同时经三极管Q1驱动继电器J1吸合,电铃响10秒后恢复初始状态。完整的程序清单如下(已通过调试)。
[单片机]
89C20<font color='red'>51单片机</font>无线遥控电铃
51单片机系统断电时的数据保护方法
在测量、控制等领域的应用中,常要求单片机内部和外部RAM中的数据在电源掉电时不丢失,重新加电时,RAM中的数据能够保存完好,这就要求对单片机系统加接掉电保护电路。掉电保护通常可采用以下三种方法:一是加接不间断电源,让整个系统在掉电时继续工作,二是采用备份电源,掉电后保护系统中全部或部分数据存储单元的内容;三是采用EEPROM来保存数据。由于第一种方法体积大、成本高,对单片机系统来说,不宜采用。第二种方法是根据实际需要,掉电时保存一些必要的数据,使系统在电源恢复后,能够继续执行程序,因而经济实用,故大量采用 。EEPROM既具有ROM掉电不丢失数据的特点,又有RAM随机读写的特点。但由于其读写速度与读写次数的限制,使得EEPRO
[单片机]
<font color='red'>51单片机</font>系统断电时的数据保护方法
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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