1、实现显示年月日,星期,时间
2、功能键,调整加,调整减,闹钟设置键4个按键
3、改进按键误入时钟或闹钟调整界面 ,时钟会停止计时。 改进后,如果不发生实际调整,时间不会停止计时。
4、改进闹钟没打开和关闭功能,如果设置闹钟时间,不打开闹钟则不响铃。
5、改进闹铃响起时,不能按键停止响铃。
6、改进闹铃响起时,除非重启,不能停止闹铃。闹铃在响30秒后自动停止。

下面为天翔1开发板实测通过实例:


#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit rs=P3^5;
sbit lcden=P3^4;
sbit s1=P3^0;          //功能键
sbit s2=P3^1;          //增加键
sbit s3=P3^2;          //减小键
sbit s4=P3^6;         //闹钟查看键
sbit rd=P3^7;        //s1s2s3按键共线
sbit beep=P2^3;      //蜂鸣器
sbit dscs=P1^4;        //ds的脚功能定义
sbit dsas=P1^5;
sbit dsrw=P1^6;
sbit dsds=P1^7;
sbit dsirq=P3^3;   //ds闹钟中断
/* 注意:P0接液晶和时钟数据,单片机先通过p0读取时钟数据,
然后再通过p0送出数据到液晶不同步,所以液晶和时钟
可以同时物理连接p0的8位数据口。*/bit flag1,flag_ri,flag,run,ri;//定义位变量,flag1为闹钟设置标志
//flag为时钟设置标志,run为s1,s2按键使用标志位,ri为闹钟打开关闭标志位
uchar count,s1num,t0_num;
char miao,shi,fen,year,month,day,week,amiao,afen,ashi;
uchar code table[]=" 20  -  -      ";//液晶固定显示内容
uchar code table1[]="      :  :  ";
void write_ds(uchar,uchar);//函数申明
void set_alarm(uchar,uchar,uchar);void read_alarm();
uchar read_ds(uchar);
//void set_time();void delay(uint z)//11M,毫秒延时函数
{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);
}
void di() //按键蜂鸣器报警声音
{beep=0;delay(100);beep=1;
}
void alarm_di()//闹钟响铃
{beep=0;delay(100);beep=1;delay(100);beep=0;delay(100);beep=1;delay(500);} void write_com(uchar com)
{//写液晶命令函数rs=0;lcden=0;P0=com;delay(3);lcden=1;delay(3);lcden=0;
}
void write_date(uchar date)
{//写液晶数据函数rs=1;lcden=0;P0=date;//液晶数据口delay(3);lcden=1;delay(3);lcden=0;
}
void lcd_initialize() //1602液晶初始化
{uchar num;write_com(0x38);//液晶模式设置16*2显示write_com(0x0c);//光标不显示,不闪烁write_com(0x06);//屏幕输入移动设置write_com(0x01);//屏幕清零write_com(0x80);//屏幕从第一行第一位开始显示for(num=0;num<15;num++)//写入液晶固定部分显示{write_date(table[num]);delay(1);}write_com(0x80+0x40);for(num=0;num<11;num++){write_date(table1[num]);delay(1);}
}
void init()
{//初始化函数dula=0;//关闭数码管显示wela=0;lcden=0;rd=0;EA=1;//打开总中断EX1=1;//开外部中断1IT1=1;//设置负跳变沿触发中断flag1=0;//变量初始化t0_num=0;s1num=0;week=1;lcd_initialize();  //1602液晶初始化
}/*以下几行在首次设置DS12C887时使用,以后不必再写入 write_ds(0x0A,0x20);//打开振荡器write_ds(0x0B,0x26);//设置24小时模式,数据二进制格式                    set_time();//设置上电默认时间---首次操作12C887时给予寄存器初始化--- void set_time(){//首次上电初始化时间函数write_ds(4, 0);write_ds(2, 0);write_ds(0,0);write_ds(1,0);write_ds(2,0);write_ds(3,0);write_ds(4,0);write_ds(5,0);write_ds(6,0);write_ds(7,0);write_ds(8,0);write_ds(9,0);
} */
//--------------------------------------     void write_sfm(uchar add,char date)
{//1602液晶刷新时分秒函数4为时,7为分,10为秒char shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);
}
void write_nyr(uchar add,char date)
{//1602液晶刷新年月日函数3为年,6为分,9为秒char shi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_date(0x30+shi);write_date(0x30+ge);
}
void write_week(char we)
{//写液晶星期显示函数write_com(0x80+12);switch(we){case 1: write_date('M');delay(5);write_date('o');delay(5);write_date('n');break;case 2: write_date('T');delay(5);write_date('u');delay(5);write_date('e');break;case 3: write_date('W');delay(5);write_date('e');delay(5);write_date('d');break;case 4: write_date('T');delay(5);write_date('h');delay(5);write_date('u');break;case 5: write_date('F');delay(5);write_date('r');delay(5);write_date('i');break;case 6: write_date('S');delay(5);write_date('a');delay(5);write_date('t');break;case 7: write_date('S');delay(5);write_date('u');delay(5);write_date('n');break;}
}void keyscan_s1() //s1功能按键检测
{if(s1==0)//检测S1{delay(5);if(s1==0){               s1num++;//记录按下次数if(flag1==1){    if(s1num==5)s1num=1;}flag=1;while(!s1);di();switch(s1num){//光标闪烁点定位case 1: write_com(0x80+0x40+10);write_com(0x0f);break;case 2: write_com(0x80+0x40+7);write_com(0x0f);break;case 3: write_com(0x80+0x40+4);write_com(0x0f);break;case 4: write_com(0x80+12);//时钟设置,光标位write_com(0x0f);if(flag1==1)    //闹钟设置,光标位{write_com(0x80+0x40);write_com(0x0f);    }break;case 5: write_com(0x80+9);write_com(0x0f);break;case 6: write_com(0x80+6);write_com(0x0f);break;case 7: write_com(0x80+3);write_com(0x0f);break;case 8: s1num=0;write_com(0x0c);                                             if(run==1){flag=1;           //s2,s3按键使用,时钟工作标志位停止run=0;         //s2,s3使用标志位清零write_ds(0,miao); //写入已经调整时间到DS    write_ds(2,fen);write_ds(4,shi);write_ds(6,week);write_ds(7,day);write_ds(8,month);write_ds(9,year);   }flag=0;   //退出设置恢复时钟工作标志位s1num=0;// 功能键次数清零          break;}         }       }
}
void keyscan_s2s3()  //s2s3 调节加减按键检测
{if(s1num!=0)//只有当S1按下后,才检测S2和S3{       if(s2==0){delay(1);if(s2==0){                while(!s2);    di();run=1;            //s2,s3标志位,退出设置时用于确定是否进行了调整switch(s1num){//根据功能键次数调节相应数值case 1: miao++;if(miao==60)miao=0;write_sfm(10,miao);write_com(0x80+0x40+10); break;case 2: fen++;if(fen==60)fen=0;write_sfm(7,fen);write_com(0x80+0x40+7); break;case 3: shi++;if(shi==24)shi=0;write_sfm(4,shi);write_com(0x80+0x40+4); break;case 4: if(flag1==1)  //闹钟设置,光标位{                           write_com(0x80+0x40);write_date('N');ri=0;                                                     write_com(0x0f);    }else{week++;if(week==8)                            week=1;write_week(week);write_com(0x80+12);}                          break;case 5: day++;if(day==32)day=1;write_nyr(9,day);write_com(0x80+9);break;case 6: month++;if(month==13)month=1;write_nyr(6,month);write_com(0x80+6);break;case 7: year++;if(year==100)year=0;write_nyr(3,year);write_com(0x80+3);break;}}         }           if(s3==0){delay(1);if(s3==0){while(!s3);di();run=1;switch(s1num){//根据功能键次数调节相应数值case 1: miao--;if(miao==-1)miao=59;write_sfm(10,miao);write_com(0x80+0x40+10);break; case 2: fen--;if(fen==-1)fen=59;write_sfm(7,fen);write_com(0x80+0x40+7);break;case 3: shi--;if(shi==-1)shi=23;write_sfm(4,shi);write_com(0x80+0x40+4);break;case 4: if(flag1==1) //闹钟设置,光标位{ write_com(0x80+0x40);write_date(' '); ri=1;                                     //闹钟外部中断关闭                write_com(0x0f);   }else{week--;if(week==0)                            week=7;write_week(week);write_com(0x80+12); }                       break;                           case 5: day--;if(day==0)day=31;write_nyr(9,day);write_com(0x80+9);break;case 6: month--;if(month==0)month=12;write_nyr(6,month);write_com(0x80+6);break;case 7: year--;if(year==-1)year=99;write_nyr(3,year);write_com(0x80+3);break;                  }               }               }      }
}void keyscan_s4() //s4闹钟功能按键检测
{ if(s4==0)//检测S4闹钟设置{     delay(5);if(s4==0){   flag1=~flag1;//闹钟设置标志  while(!s4);    di();                   if(flag1==0){//退出闹钟设置时保存数值flag=0;s1num=0;// 功能键次数清零write_com(0x80+0x40);write_date(' ');write_date(' ');write_date(' ');                write_com(0x0c);write_ds(1,miao);write_ds(3,fen);write_ds(5,shi);                              }else{//进入闹钟设置read_alarm();//读取原始数据miao=amiao;//重新赋值用以按键调节fen=afen;shi=ashi;if(ri==1){write_com(0x80+0x40);write_date(' '); write_date('R'); write_date('i');}else{write_com(0x80+0x40);write_date('N'); write_date('R'); write_date('i');}                    }            write_com(0x80+0x40+3);write_sfm(4,ashi);//送液晶显示闹钟时间write_sfm(7,afen);write_sfm(10,amiao);run=0;        //调整完以后s1s2按键设置没有使用,//时钟可不中断工作}           }
}
void keyscan()      //所有按键扫描
{  keyscan_s1();     keyscan_s2s3();keyscan_s4();
}void write_ds(uchar add,uchar date)
{//写12C887函数dscs=0;dsas=1;dsds=1;dsrw=1;P0=add;//先写地址dsas=0;dsrw=0;P0=date;//再写数据dsrw=1;dsas=1;dscs=1;
}uchar read_ds(uchar add)
{//读12C887函数uchar ds_date;dsas=1;dsds=1;dsrw=1;dscs=0;P0=add;//先写地址dsas=0;dsds=0;P0=0xff;ds_date=P0;//再读数据dsds=1;dsas=1;dscs=1;return ds_date;
}void read_alarm()
{//读取12C887闹钟值amiao=read_ds(1);afen=read_ds(3);ashi=read_ds(5);
}
void work_clock()  //时钟工作主程序
{if(flag==0&&flag1==0)//正常工作时进入这里{year=read_ds(9);//读取12C887数据month=read_ds(8);   day=read_ds(7);week=read_ds(6);shi=read_ds(4);fen=read_ds(2);miao=read_ds(0);    write_sfm(10,miao);//送液晶显示write_sfm(7,fen);write_sfm(4,shi);write_week(week);write_nyr(3,year);write_nyr(6,month);write_nyr(9,day);}
}
void work_alarm() //闹铃工作主程序
{if(flag_ri==1)//当闹钟中断时进入这里   {char i;for(i=20;i>0;i--)//  闹铃响20下,如果任意键则停止{alarm_di();year=read_ds(9);//读取12C887数据month=read_ds(8);   day=read_ds(7);week=read_ds(6);shi=read_ds(4);fen=read_ds(2);miao=read_ds(0);    write_sfm(10,miao);//送液晶显示write_sfm(7,fen);write_sfm(4,shi);write_week(week);write_nyr(3,year);write_nyr(6,month);write_nyr(9,day);          if((s1==0)||(s2==0)||(s3==0)||(s4==0)){   delay(5);if((s1==0)||(s2==0)||(s3==0)||(s4==0)){                      while(!(s1&&s2&&s3&&s4));//松手检测i=-1; flag_ri=0;   lcd_initialize();  //液晶初始化一下                }       }}              flag_ri=0; //如果没有按键停止闹铃,则在自动停止闹铃}
}void main()//主函数
{init();//调用初始化函数while(1){keyscan();//按键扫描   work_clock();//时钟正常工作程序work_alarm();//闹钟工作程序       }
}void exter() interrupt 2//外部中断1服务程序
{   uchar c; //进入中断表示闹钟时间到,  flag_ri=ri; //设置标志位,用以大程序中报警提示,ri=1启动闹钟c=read_ds(0x0c);//读取12C887的C寄存器表示响应了中断}

51单片机DS12C887时钟芯片和1602液晶显示完善前人例程版本相关推荐

  1. 51单片机DS1302时钟芯片应用Proteus仿真

    系列文章目录 第一章 51单片机Proteus仿真(一) DS1302使用 文章目录 系列文章目录 前言 一.DS1302时序解读 二.BCD码转十进制解读 三.Proteus仿真 四.详细代码 前言 ...

  2. 共阳极数码时钟c语言程序,51单片机_DS1302时钟芯片_共阴数码管_时钟实例【中为电子科技工作室】_51单片机ds1302数码管时钟...

    该文档包括原理图.源代码,系统的介绍了51单片机和DS1302的应用,显示方式为4位共阴时钟数码管,具有调时功能,原理图和源代码都已验证是可用的. E:\Demo\Keil3\IS EB51M V10 ...

  3. (给自己看)51单片机DS1302时钟芯片

    老规矩先上DS1302.c的代码 #include <regx52.h>//首先 DS1302_Init(); // DS1302_SetTime();//再在while中DS1302_R ...

  4. 基于51单片机 + ds12c887 + ds18b20 + lcd1602的时钟温度显示器(带闹钟功能)

    一.简介 本设计是基于51单片的的时间温度显示器,可以实现设置年月日.星期以及时分秒和温度的功能,此外还可以设置闹钟,到达设定的时间后会触发蜂鸣器报警,起到一个定时报警的功能. 1.在1602液晶上显 ...

  5. 基于微型计算机系统的实时时钟设计,基于单片机的DS12C887时钟芯片应用研究

    摘 要: 新型时钟芯片DS12C887具有计时精确.断电情况下运行十年以上不丢失资料等优点,在单片机计时系统中有着广泛应用.本文分析了DS12C887的功能特性,介绍了DS12C887与AT89C51 ...

  6. 51单片机 外部时钟_基于51单片机的LCD12864显示模拟时钟

    今天要分享的仿真和程序是基于51单片机的LCD12864显示模拟时钟.公众号之前也分享过数字时钟,但是那些时钟都是采用数字显示的形式来显示时间,而今天分享一个采用LCD12864显示的模拟指针式时钟. ...

  7. 万年历设计单片机c语言,数字万年历设计(80c51单片机、时钟芯片ds1320).pdf

    数字万年历设计(80c51单片机.时钟芯片ds1320) 德州科技职业学院青岛校区 2006 级毕业论文 多功能数字万年历设计 摘 要 : 本设计是一种基于 AT89C52 单片机控制的数字万年历设计 ...

  8. 基于51单片机ds1302时钟、ds18b20、lcd12864的恒温器

    目录 项目:基于51单片机ds1302时钟.ds18b20的恒温器 功能说明: 运行流程: 效果展示: 供电方式: 用途: 提高: 附: ​                              ...

  9. DS12C887时钟芯片

    单片机上的DS12C887时钟芯片,设置12小时制,怎么显示上午  和下午.怎么读取.

最新文章

  1. cwRsync文件双向同步问题
  2. [windows版]搭建php的redis环境
  3. Java 判断字符串是否为空的四种方法、优缺点与注意事项
  4. html和html5学习
  5. 【UGV】小车一些图片 麦轮版小车
  6. vue 引入swiper4,在有些手机Dom7会有问题
  7. C语言学习之用指针处理,输入a和 b两个整数,按先大后小的顺序输出a和 b
  8. python观察日志(part23)--更改图片尺寸并保存
  9. happen-before原则的理解
  10. Redis源码分析之小型测试框架testhelp.h和redis-check-aof.c日志检测
  11. 助力 Android 抗衡 iOS,华为发布方舟编译器!
  12. 取英文名字的几个规则
  13. 湾区那些事儿 (二)
  14. 虚拟化服务器安装方法,Citrix Xenserver:7.0虚拟化服务器安装详细图文教程
  15. 【Python】第七篇:模块化编程及第三方模块的安装
  16. Python快速入门教材推荐!
  17. shopex操作记录
  18. 获取当前日期上周的周一和周日日期
  19. Linux(深度deepin)下安装jdk、tomcat、idea
  20. office中导入mathtype出现MathPage.wll未找到错误

热门文章

  1. 名人耍大牌,怎么破?
  2. SpringBoot 中使用 HATEOAS
  3. 【大有用处】步进电机的选型计算方法
  4. ARM处理器体系结构总结
  5. android使用系统字体文件,Android 自定义字体,更换系统默认显示的字体使用自定义字体...
  6. 2020web前端学习路线(附全套前端视频教程+教学大纲)
  7. 处理VFS对象及标准函数--标准函数
  8. js三级地区选择插件,省市县级联下拉列表
  9. 软件测试结束的标准(仅供参考)
  10. 2022氯碱电解工艺考试模拟100题模拟考试平台操作