找回密码
 立即注册

QQ登录

只需一步,快速开始

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

谁能给个51单片机的电子时钟

  [复制链接]
跳转到指定楼层
楼主
要求要有,日期,时间,和闹钟,帮帮忙,
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:97831 发表于 2015-12-1 12:21 | 只看该作者
用按键调的
回复

使用道具 举报

板凳
ID:18867 发表于 2015-12-1 20:58 | 只看该作者
自己找,很多!
回复

使用道具 举报

地板
ID:96742 发表于 2015-12-1 21:25 | 只看该作者
我给   #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       }    }
回复

使用道具 举报

5#
ID:125752 发表于 2016-6-7 22:50 | 只看该作者
org 0000h  ajmp main    org 000bh     ljmp inti0  org 001bh     ljmp inti1  org 0030h  main:mov tmod,#11h   mov ie,#8ah   mov th0,#4ch     mov tl0,#00h  mov th1,#4ch      mov tl1,#00h  mov sp,#60h    mov r0,#20     mov 31h,#00    mov 32h,#00    mov 33h,#00    mov 38h,#00    mov 39h,#00    setb tr0     setb tr1     loop:lcall display    lcall key     lcall keynz    ajmp loop  inti0:push psw    push acc  clr ea    mov th0,#4ch   mov tl0,#00h  djnz r0,out    mov r0,#20     inc 31h   cpl p2.2    mov a,31h  cjne a,#60,out   mov 31h,#00   inc 32h   mov a,32h  cjne a,#60,out   mov 32h,#00    inc 33h    mov a,33h  cjne a,#24,out    mov 33h,#00     out: setb ea    pop acc  pop psw  reti    inti1:push psw   push acc  clr ea   mov th1,#4ch   mov tl1,#00h  inc 3ah  mov a,3ah  cjne a,#20,out1    mov 3ah,#00      mov a,32h  cjne a,38h,out1    mov a,33h  cjne a,39h,out1    clr p1.0     out1: setb ea   pop acc    pop psw  reti    display:mov a,31h       mov b,#10  div ab  mov 20h,a     mov 21h,b     disp1:  mov a,20h             mov dptr,#table      movc a,@a+dptr      mov p0,a        clr p2.0      lcall del1ms      setb p2.0    disp2:  mov a,21h             mov dptr,#table    movc a,@a+dptr    mov p0,a    clr p2.1    lcall del1ms    setb p2.1  disp3:  mov a,32h            mov b,#10    div ab    mov 22h,a    mov 23h,b  disp4:  mov a,22h           mov dptr,#table    movc a,@a+dptr    mov p0,a    clr p2.6    lcall del1ms    setb p2.6  disp5:  mov a,23h              mov dptr,#table    movc a,@a+dptr    mov p0,a    clr p2.7    lcall del1ms    setb p2.7  disp6:  mov a,33h            mov b,#10    div ab    mov 24h,a    mov 25h,b  disp7:  mov a,24h       mov dptr,#table    movc a,@a+dptr    mov p0,a    clr p2.4    lcall del1ms    setb p2.4  disp8:  mov a,25h             mov dptr,#table    movc a,@a+dptr    mov p0,a    clr p2.5    lcall del1ms    setb p2.5    ret  display1:mov a,38h            mov b,#10    div ab    mov 26h,a    mov 27h,b  dispnz1:mov a,26h             mov dptr,#table    movc a,@a+dptr    mov p0,a    clr p2.6    lcall del1ms    setb p2.6  dispnz2:mov a,27h            mov dptr,#table    movc a,@a+dptr    mov p0,a    clr p2.7    lcall del1ms    setb p2.7  dispnz3:mov a,39h             mov b,#10    div ab    mov 28h,a    mov 29h,b  dispnz4:mov a,28h            mov dptr,#table    movc a,@a+dptr    mov p0,a    clr p2.4    lcall del1ms    setb p2.4  dispnz5:mov a,29h            mov dptr,#table    movc a,@a+dptr    mov p0,a    clr p2.5    lcall del1ms    setb p2.5    ret  table:db 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H     del1ms:mov r7,#10    del1: mov r6,#50  del2:djnz r6,del2       djnz r7,del1    ret  del20ms:mov r5,#40    del3:mov r4,#250  del4:djnz r4,del4       djnz r5,del3    ret  key:jnb p3.2,key1       jnb p3.3,key2       sjmp keyout  key1:lcall del20ms    jb p3.2,keyout    jnb p3.2,$     inc 32h     mov a,32h    cjne a,#60,keyout    mov 32h,#00     sjmp keyout  key2:lcall del20ms        jb p3.3,keyout    jnb p3.3,$       inc 33h       mov a,33h    cjne a,#24,keyout     mov 33h,#00     sjmp keyout  keyout:ret  keynz:jnb p3.4,keynz1      jnb p3.5,keynz2      jnb p3.6,keynz3     jnb p3.7,keynz4      sjmp nzout  nz1:lcall display1        jnb p3.5,keynz2   jnb p3.6,keynz3  keynz1:jnb p3.4,nz1        sjmp nzout  keynz2:lcall del20ms         jb p3.5,nzout      jnb p3.5,$       inc 38h        mov a,38h      cjne a,#60,nzout      mov 38h,#00       sjmp nzout  keynz3:lcall del20ms         jb p3.6,nzout      jnb p3.6,$       inc 39h        mov a,39h      cjne a,#24,nzout       mov 39h,#00         sjmp nzout  keynz4:jb p3.7,nzout      jnb p3.7,$      setb p1.0       sjmp nzout  nzout:ret  end
回复

