51单片机万年历时钟代码求解释

qq_36004642 2016-12-19 12:14:13
#include<reg52.h>
#include"lcd1602.h"
#include"ds1302.h"
#include"ds18b20.h"

sbit buzz=P2^7;
sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2;
sbit s4=P3^3;

char shi=0,fen=0,miao=0,nian=11,yue=5,ri=10,xingqi=2,ashi,afen;
uchar s1num=0,s4num;
uchar flag=1,flag1;

uchar code w1[]={0x01,0x03,0x1D,0x11,0x1D,0x03,0x01,0x00};
uchar code tab0[]="20 - - day: ";
uchar code tab1[]="TEMP: : : ";
uchar code tab2[]={'0','1','2','3','4','5','6','7','8','9'};
uchar code tab5[]="OFF";
uchar code tab4[]="reset clock";

void display();
void keyscan();
void buzzer();
void naozhong();


void main()
{
init_lcd1602();
RESET_DS18B20();
init_ds1302(nian,yue,ri,shi,fen,miao,xingqi);
display_lcd1602_text(0,0,tab0);
display_lcd1602_text(1,0,tab1);
while(1)
{
keyscan();
if(flag)
{
naozhong();

display_lcd1602_byte(0,2,tab2[read_ds1302(0x8d)/10]);
display_lcd1602_byte(0,3,tab2[read_ds1302(0x8d)%10]);

display_lcd1602_byte(0,5,tab2[read_ds1302(0x89)/10]);
display_lcd1602_byte(0,6,tab2[read_ds1302(0x89)%10]);

display_lcd1602_byte(0,8,tab2[read_ds1302(0x87)/10]);
display_lcd1602_byte(0,9,tab2[read_ds1302(0x87)%10]);

display_lcd1602_byte(0,15,tab2[read_ds1302(0x8b)%10]);


display_lcd1602_byte(1,5,tab2[Read_DS18B20_TEMP()/10]);
display_lcd1602_byte(1,6,tab2[Read_DS18B20_TEMP()%10]);

display_lcd1602_byte(1,8,tab2[read_ds1302(0x85)/10]);
display_lcd1602_byte(1,9,tab2[read_ds1302(0x85)%10]);

display_lcd1602_byte(1,11,tab2[read_ds1302(0x83)/10]);
display_lcd1602_byte(1,12,tab2[read_ds1302(0x83)%10]);

display_lcd1602_byte(1,14,tab2[read_ds1302(0x81)/10]);
display_lcd1602_byte(1,15,tab2[read_ds1302(0x81)%10]);
}
}
}

