基于51单片机定时器的的电子时钟

发布者:幸福自在最新更新时间:2012-09-14 来源: 51hei关键字:51单片机  定时器的  电子时钟 手机看文章 扫描二维码
随时随地手机看文章

1、可以显示星期和时间的电子1602液晶电子时钟
2、但没有调整时间的子程序,谁会调整时间的子程序,可以完善。
3. 液晶的端口大家可按你自己的电路随便修改就在程序的上部
4. 此程序在51hei单片机开发板上测试成功全部的代码及头文件
   下载地址:http://www.51hei.com/ziliao/51hei-5/电子时钟+1602液晶.rar

#include 
#include "51hei.h"
#define uchar unsigned char
sbit RW=P2^7;
sbit RS=P3^5;
sbit E=P3^4;
sbit duan=P2^6;
bit at=0;
//sbit busy_bit=P1^7;
uchar code shen[]={"I love you!!"};
uchar code word[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,
0x39,0x3a,0x20,0x2d,0x00,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07};
uchar code ri[]={0x1f,0x19,0x19,0x1f,0x19,0x19,0x1f,0x00}; //自定义符号 :周日 
uchar code yi[]={0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x00};/*自定义符号:周一 */ 
uchar code er[]={0x00,0x00,0x0e,0x00,0x1f,0x00,0x00,0x00};/*自定义符号: 周二2*/ 
uchar code san[]={0x00,0x1f,0x00,0x0e,0x00,0x1f,0x00,0x00};/*自定义符号: 周三2*/ 
uchar code si[]={0x00,0x1f,0x1a,0x1a,0x11,0x11,0x00,0x00}; //自定义符号 :周四   
uchar code wu[]={0x00,0x1f,0x08,0x1f,0x09,0x1f,0x00,0x00}; //自定义符号 :周五 
uchar code liu[]={0x08,0x04,0x1f,0x0a,0x11,0x10,0x00,0x00}; //自定义符号 :周五 
uchar dispbuf[10],ri1,h,m,s,counter;

 

void delay()
{
  uchar i;
 for(i=0;i<255;i++);
}

 

/*******写命令**********/
void lcd_wmc(uchar i)
{

  P0=i;
  RS=0;
  RW=0;
  E=0;
  delay();
  E=1;
}

 

/*******写数据***********/

void lcd_wmd(uchar i)
{

  P0=i;
  RS=1;
  RW=0;
  E=0;
  delay();
  E=1;
}

 


/*******初始化液晶*******/
void lcd_init()
{
  uchar i;
  lcd_wmc(0x01);
  lcd_wmc(0x38);  //功能设置指令-5    显示模式设置:16×2显示,5×7点阵,
8位数据接口
  lcd_wmc(0x0c); // 显示开关控制指令 0x0c--显示功能开无光标,即光标不闪烁。
00x0f--显示功能开,有光标并闪烁
  lcd_wmc(0x06);   //显示模式设置:光标右移,字符不移   输入模式设置指令 -3 
                  
  lcd_wmc(0x82);  // 0xc9 =0x80 | 0x49    设置DDRAM地址指令--8   
PPt第8    ox82=0x80|0x02 
  for(i=0;i<12;i++)
  lcd_wmd(shen[i]);    //显示 I  love you !! 字符串                    
  lcd_wmc(0xc0);
 
}

 

 

/*******更新缓冲区子程序*******/
void newbuf()
{
 dispbuf[0]=s%10;
 dispbuf[1]=s/10;
 dispbuf[3]=m%10;
 dispbuf[4]=m/10;
 dispbuf[6]=h%10;
 dispbuf[7]=h/10;
 dispbuf[9]=ri+13;
}

 

