找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11538|回复: 11
打印 上一主题 下一主题
收起左侧

51单片机实时时钟程序

  [复制链接]
跳转到指定楼层
楼主
ID:96742 发表于 2015-12-1 21:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
原理图在7楼!!!!
#include<reg52.h>
#define uint unsigned int  
#define uchar unsigned char
bit write=0;         //写2402的标志
sbit scl=P2^1;                         //IC总线的位置
sbit sda=P2^0;
sbit RST=P2^5;   
sbit CS_DA =P2^4 ;  
sbit lcden=P2^5;                        //LCD使能端
sbit lcdrd=P1^0;                        //数据命令选择端
sbit lcdwr=P1^1;                         //读写选端
uchar n,m;
char miao,shi,fen;
sbit k1=P3^4;                                   //开关的位置
sbit k2=P3^5;
sbit k3=P3^6;
sbit beep=P2^3;                                  //蜂鸣器的位置
uchar code t[]="2015-11-01 sun";  //时间
void delay()                                //延时函数
{;;}
void delays(uint x)                         //延时函数2
{ uint i,j;
for(i=0;i<x;i++)
for(j=0;j<115;j++);
  }                                                         //延时X*MS
void start()                                 //启动信号
{ sda=1;
  delay();
  scl=1;                                           //SCL高电平
  delay();
  sda=0;                                          //SDA下降沿的时候
  delay();
   }
void stop()                                         //停止信号
{ sda=0;
  delay();
  scl=1;
  delay();
  sda=1;
  delay();
    }
void respons()                                         //应答信号
{ uchar i;
scl=1;
delay();
while((sda==1)&&(i<250))
i++;
scl=0;                                                         //低电平应该成功
delay();
   }
void init()                                                //初始化24C16芯片
{
   RST=0;   
CS_DA =0 ;  
sda=1;
  delay();
  scl=1;
  delay();
   }
void write_byte(uchar date)                                        //写一个字符
{ uchar i,temp;
temp=date;
for(i=0;i<8;i++)
   {  temp=temp<<1;
   scl=0;
   delay();
   sda=CY;
   delay();
   scl=1;
   delay();
      }
   scl=0;
   delay();
   sda=1;
   delay();
   }
uchar read_byte()                                                 //读一个字符
{ uchar i,k;
        scl=0;
        delay();
        sda=1;
        delay();
        for(i=0;i<8;i++)
        { scl=1;
        delay();
        k=(k<<1)|sda;
        scl=0;
        delay();
  }
  return k;
   }
void write_add(uchar a,uchar date)                                   //指定地址写一个字符
{ start();                                                               
   write_byte(0xa0); //器件地址
   respons();
   write_byte(a);
   respons();
   write_byte(date);
   respons();
   stop();
    }
char read_add(uchar a)
{ uchar date;                                                                                  //指定地址读一个字符
   start();
   write_byte(0xa0);
   respons();
   write_byte(a);
   respons();
   start();
   write_byte(0xa1);
   respons();
   date=read_byte();
   stop();
   return date;
    }
void di()                                                //蜂鸣器函数
{  beep=0;
   delays(100);
   beep=1;
   }
void write_com(uchar com)                          //写命令函数
{ lcdrd=0;                                                           //选命令端
  P0=com;
  delays(5);
  lcden=1;
  delays(5);
  lcden=0;
   }
void write_date(uchar date)                          //写数据函数
{  lcdrd=1;                                                           //选择数据端
   P0=date;
   delays(5);
   lcden=1;
   delays(5);
   lcden=0;
   }
void write_sfm(uchar add,uchar date)                //写时分秒函数
{ uchar shi,ge;
shi=date/10;                                                 //分解一个2位数十位和个位
ge=date%10;
write_com(0x80+0x40+add);                          //设置显示位置
write_date(0x30+shi);                                        //送液晶显示十位

write_date(0x30+ge);                                        //送液晶显示个位
    }
void inits()                                                 //初始化函数
{ uchar a;
lcdrd=0;
lcden=0;
fen=0;                                                  //初始化分钟设置
miao=0;
shi=0;
n=0;
m=0;
init();
write_com(0x38);                  //设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c);                  //打开显示,不显示光标
write_com(0x06);                  //写一个字符后地址指针自动加1
write_com(0x01);                  //显示清0,数据指针清0
write_com(0x80);                  //显示初始值位置
for(a=0;a<14;a++)
{
    write_date(t[a]);
        delays(5);
        }
         write_com(0x80+0x40+6);
         write_date(':');                                 //写出时间的两个冒号
         delays(5);
         write_date(':');
         delays(5);
         write_com(0x80+0x40+9);           //
         write_date(':');
         delays(5);
         miao=read_add(1);                        //从AT24c16读取数据
         fen=read_add(2);
         shi=read_add(3);
         write_sfm(10,miao);                //分别送液晶显示
         write_sfm(7,fen);
         write_sfm(4,shi);
         TMOD=0x01;                                        //定时器0工作方式1
         TH0=(65536-45872)/256;
         TL0=(65536-45872)%256;
         EA=1;                                          //开启总中断
         ET0=1;                                           //开启中断
         TR0=1;                                                //开启定时器0
   }