void keyscan()
{
if((s1==0)&&(s4num==0))
{
delay(5);
if(s1==0)
{
while(!s1);
buzzer();
write_ds1302(0x8e,0);
write_ds1302(0x80,80);
flag=0;
s1num++;
switch(s1num)
{
case 1:
write_lcd1602(0x0f,0);
write_lcd1602(0x80+3,0);
break;
case 2:
write_lcd1602(0x80+6,0);
break;
case 3:
write_lcd1602(0x80+9,0);
break;
case 4:
write_lcd1602(0x80+15,0);
break;
case 5:
write_lcd1602(0x80+0x40+9,0);
break;
case 6:
write_lcd1602(0x80+0x40+12,0);
break;
case 7:
write_lcd1602(0x80+0x40+15,0);
break;
case 8:
write_lcd1602(0x0c,0);
write_ds1302(0x8e,80);
init_ds1302(nian,yue,ri,shi,fen,miao,xingqi);
flag=1;
break;
}
if(s1num==8)
s1num=0;
}
}
if(s1num!=0)
{
if(s2==0)
delay(5);
if(s2==0)
{
while(!s2);
buzzer();
switch(s1num)
{
case 1:
nian++;
if(nian==100)
nian=0;
display_lcd1602_byte(0,2,tab2[nian/10]);
display_lcd1602_byte(0,3,tab2[nian%10]);
write_lcd1602(0x80+3);
break;
case 2:
yue++;
if(yue==13)
yue=1;
display_lcd1602_byte(0,5,tab2[yue/10]);
display_lcd1602_byte(0,6,tab2[yue%10]);
write_lcd1602(0x80+6,0);
break;
case 3:
ri++;
if(ri==32)
ri=1;
display_lcd1602_byte(0,8,tab2[ri/10]);
display_lcd1602_byte(0,9,tab2[ri%10]);
write_lcd1602(0x80+9,0);
break;
case 4:
xingqi++;
if(xingqi==8)
xingqi=1;
display_lcd1602_byte(0,15,tab2[xingqi%10]);
write_lcd1602(0x80+15,0);
break;
case 5:
shi++;
if(shi==24)
shi=0;
display_lcd1602_byte(1,8,tab2[shi/10]);
display_lcd1602_byte(1,9,tab2[shi%10]);
write_lcd1602(0x80+0x40+9,0);
break;
case 6:
fen++;
if(fen==60)
fen=0;
display_lcd1602_byte(1,11,tab2[fen/10]);
display_lcd1602_byte(1,12,tab2[fen%10]);
write_lcd1602(0x80+0x40+12,0);
break;
case 7:
miao++;
if(miao==60)
miao=0;
display_lcd1602_byte(1,14,tab2[miao/10]);
display_lcd1602_byte(1,15,tab2[miao%10]);
write_lcd1602(0x80+0x40+15,0);
break;
}
}
}


if(s1num!=0)
{
if(s3==0)
delay(5);
if(s3==0)
{
while(!s3);
buzzer();
switch(s1num)
{
case 1:
nian--;
if(nian==-1)
nian=99;
display_lcd1602_byte(0,2,tab2[nian/10]);
display_lcd1602_byte(0,3,tab2[nian%10]);
write_lcd1602(0x80+3);
break;
case 2:
yue--;
if(yue==0)
yue=12;
display_lcd1602_byte(0,5,tab2[yue/10]);
display_lcd1602_byte(0,6,tab2[yue%10]);
write_lcd1602(0x80+6,0);
break;
case 3:
ri--;
if(ri==0)
ri=31;
display_lcd1602_byte(0,8,tab2[ri/10]);
display_lcd1602_byte(0,9,tab2[ri%10]);
write_lcd1602(0x80+9,0);
break;
case 4:
xingqi--;
if(xingqi==0)
xingqi=7;
display_lcd1602_byte(0,15,tab2[xingqi%10]);
write_lcd1602(0x80+15,0);
break;
case 5:
shi--;
if(shi==-1)
shi=23;
display_lcd1602_byte(1,8,tab2[shi/10]);
display_lcd1602_byte(1,9,tab2[shi%10]);
write_lcd1602(0x80+0x40+9,0);
break;
case 6:
fen--;
if(fen==-1)
fen=59;
display_lcd1602_byte(1,11,tab2[fen/10]);
display_lcd1602_byte(1,12,tab2[fen%10]);
write_lcd1602(0x80+0x40+12,0);
break;
case 7:
miao--;
if(miao==-1)
miao=59;
display_lcd1602_byte(1,14,tab2[miao/10]);
display_lcd1602_byte(1,15,tab2[miao%10]);
write_lcd1602(0x80+0x40+15,0);
break;
}

}

}
/*********************闹钟设定***************************/
if((s4==0)&&(s1num==0))
{
delay(5);
if(s4==0)
delay(500);
if(s4!=0)
{
while(!s4);
buzzer();
flag=0;
s4num++;
if(s4num==4)
s4num=1;
switch(s4num)
{
case 1:
write_lcd1602(0x01,0);
display_lcd1602_text(0,2,tab4);
display_lcd1602_text(1,7,tab5);
write_lcd1602(0x0c,0);
flag1=0;
break;
case 2:
write_lcd1602(0x0f,0);
display_lcd1602_byte(1,5,tab2[ashi/10]);
display_lcd1602_byte(1,6,tab2[ashi%10]);
display_lcd1602_byte(1,7,':');
display_lcd1602_byte(1,8,tab2[afen/10]);
display_lcd1602_byte(1,9,tab2[afen%10]);
write_lcd1602(0x80+0x40+6,0);
flag1=1;
break;
case 3:
display_lcd1602_byte(1,5,tab2[ashi/10]);
display_lcd1602_byte(1,6,tab2[ashi%10]);
display_lcd1602_byte(1,7,':');
display_lcd1602_byte(1,8,tab2[afen/10]);
display_lcd1602_byte(1,9,tab2[afen%10]);
write_lcd1602(0x80+0x40+9,0);
flag1=1;
break;
}
}
if(s4==0)
{
while(!s4);
s4num=0;
write_lcd1602(0x01,0);
write_lcd1602(0x0c,0);
display_lcd1602_text(0,0,tab0);
display_lcd1602_text(1,0,tab1);
flag=1;

}
}
if(s4num!=0)
{
if(s2==0)
delay(5);
if(s2==0)
{
while(!s2);
buzzer();
switch(s4num)
{
case 2:
ashi++;
if(ashi==24)
ashi=0;
display_lcd1602_byte(1,5,tab2[ashi/10]);
display_lcd1602_byte(1,6,tab2[ashi%10]);
write_lcd1602(0x80+0x40+6,0);
break;
case 3:
afen++;
if(afen==60)
afen=0;
display_lcd1602_byte(1,8,tab2[afen/10]);
display_lcd1602_byte(1,9,tab2[afen%10]);
write_lcd1602(0x80+0x40+9,0);
break;
}
}
}
if(s4num!=0)
{
if(s3==0)
delay(5);
if(s3==0)
{
while(!s3);
buzzer();
switch(s4num)
{
case 2:
ashi--;
if(ashi==-1)
ashi=23;
display_lcd1602_byte(1,5,tab2[ashi/10]);
display_lcd1602_byte(1,6,tab2[ashi%10]);
write_lcd1602(0x80+0x40+6,0);
break;
case 3:
afen--;
if(afen==-1)
afen=59;
display_lcd1602_byte(1,8,tab2[afen/10]);
display_lcd1602_byte(1,9,tab2[afen%10]);
write_lcd1602(0x80+0x40+9,0);
break;
}
}
}
}

