单片机定时器实现实时时钟程序-lcd1602显示

发布者:huijiazi5210最新更新时间:2015-04-30 来源: 51hei关键字:单片机  定时器  实时时钟  lcd1602显示 手机看文章 扫描二维码
随时随地手机看文章
本程序所用的原理图下载: http://www.51hei.com/f/HL-1V6.5.pdf ,单片机芯片使用的stc89c52;找到1602液晶部分的原理图即可.这是一张单片机开发板的整体图.

下面是程序的源代码:

/**
*功能:在LCD1602上显示当前时间(Time)和日期(Date)
*      自动计时,可计时年月日(包括平年和闰年)
*    可用按键调整时间和日期
* L  *****************************
* C  * Time: 00  Date:        *
* D  * 00:00  2013-06-05   *
*    ******************************
*作者:徐冉      
*日期:2013-06-05-19:10-22:50~2013-06-06-07:20-10:20
*备注:此程序已经通过调试,已做修改。耗时:5小时30分钟
**/
/****************AT89C52-RC MCU******************************/
/********************51hei单片机实验板****************************/
#include
typedef unsigned int uint;
typedef unsigned char uchar;
sbit RS = P1^0;
sbit RW = P1^1;
sbit EN = P2^5;
sbit wela = P2^7;
sbit dula = P2^6;
sbit BUSY = P0^7;
sbit FM = P2^3;
uchar counter,tshi, tfen, tmiao;
uchar sshi, sge, fshi, fge, mshi, mge;
uint nian;
uchar yue, ri;
uchar nqian, nbai, nshi, nge, yshi, yge, rshi, rge;
uchar code time[] = "Time:";
uchar code date[] = "Date:";
//delay:xms
void delay(uint xms)
{
 uchar i, j;
 for(i = 0; i < xms; i++)
   for(j = 0; j < 125; j++);
}
//wait:
void wait()
{
 P0 = 0xff;
 RS = 0;
 RW = 1;
 EN = 0;
 EN = 1;
 while(BUSY == 1);
 EN = 0;
}
//write:cmd
void write_cmd(uchar cmd)
{
 wait(); //写数据和命令时,必须进行判忙等待!!!
 RS = 0;
 RW = 0;
 EN = 0;
 P0 = cmd;
 EN = 1;
 EN = 0; 
}
//write:data
void write_data(uchar dat)

 wait();//写入数据之前必须进行判忙等待,否则数据将写入不成功!!!
 RS = 1;
 RW = 0;
 EN = 0;
 P0 = dat;
 EN = 1;
 EN = 0;
}
//LCD1602:init
void init()
{
 nian = 2013;
 yue = 6;
 ri = 5;
 wela = 0;
 dula = 0;
 P1 = 0xff;
 delay(10);
 write_cmd(0x38);
 delay(5);
 write_cmd(0x38);
 delay(5);
 write_cmd(0x38);
 wait();
 write_cmd(0x38);
 wait();
 write_cmd(0x0c);
 wait();
 write_cmd(0x06);
 wait();
 write_cmd(0x01); 
}
//timer1:init
void timer1_init()
{
 TMOD = 0x10;
 TH1 = 0xB8;
 TL1 = 0x00;
 TR1 = 1;
 EA = 1;
 ET1 = 1;
 
}
//write:byteaddress
void write_pos(uchar add)
{
 write_cmd(add | 0x80);
}
//write:string
void send_string(uchar *str)
{
 while(*str != '')
 {
  write_data(*str++);
 }
}
//dis:date
void dates()
{
 nqian = nian / 1000 % 10;
 nbai = nian / 100 % 10;
 nshi = nian / 10 % 10;
 nge = nian % 10;
 yshi = yue / 10 % 10;
 yge = yue % 10;
 rshi = ri / 10 % 10;
 rge = ri % 10;
 write_pos(0x00);
 send_string(time);
 write_pos(0x09);
 send_string(date);
 write_pos(0x46);
 write_data(nqian + 0x30);
 write_pos(0x47);
 write_data(nbai + 0x30);
 write_pos(0x48);
 write_data(nshi + 0x30);
 write_pos(0x49);
 write_data(nge + 0x30);
 write_pos(0x4A);
 write_data('-');
 write_pos(0x4B);
 write_data(yshi + 0x30);
 write_pos(0x4C);
 write_data(yge + 0x30);
 write_pos(0x4D);
 write_data('-');
 write_pos(0x4E);
 write_data(rshi + 0x30);
 write_pos(0x4F);
 write_data(rge + 0x30);   
}
//dis:time
void times()
{
 sshi = tshi / 10 % 10;
 sge = tshi % 10;
 fshi = tfen / 10 % 10;
 fge = tfen % 10;
 mshi = tmiao / 10 % 10;
 mge = tmiao % 10;
 write_pos(0x40);
 write_data(sshi + 0x30);
 write_pos(0x41);
 write_data(sge + 0x30);
 write_pos(0x43);
 write_data(fshi + 0x30);
 write_pos(0x44);
 write_data(fge + 0x30);
 write_pos(0x06);
 write_data(mshi + 0x30);
 write_pos(0x07);
 write_data(mge + 0x30);
}
//keyscan:
void marixKeyscan()
{
 uchar temp;
 
 P3 = 0xfe;
 temp = P3;
 temp &= 0xf0;
 if(temp != 0xf0)
 {
  delay(5);
  temp = P3;
  temp &= 0xf0;
  if(temp != 0xf0)
  {
   FM = 0;
   temp = P3;
   switch(temp)
   {
    case 0xee: tshi++; if(tshi >= 24) tshi = 0; break;
    case 0xde: tfen++; if(tfen >= 60) tfen = 0; break;
    case 0xbe: nian++; if(nian >= 10000) nian = 0; break;
    case 0x7e: yue++; if(yue >= 13) yue = 1; break;
   }
   while(temp != 0xf0)
   {
    temp = P3;
    temp &= 0xf0;
   }
   delay(2);
   while(temp != 0xf0)
   {
    temp = P3;
    temp &= 0xf0;
   }
   FM = 1;
  }
 }
 [page]
 P3 = 0xfd;
 temp = P3;
 temp &= 0xf0;
 if(temp != 0xf0)
 {
  delay(5);
  temp = P3;
  temp &= 0xf0;
  if(temp != 0xf0)
  {
   FM = 0;
   temp = P3;
   switch(temp)
   {
    case 0xed: ri++; if(yue == 1 || yue == 3 || yue == 5 || yue == 7 || yue == 8 || yue == 10 || yue == 12 )
         {
          if(ri >= 32)
          {
           ri = 1;
          }
         }
         if(yue == 4 || yue == 6 || yue == 9 || yue == 11)
         {
          if(ri >= 31)
          {
           ri = 1;
          }
         }
         if(yue == 2)
         {
          if(((nian % 4 == 0) && (nian % 100) != 0) || (nian % 400 == 0))
          {
           if(ri >= 30)
           {
            ri = 1;
           } 
          }
          else
          {
           if(ri >= 29)
           {
            ri = 1;
           }
          }
         }
         break;
     case 0xdd: tshi--; if(tshi <= 0) {tshi = 23;} break;
     case 0xbd: tfen--; if(tfen <= 0) {tfen = 59;} break;
     case 0x7d: nian--; if(nian <= 0) {nian = 10000;} break;
   }
   while(temp != 0xf0)
   {
    temp = P3;
    temp &= 0xf0;
   }
   delay(2);
   while(temp != 0xf0)
   {
    temp = P3;
    temp &= 0xf0;
   }
   FM = 1;
  }
 }
 
 P3 = 0xfb;
 temp = P3;
 temp &= 0xf0;
 if(temp != 0xf0)
 {
  delay(5);
  temp = P3;
  temp &= 0xf0;
  if(temp != 0xf0)
  {
   FM = 0;
   temp = P3;
   switch(temp)
   {
    case 0xeb:
      ri--;
      if(yue == 1 || yue == 3 || yue == 5 || yue == 7 || yue == 8 || yue == 10 || yue == 12 )
      {
       if(ri <= 0)
       {
        ri = 31;
       }
      }
      if(yue == 4 || yue == 6 || yue == 9 || yue == 11)
      {
       if(ri <= 0)
       {
        ri = 30;
       }
      }
      if(yue == 2)
      {
       if(((nian % 4 == 0) && (nian % 100) != 0) || (nian % 400 == 0))
       {
        if(ri <= 0)
        {
         ri = 29;
        } 
       }
       else
       {
        if(ri <= 0)
        {
         ri = 28;
        }
       }
       break;
     case 0xdb:  tshi = 0;
        tfen = 0;
        tmiao = 0;
     
        nian = 0;
        yue = 1;
        ri = 1;
        break;
   }
   while(temp != 0xf0)
   {
    temp = P3;
    temp &= 0xf0;
   }
   delay(2);
   while(temp != 0xf0)
   {
    temp = P3;
    temp &= 0xf0;
   }
  }
      FM = 1; 
 }
  }
}
//main:
void main(void)
{
 init();
 timer1_init();
 write_pos(0x42);
 write_data(':');
 write_pos(0x06);
 write_data('-');
 while(1)
 { 
  times();
  dates();
  marixKeyscan();
  if(counter == 50)
  {
   counter = 0;
   tmiao++;
   if(tmiao >= 60)
   {
    tmiao = 0;
    tfen++;
    if(tfen >= 60)
    {
      tfen = 0;
      tshi++;
      if(tshi >= 24)
      {
       tshi = 0;
       ri++;
        switch(yue)
        {
         case 1:
         case 3:
         case 5:
         case 7:
         case 8:
         case 10:
         case 12: if(ri >= 32)
               {
             ri = 1;
                yue++;
            }
            break;
         case 4:
         case 6:
         case 9:
         case 11:   if(ri >= 31)
              {
              ri = 1;
              yue++;
              }
              break;
         case 2: if(((nian % 4 ) == 0 && (nian % 100) != 0) || (nian % 400 == 0))
            {
             if(ri >= 30)
             {
              ri = 1;
              yue++;
             }
            }
            else
            {
             if(ri >= 29)
             {
              ri = 1;
              yue++;
             }
            }
            break;
         default: break;
        }
         if(yue >= 13)
         {
           yue = 1;
          nian++;
          if(nian >= 10000)
          {
           nian = 0;
          }
         
         }
          }
           }
        }
       }
    } 
}
//timr1:int
void timer1_int() interrupt 3
{
 TH1 = 0xB8;
 TL1 = 0x00;
 counter++;
}