使用道具 举报

6#
ID:125761 发表于 2016-6-7 23:13 | 只看该作者
谢谢楼上分享,正求呢
回复

使用道具 举报

7#
ID:125796 发表于 2016-6-8 10:01 | 只看该作者
自己去百度搜索一下
回复

使用道具 举报

8#
ID:111634 发表于 2016-6-8 17:07 | 只看该作者
本帖最后由 zl2168 于 2016-6-8 17:21 编辑

先Proteus仿真一下

实例91 带校正时钟1302(LCD1602显示).rar (52.74 KB, 下载次数: 15)







以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版




回复

使用道具 举报

9#
ID:111634 发表于 2016-6-8 17:44 | 只看该作者
本帖最后由 zl2168 于 2016-6-8 17:51 编辑

先Proteus仿真一下

实例90 开机显示PC机时间的时钟1302(LCD1602显示).rar (50.36 KB, 下载次数: 9)





摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版


回复

使用道具 举报

10#
ID:111634 发表于 2016-6-8 18:36 | 只看该作者
本帖最后由 zl2168 于 2016-6-8 18:41 编辑

先Proteus仿真一下

实例92 开机显示PC机时分秒的时钟1302(6位LED数码管显示).rar (50.05 KB, 下载次数: 5)   





摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版


回复

使用道具 举报

11#
ID:111634 发表于 2016-6-8 18:42 | 只看该作者
本帖最后由 zl2168 于 2016-6-8 18:46 编辑

先Proteus仿真一下






摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版



回复

使用道具 举报

12#
ID:111634 发表于 2016-6-8 18:47 | 只看该作者
本帖最后由 zl2168 于 2016-6-8 18:49 编辑

功能设计



7-12电路,要求开机显示134758秒,数据间用小数点分隔,其中秒数据闪烁(亮600ms,暗400ms),并不断更新。同时要求K0K1K2具有时钟校正功能,其控制过程为:按下K0(带锁),进入时钟修正;首先,时十位快速闪烁(亮暗各120ms);按一次K1(不带锁),被修正位(快速闪烁)按时十位、时个位、分十位、分个位、秒十位、秒个位次序向右移一位(循环往复);按一次K2(不带锁),被修正位加1(最大值不超过时钟规定值,超过复0);时钟修正期间,计时继续运行;释放K0,退出时钟修正。


回复

使用道具 举报

13#
ID:111634 发表于 2016-6-8 18:51 | 只看该作者
本帖最后由 zl2168 于 2016-6-8 18:52 编辑

先Proteus仿真一下

实例94 模拟电子钟(由80C51定时器产生秒时基).rar (43.05 KB, 下载次数: 7)






摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版


回复

使用道具 举报

14#
ID:126006 发表于 2016-6-9 19:10 | 只看该作者
看看
回复

使用道具 举报

15#
ID:125374 发表于 2016-6-12 08:57 | 只看该作者
我是想要点黑币,下东西
回复

使用道具 举报

16#
ID:125374 发表于 2016-6-12 08:57 | 只看该作者
我是想要点黑币,下东西
回复

使用道具 举报

17#
ID:125378 发表于 2017-2-26 14:13 | 只看该作者
求源码
回复

使用道具 举报

18#
ID:166724 发表于 2017-2-26 14:39 | 只看该作者
用按键自己按
回复

使用道具 举报

19#
ID:166914 发表于 2017-2-27 15:20 | 只看该作者
网上也有很多
回复

使用道具 举报

20#
ID:167311 发表于 2017-3-2 21:49 | 只看该作者
这个东西 网上多得是
回复

使用道具 举报

21#
ID:122576 发表于 2017-3-3 14:16 | 只看该作者
相信楼主找到了很好
回复

使用道具 举报

22#
ID:99130 发表于 2017-3-3 14:24 | 只看该作者
我这有12864做的,有代码和原理图,要的话加我QQ
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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