void buzzer()
{
buzz=0;
delay(50);
buzz=1;
}

void naozhong()
{
if(flag1)
{
display();
if(ashi==read_ds1302(0x85))
{
delay(5);
if(afen==read_ds1302(0x83))
buzzer();
}
}

}

void display()
{
uchar i;
write_lcd1602(0x40,0);
for(i=0;i<8;i++)
write_lcd1602(w1[i],1);
write_lcd1602(0xc0+7,0);
write_lcd1602(0x00,1);
}
...全文
607 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hello_mcu 2016-12-29
  • 打赏
  • 举报
回复
兄弟,打算让别人给你注释哪一段啊。如果你有硬件,建议自己调试先看下现象。
Tiger_dish 2016-12-27
  • 打赏
  • 举报
回复
引用 3 楼 uid123 的回复:
[quote=引用 2 楼 Tiger_dish 的回复:] [quote=引用 1 楼 uid123 的回复:] 你确定这个是时钟的代码么?? 为啥开始时要#include "ds18b20.h" ????ds18B20这个东西是温度感应器,要加载这个你确定有用?? 还有你确定一个时钟需要10个按键???
应该是万年历把 他还有1302呢,那是RTC。关键是解释哪啊。[/quote] #INCULDE "DS1302.H" 这个是时钟芯片 如果是时钟当然是有用的了。问题是万年历跟温度有毛线关系啊? 还有那块不懂?等你程序都没看就问,我咋给你解释?我先给你解释主要过程, 首先初始化所有设备,然后加载4模块,(分别是:闹钟模块、键盘扫描模块、延时模块,还有显示模块),然后进入主程序,监视键盘动作情况,然后显示时间,比对是否有闹钟时间,延时,然后进入下一个循环。[/quote]结合实际情况好吗 一般万年历上都会显示温度的
uid123 2016-12-22
  • 打赏
  • 举报
回复
引用 2 楼 Tiger_dish 的回复:
[quote=引用 1 楼 uid123 的回复:] 你确定这个是时钟的代码么?? 为啥开始时要#include "ds18b20.h" ????ds18B20这个东西是温度感应器,要加载这个你确定有用?? 还有你确定一个时钟需要10个按键???
应该是万年历把 他还有1302呢,那是RTC。关键是解释哪啊。[/quote] #INCULDE "DS1302.H" 这个是时钟芯片 如果是时钟当然是有用的了。问题是万年历跟温度有毛线关系啊? 还有那块不懂?等你程序都没看就问,我咋给你解释?我先给你解释主要过程, 首先初始化所有设备,然后加载4模块,(分别是:闹钟模块、键盘扫描模块、延时模块,还有显示模块),然后进入主程序,监视键盘动作情况,然后显示时间,比对是否有闹钟时间,延时,然后进入下一个循环。
Tiger_dish 2016-12-22
  • 打赏
  • 举报
回复
引用 1 楼 uid123 的回复:
你确定这个是时钟的代码么?? 为啥开始时要#include "ds18b20.h" ????ds18B20这个东西是温度感应器,要加载这个你确定有用?? 还有你确定一个时钟需要10个按键???
应该是万年历把 他还有1302呢,那是RTC。关键是解释哪啊。
uid123 2016-12-19
  • 打赏
  • 举报
回复
你确定这个是时钟的代码么?? 为啥开始时要#include "ds18b20.h" ????ds18B20这个东西是温度感应器,要加载这个你确定有用?? 还有你确定一个时钟需要10个按键???
1. 时间日期切换显示: 我们设计了三种显示模式 操作:在主程序待机运行中,按下按键2,主程序进入日期显示(动态),默认显示方式为日期时间跳变显示,按1键在三种模式间切换,具体效果如下: 模式一日期、时间跳变切换效果:显示时间(4秒)=>显示年(1秒)=>显示月日(1秒)=>显示时间… 模式二日期、时间流水显示效果:显示内容为年月日时分秒从右往左进入显示区(1秒1位),时分秒出现后停留显示6秒,清屏重新显示。 模式三日期、时间滚屏显示效果:年、月日、时间由显示区由上向下循环滚动出现,移入移出速度为0.4s,中途停留显示3.6s。 2. 闹钟、整点报时: 闹铃可以设置3个,分别有独立开关状态(ON/OFF),可同时自主设定开启关闭使用某个闹钟,避免闹钟不够用的尴尬。响铃若无按键按下会持续1分钟。 整点报时按照12进制来进行,报时的时候1秒鸣,1秒断。 3. 时间显示方面优化 闪烁显示:设置时间或者闹钟时,选中的时段会闪烁,界面友好。 更新显示:设置状态当更改了当前时段,当前时段会立刻显示(处于闪烁的亮状态)。 保持显示:当按键按下中断进入键盘处理时,仍然可以继续显示原有内容,由此至终显示不会中断。 总的来说,在创新方面我们主要将精力放于优化显示方面上来,力界面友好,凸显个性化。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