/*******显示子程序**********/
void disp(uchar dispadd)
{
   uchar tmp;    //定义 一个uchar 变量 
   lcd_wmc(dispadd);     // 调用 写指令 函数 把DDRAM 地址 指令写进

  
   tmp=dispbuf[9];    //星期             //以下同理 
   tmp=word[tmp];
   lcd_wmd(tmp);

   tmp=dispbuf[8];
   tmp=word[tmp];     
   lcd_wmd(tmp);

 

   tmp=dispbuf[7];    //第2行 把值赋给 tmp 
   tmp=word[tmp];    //把要显示的 数 给tmp 
   lcd_wmd(tmp);      //写数据 函数 把要显示的数字 显示在显示屏上 

   tmp=dispbuf[6];                 //以下同理 
   tmp=word[tmp];
   lcd_wmd(tmp);

   tmp=dispbuf[5];
   tmp=word[tmp];     
   lcd_wmd(tmp);

   tmp=dispbuf[4];
   tmp=word[tmp];
   lcd_wmd(tmp);          //分钟 

   tmp=dispbuf[3];
   tmp=word[tmp];     
   lcd_wmd(tmp);

   tmp=dispbuf[2];              //显示 是两个点 在闪烁 
   tmp=word[tmp];
   lcd_wmd(tmp);

   tmp=dispbuf[1];
   tmp=word[tmp];       //秒 
   lcd_wmd(tmp);

   tmp=dispbuf[0];
   tmp=word[tmp];
   lcd_wmd(tmp); 
}
 

 

/*********************初始化子程序**********************/
void init()
{

  TMOD=0x01;
  TH0=0x4c;
  TL0=0x00;
  EA=1;
  ET0=1;
  TR0=1;
  counter=0;
  h=23;m=59;s=0;
  ri1=6;
  dispbuf[2]=10;
  dispbuf[5]=10;
  dispbuf[8]=12;
}

 

 

 

/***************************主程序************************/

void main(void)
{ guanled();
  guandz();
  init();
  lcd_init();

  while(1)
  {
   if(!at)
 {
     //闪烁
      if(counter<10)        
      {
       dispbuf[2]=10;
       dispbuf[5]=10;
      }
      else
      {            
       dispbuf[2]=11;
       dispbuf[5]=11;
      }
      //更新显示缓冲区及调用显示程序
      if(counter==0)
      {
       newbuf();
       disp(0xc4);
       }
      else if(counter==10)
      disp(0xc4);  
    }
   }
}

 

 

 


/*************************定时器0的中断**********************/
void Time0() interrupt 1 using 2    //再次强调中断子程序执行时间越短越好
{
  TH0=(65536-46075)/256;
  TL0=(65536-46075)%256;
  counter++;
  if(counter==20)
  {
    s++;
  counter=0;
  if(s==60)
  { 
    m++;
    s=0;
      if(m==60)
    {
      h++;
    m=0;
    if(h==24)
     h=0;
  ri1++;
    if(ri1==7)
       { 
     ri1=0;
    }
         }
       }

  }
}
关键字:51单片机  定时器的  电子时钟 引用地址:基于51单片机定时器的的电子时钟

上一篇:红外线数据通信实验
下一篇:4位共阳数码管动态扫描显示汇编程序

推荐阅读最新更新时间:2024-03-16 13:08

