原创 【博客大赛】基于51单片机的电子时钟

2012-11-28 23:13 975 8 10 分类: MCU/ 嵌入式

/*-----------------------------------------------
需要先通过串口更新时间才能开始工作

读取ds1302信息直接显示到液晶屏上。有备用电池,断电后时间仍可以正常运行。
通过串口调试软件更新时间。更新方式如下
在发送栏填写时间信息,格式如下 2009071210102005 表示2009年7月12日 10点10分20秒 星期五,然后通过串口发送,硬件连接方式和
串口通信相同。注意中间不能有空格
  -----------------------------------------------*/
#include<reg52.h>
#include"ds1302.h"
#include"LCD1602.h"

sbit LACTCH1=P2^0;//锁存端口定义
sbit LACTCH2=P2^3;


bit SetFlag;      //更新时间标志位
unsigned char time_buf2[16];
void UART_Init(void)
{
    SCON  = 0x50;          /* SCON: mode 1, 8-bit UART, enable rcvr      */
    TMOD |= 0x20;               /* TMOD: timer 1, mode 2, 8-bit reload        */
    TH1   = 0xf3;                /* TH1:  reload value for 2400 baud @ 12MHz   */
    TR1   = 1;                  /* TR1:  timer 1 run                          */
    EA    = 1;                  /*打开总中断*/
    ES    = 1;                  /*打开串口中断*/

}
void main()
{
 unsigned char i;
 
 UART_Init();
 P0=0;       //取显示数据,屏蔽数码管显示
 LACTCH1=1;  //锁存
 LACTCH1=0;
 
 P0=0;       //取段码
 LACTCH2=1;  // 锁存
 LACTCH2=0;
 
 ds1302_init(); /*DS302初始化函数*/
 //ds1302_write_time();
 InitLcd();     //初始化LCD
 DelayMs(15);   //延时用于稳定功能
 
 while(1)
 {
  ds1302_read_time();//读取时钟信息
  for(i=1;i<8;i++)
     TempData=time_buf1;
     disp();         //液晶显示时间信息
    //KeyPro();
    if(SetFlag)     //如果接收到串口信息则更新时钟
    {
   for(i=0;i<8;i++)
   {
     time_buf1=time_buf2[2*i]*10+time_buf2[2*i+1];//数据整合,如2个数 1和5整合成15
   }
   ds1302_write_time();
   SetFlag=0;     //时钟信息更新后标志位清零
    }
 }
  }

/******************************************************************/
/*                  串口中断程序                                  */
/******************************************************************/
void UART_SER (void) interrupt 4 //串行中断服务程序
{
    unsigned char Temp;          //定义临时变量
   
    unsigned char i;
   if(RI)                        //判断是接收中断产生
     {
   RI=0;                      //标志位清零
   Temp=SBUF;                 //读入缓冲区的值
   time_buf2=Temp&0x0F;
   i++;
   if(i==16)                  //连续接收16个字符信息
    {
     i=0;
  SetFlag=1;               //接收完成标志位置1
    }
      SBUF=Temp; //把接收到的值再发回电脑端
   //P1=Temp&0x0F; //调试时候显示
  }
   if(TI)  //如果是发送标志位,清零
     TI=0;
}

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户1171929 2012-12-16 20:45

很实用。

用户412802 2012-11-28 23:06

我发了怎么没内容,,,,

用户403664 2012-11-28 16:44

几个意思啊~
相关推荐阅读
用户412802 2013-10-11 21:26
【博客大赛】AD9834,高性能信号发生器的选择
  AD9834简介 AD9834是一款75 MHz、低功耗DDS器件,能够产生高性能正弦波和三角波输出。其片内还集成一个比较器,支持产生方波以用于时钟发生。当供电电压为3 V时,其功耗仅...
用户412802 2013-04-22 16:47
想学就学,EDN助你一臂之力!拿板子参加嵌入式主题大赛
  就这几个月入门进阶FPGA,边参加嵌入式主题大赛,边学习FPGA!加入FPGA入门小组一起学!       新手快来,原理有文档文档介绍,网友在完成此次的基础上,可尽情发挥,重在学习领...
用户412802 2013-02-19 10:55
ouryk回来,活动继续
最近一直忙着其他事情,小组等活动暂停了,不过现在回来了,继续完成承诺,给以最大优惠奉献大家,欢迎关注我的小组 我爱单片机...
用户412802 2013-01-12 17:09
2013的我们
2013的我们该怎么生活,技术路线,职业生涯,希望大家一起好好讨论下...
用户412802 2012-12-11 13:11
【告别2012】我们一起破2012还继续,奋斗着,学习着
2012即将结束,拿出手上的资源,让利给大家 单片机200 包邮价格 带液晶屏 http://item.taobao.com/item.htm?spm=a1z10.3.0.76.3bpjHq&...
用户412802 2012-11-30 08:53
【博客大赛】DIY个性时钟与温度计
   学了51,你可以自己diy个性时钟与温度计,让你的东西与众不同,让同学们羡慕去吧 [注:AT89S52使用12M晶振]======================================...
EE直播间
更多
我要评论
2
8
关闭 站长推荐上一条 /3 下一条