关键字:单片机  定时器  实时时钟  lcd1602显示 引用地址:单片机定时器实现实时时钟程序-lcd1602显示

上一篇:单片机产生占空比可调方波(PWM)
下一篇:单片机程序-点阵LED显示I LVOE U

推荐阅读最新更新时间:2024-03-16 14:00

复位电路的几种设计
复位源是导致单片机内部复位操作的源泉,大致可分为七种:上电复位(POR)﹑人工复位(MRST)﹑电源欠电压复位(LVR)﹑看门狗复位(WDR)﹑软件复位(SWR)﹑软硬件复位(SHR)﹑和非法地址复位(IAR)。 一﹑上电复位电路 上电复位的实质是上电延时复位,也就是在上电延时期间把CPU锁定在复位状态上,就是为了弥补由于电源滤波电容存在使单片机电源由低到高逐渐上升的时间。如下图示就是利用RC支路的充电时间而形成的常用的上电复位电路。 在每次单片机断电之后,应使延时电容C上的电荷立刻放掉,以便重新作好延时准备,为随后可能在很短时间内再次加电面作好准备。否则,在断电后C内还没有充分放电的情况下,如果很快又加电,RC支路就失去了
[单片机]
复位电路的几种设计
单片机控制数显“消屏”算是的探讨
在众多的数控、数显智能化器件中,很大一部分是没日没液、长年累月地工作着的(如电力部门的智能路灯钟控器、干式变压器中的智能温控仪等),这样对数字显示部件尤其刺能耗较大手工艺LED数码管的使用寿命就有很大影响。本文运用单片机的软件处理,实现类似于微电脑PC机的“静屏”功能——经一设定时间后自动 “消屏”,从而延长了数据管等的使用寿命。在“消屏”期间,数码管(包括指示灯中的几个或全部)虽然不亮了,但系统监察信号的输入和控制开关量的输出等依然照常进行——所有功能保护不变,只要按动一个任一个输入键,数码管及指示灯就会恢复显示(显示当前应有的即时信息)。 1 “消屏”的实现 一般来讲用单片机处理的显示器件大多数是以循环扫描的方式进
[单片机]
<font color='red'>单片机</font>控制数显“消屏”算是的探讨
基于单片机控制的六自由度自动寻迹机械人的设计与实现
当代科学技术发展的特点之一就是机械技术,电子技术和信息技术的结合,机器人就是这种结合的产物之一。现代机器人都是由机械发展而来。与传统的机器的区别在于,机器人有计算机控制系统,因而有一定的智能,人类可以编制动作程序,使它们完成各种不同的动作。六自由度自动寻迹搬运机器人就是其中一种,这种搬运机器人不但能够代替人的某些功能,有时还能超过人的体力能力,可以24小时甚至 更长时间连续重复运转,还可以承受各种恶劣环境,因此,搬运机器人是人体局部功能的延长和发展。 本设计主要应用单片机MSP430作为控制核心,直流电机、热释电型红外传感器等相结合的系统。它充分发挥了单片机的性能,其优点硬件电路简单,软件功能完善,控制系统可靠,性价比较高等特
[单片机]
基于<font color='red'>单片机</font>控制的六自由度自动寻迹机械人的设计与实现
PIC16单片机看门狗的使用
#include htc.h __CONFIG(0xFF36); #define u8 unsigned char #define u16 unsigned int #define CLRWDT() asm( clrwdt ) void delay(u16 ms) { int i,j; for(i=0;i ms;i++) for(j=0;j 71;j++); } void port_init() { TRISD=0x00; PORTD=0xFF; } void watch_init() { PSA=1; //分频器给看门狗 PS2=1; //1:64,18ms*64≈1156 PS1=
[单片机]
单片机软件抗干扰的几种常见方法
1、软件抗干扰方法的研究 在工程实践中,软件抗干扰研究的内容主要是:一、消除模拟输入信号的噪声(如数字滤波技术);二、程序运行混乱时使程序重入正轨的方法。本文针对后者提出了几种有效的软件抗干扰方法。 1.1 指令冗余 CPU取指令过程是先取操作码,再取操作数。当PC受干扰出现错误,程序便脱离正常轨道“乱飞”,当乱飞到某双字节指令,若取指令时刻落在操作数上,误将操作数当作操作码,程序将出错。若“飞”到了三字节指令,出错机率更大。 在关键地方人为插入一些单字节指令,或将有效单字节指令重写称为指令冗余。通常是在双字节指令和三字节指令后插入两个字节以上的NOP。这样即使乱飞程序飞到操作数上,由于空操作指令NOP的存在,避免
[单片机]
TI MSP430 F22xx系列混合信号微控制器的特性及应用方案
TI公司的MSP430 F22xx系列是超低功耗混合信号微控制器,集成了两个16位计时器,通用串行通信接口,10位ADC和基准电压源以及数据传输控制器(DTC),两个通用运放。器件工作电压1.8V-3.6V,1 MHz,2.2 V工作模式的功率为270uA,可重复存储为0.7uA,主要用于手持设备。此处介绍了MSP430F22xx主要特性,功能方框图,以及EZ430-TMS37157无线RFID开发套件主要特性,EZ430-RF USB调试接口电路图,EZ430-TMS37157板目标电路图产品RFID状语从句:基站电路图等。 德州仪器(TI)MSP430超低功耗微控制器系列由几款器件组成,这些器件具有针对各种应用的不同外设集
[单片机]
TI MSP430 F22xx系列混合信号<font color='red'>微控制器</font>的特性及应用方案
基于51单片机的出租车计价器的设计
引言 在科学技术和经济水平快速发展的21世纪,乘坐出租车和网约车出行已经成为一种非常重要的交通出行方式。行业的转型发展让出租车行业迎来了一场新纪元。但是在出租车行业迅速发展的同时,也出现了很多问题。经营管理不善,司机服务不规范,随意定价收款的现象也是层出不穷。为了根治这种现象,出租车计价器孕育而生。出租车计价器的问世不仅减少了行业的乱象,而且让管理者和经营者更加诚信的服务乘客,在很大程度上改善了行业风气。 但是目前国内广泛使用的出租车计价器功能单一,不能满足人们的需求,人们更致力于一种功能齐全,生产成本低的出租车计价器。伴随着科技水平的提高,出租车计价器也迎来了新的变革,这时第二代出租车计价器问世了。 设计选用宏晶公司生产的STC
[单片机]
基于AT90S8515单片机的瞬变信号捕获与存储器
    摘要: 介绍一种基于AT90S8515单片机的瞬变信号捕获与存储器。利用该单片机的高速性能,实现与高速A/D的连接,并将捕获信号由X轴、Y轴输出,显示在CRT上,同时实现数据的串口输出。     关键词: AT90S8515单片机 瞬变信号 捕获与存储 当代科学研究的许多领域中,常会遇到如何捕捉单次瞬变信号的问题。对于单脉冲信号捕获、周期信号频谱分析等高速数据采集系统,通常都采用DMA技术实现。不论是由PC机内的DMA控制器芯片实现,还是由单片机结合DMA技术实现,其系统结构都比较复杂;若采用通用DSP芯片开发该类仪器仪表,造价过高。故此,研制电路简单、实用廉价的高速数据采集系统是很必要的。本瞬变信号捕
[缓冲存储]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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