51单片机与递归问题
在C51中,中断和非中断函数调用同一个函数报警就是RECURSIVE CALL TO FUNCTION。 标准C语言是在堆栈中动态生成局部变量空间,所以可以递归的。 51单片机太弱了,为了提高运行效率,C51采用静态分配局部变量的方式,所以不可递归。 被中断和非中断函数调用的函数,如果在非中断状态运行,发生中断后,局部变量被破坏,中断结束后再执行就完全错误了,这个跟不能递归的原理是一样的,所以Keil也把他列为RECURSIVE CALL TO FUNCTION。 解决方式:在这个公用的函数加reentrant修饰为可重入的。
[单片机]
51单片机简易波形发生器(正弦波 锯齿波 三角波)
下面是51单片机简易波形发生器源程序: #include AT89X52.h #include math.h #define ADDR1 0x2c //MAX5820LEUA sbit key_sin=P1^0; sbit key_tran=P1^2; sbit key_tooth=P1^4; sbit SCL = P2 ^ 0; sbit SDA = P2 ^ 1; unsigned char code sin = //正弦表 { 0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
[单片机]
<font color='red'>51单片机</font>简易波形发生器(正弦波 锯齿波 三角波)
基于51单片机智能小车系统设计
原理图: 程序运行图: 部分程序: /******************************************************************************* * 文件名称:main.c * 说明:本文件为小车控制的主函数 * 功能:1.看门狗定时器初始化 2.调用函数,进行小车直流电机的开环控制 *******************************************************************************/ #include AT89X52.h #include kongzhi.h /********************
[单片机]
8051单片机教程第二课:单片机内部、外部结构(一)
一、单片机的外部结构 拿到一块芯片,想要使用它,首先必须要知道怎样连线,我们用的一块称之为89C51的芯片,下面我们就看一下如何给它连线。1、电源:这当然是必不可少的了。单片机使用的是5V电源,其中正极接40引脚,负极(地)接20引脚。2、振蒎电路:单片机是一种时序电路,必须提供脉冲信号才能正常工作,在单片机内部已集成了振荡器,使用晶体振荡器,接18、19脚。只要买来晶振,电容,连上就可以了,按图1接上即可。3、复位引脚:按图1中画法连好,至于复位是何含义及为何需要复要复位,在单片机功能中介绍。4、EA引脚:EA引脚接到正电源端。至此,一个单片机就接好,通上电,单片机就开始工作了。 我们的第一个任务是要用单片机点亮一只发光二极
[单片机]
80<font color='red'>51单片机</font>教程第二课:单片机<font color='red'>的</font>内部、外部结构(一)
基于51单片机孵化环境温湿度监控系统设计
实现功能: 1、对孵化环境的温度、湿度进行监控 2、可以警报提示、修改温度、湿度上下限值 3、led灯指示报警温湿度信息、LCD显示相关信息 电路原理图: 部分程序: #include reg52.h #include intrins.h typedef unsigned char uint8; typedef unsigned int uint16; sbit rs=P2^6; // 数据命令选择 sbit rw=P2^5; //读写选择 sbit e=P2^7; //使能 sbit k1=P3^3; //模式 sbit k2=P2^1; //加 sbit k3=P2^2; //减 sbit DHT11
[单片机]
简易数字存储示波器设计
摘要:随着电子通信以及教学事业的发展,示波器的应用越来越广泛,它在教学中所起到的作用越来越重要,示波器可以测量信号的幅度,频率以及波形等等,但是高精度的示波器非常昂贵,对于非盈利事业的教学组织来说无疑不合适,所以提出了一种以单片机为控制核心的简易示波器设计方案。它由前向控制部分,数据采集和存储部分,51单片机控制部分以及按键和MS12864R显示部分组成。 传统意义上的模拟示波器虽然功能较全,但是价格昂贵,体积大、重量重、成本高、等一系列问题使应用受到了限制。对于大多数学生以及教学组织来说,利用示波器主要是进行一些理论性的测试与实验,高精度高成本示波器的作用不是很必要,为此,笔者提出了一种便携式数字存储示波器的设计,它采用了L
[单片机]
简易数字存储示波器<font color='red'>的</font>设计
51单片机一起学汇编—BCD调整 数据处理
/***********BCD调整**************/ ORG 0000H JMP START START: MOV SP,#7FH ;设置堆栈地址 MOV 50H,#69H ;十六机制立即数69H 载人地址为50H寄存器中 MOV R3,50H ;运行DEBUG时 在R2中查看数据 MOV R0,#60H ;十六机制立即数60H 载人R0寄存器中 MOV A,50H ;地址为50H寄存器中的数据 载人累加器ACC中 ANL A,#0F0H ;累加器ACC中的高四位数据和十六进制的立即数 F0H 逻辑 与 运算 MOV @R0,A ;
[单片机]
三线制Microware同步串行EEPROM在MCS-51单片机
1三线制Microware串行总线   三线制Microware同步串行总线接口是松下半导体公司在其生产的COP系列和HPC系列微控制器上采用的一种串行总线。它使用的三根信号线是数据输入线SI、数据输出线SO和时钟信号线SK。由于三线制Microware总线只需3~4根数据线和控制线即可扩展具有三线制Microware总线的各种I/O器件,而并行总线扩展方法要8根数据线、8~16根地址线和2~3位控制线,因而使用三线制Microware串行总线可以简化电路设计,提高设计的可靠性。 2具有三线制Microware总线的EEPROM   EEPROM是一种可用电气方法在线擦除和再编程的只读存储器,它既有RAM在联机操作中可读可改写的特性
[单片机]
三线制Microware同步串行EEPROM在MCS-<font color='red'>51单片机</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

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

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