void keyscan()                                           //开关函数
{ if(k1==0)
   { delays(10);                                   //去抖动
     if(k1==0)                                                //确认被按下
         { m++;
         while(!k1);                                 //等待按键释放
         di();
         if(m==1)                                        //第一次被按下
         {         TR0=0;
         write_com(0x80+0x40+10);                //光标定位到秒位置
         write_com(0x0f);                                //光标开始闪烁
             }
         if(m==2)                                                  //第二次按下光标闪烁到定位到分位置
         { write_com(0x80+0x40+7);
             }
          if(m==3)                                                 //第三次按下光标闪烁定位到小时位置
          {        write_com(0x80+0x40+4);
             }
          if(m==4)                                           //第四次被按下
          {        m=0;
           write_com(0x0c);
           TR0=1;
            }
            }
     }
   if(m!=0)                                                          //只有被按下后,才有增大和减小
   { if(k2==0)
    {
          delays(10);                                        //抖动
          if(k2==0)                                                //确认被按下
          {        while(!k2);
          di();                                                   //每按下按键蜂鸣器响一次
          if(m==1)
          {         miao++;                                        //秒加1
            if(miao==60)                                 //满60后清0
                miao=0;
                write_sfm(10,miao);                          //每调节一次送液晶显示一下
                write_com(0x80+0x40+10);           //显示位置重新回到调节处
                write_add(1,miao);                           //数据改变立即存入24C16
             }
          if(m==2)                                                   //第二次被按下
          {         fen++;                                                   //分加1
          if(fen==60)                                           //满60后 清0
          fen=0;
          write_sfm(7,fen);                                        //每调节一次送到液晶显示
          write_com(0x80+0x40+7);                         //显示回到调节处
          write_add(2,fen);                                         //改变的数据立即存入24C16
             }
        if(m==3)                                                         //第三次被按下
        { shi++;                                                        //小时加1
          if(shi==24)                                                //满24后清0
          shi=0;
          write_sfm(4,shi);                                        //每调节一次送液晶显示一次
          write_com(0x80+0x40+4);                        //显示位置重新回到调节处
          write_add(3,shi);                                        //改变的数据立即存取24C16
            }
             }
          }
  if(k3==0)
{ delays(10);                                                //去抖动
  if(k3==0)                                                        //确认被按下
  {        while(!k3);
    di();                                                         //第一次被按下秒减1
        if(m==1)
        {
             miao--;
          if(miao==-1)
           miao=59;
             write_sfm(10,miao);                   //每调节一次送液晶显示
                 write_com(0x80+0x40+10);                //显示位置重新回到调节处
                 write_add(1,miao);                                //数据改变立即存入24C16
                   }
           if(m==2)                                                   //第二次被按下分减1
           { fen--;
           if(fen==-1)
             fen=59;
                 write_sfm(7,fen);                                 //每调节一次送液晶显示
                 write_com(0x80+0x40+7);                   //显示位置重新回到调节处
                 write_add(2,fen);                                   //数据改变存入24C16
              }
          if(m==3)                                                          //第三次被按小时减1
          {shi--;
           if(shi==-1)
            shi=23;
                write_sfm(4,shi);                                  //每调节一次送液晶显示
                write_com(0x80+0x40+4);                          //显示位置重新回到调节处
                write_add(3,shi);                                   //数据改变立即存入24C16
                      }
                  }
          }
       }
    }
void main()                                                                  //主函数
{  lcdwr=0;
   inits();
while(1)
{ keyscan();
     }
   }
void time()interrupt 1                                  //定时器0中断服务
{  TH0=(65536-45872)/256;
   TL0=(65536-45872)%256;
   n++;
   if(n==20)                                                 //1秒到了
   {  n=0;
      miao++;                                                 //满60清0
          if(miao==60)
          {        miao=0;
          fen++;
          if(fen==60)                                   //满60清0
           {  fen=0;
               shi++;
                   if(shi==24)                           //满24清0
                   {  shi=0;
                      }
                write_sfm(4,shi);                        //小时变化则重新写入
                write_add(3,shi);                         //数据改变丽江存入24C16
              }
                write_sfm(7,fen);                   //分钟变化则重新写入
                write_add(2,fen);                        //数据改变立即存入24C16
             }
          write_sfm(10,miao);                   //秒变化则重新写入
          write_add(1,miao);                   //数据变化立即存入24C16
      }
   }

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的积分奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:76227 发表于 2015-12-1 22:25 | 只看该作者
你贴这么多程序在这里是分享  还是求助?
回复

使用道具 举报

板凳
ID:54731 发表于 2015-12-2 10:32 | 只看该作者
请问楼主:说明你编译实时时钟程序?还是问题?可以的话把图贴出来
回复

使用道具 举报

地板
ID:96742 发表于 2015-12-4 18:29 | 只看该作者
905377346 发表于 2015-12-1 22:25
你贴这么多程序在这里是分享  还是求助?

当然是分享了。
回复

使用道具 举报

5#
ID:96742 发表于 2015-12-4 18:30 | 只看该作者
南天白云 发表于 2015-12-2 10:32
请问楼主:说明你编译实时时钟程序?还是问题?可以的话把图贴出来

是照片么????、
回复

使用道具 举报

6#
ID:1 发表于 2015-12-4 22:29 | 只看该作者
楼主能分享下电路图就好了
回复

使用道具 举报

7#
ID:96742 发表于 2015-12-5 08:58 | 只看该作者
admin 发表于 2015-12-4 22:29
楼主能分享下电路图就好了

慧净单片机的原理图

HL-1 V6.5原理图(实验板) (3).pdf

111.32 KB, 下载次数: 79, 下载积分: 黑币 -5

回复

使用道具 举报

8#
ID:99905 发表于 2015-12-25 01:17 | 只看该作者
电路图???
回复

使用道具 举报

9#
ID:266322 发表于 2017-12-25 09:36 | 只看该作者
谢谢lz,6666666666
回复

使用道具 举报

10#
ID:790346 发表于 2020-6-26 16:52 | 只看该作者
可以了
回复

使用道具 举报

11#
ID:495287 发表于 2020-6-27 11:59 | 只看该作者
谢谢楼主分享,学习ING.
回复

使用道具 举报

12#
ID:1082860 发表于 2023-6-8 19:22 来自手机 | 只看该作者
为什么我这显示两个警告
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表