/*---------------------------------------------------------------------------

电子智能时钟程序

单 片 机:STC89C52RC

晶    振:12MHz

时钟芯片:DS12887

液 晶 屏:LCM-12864-ST7920

时    间:2010年3月28日

LCM12864使用并口连接方式,PSB、RST接高电平

头文件----------------------------------------------------------------------*/

#include

#include

#include "LCD12864.h"

#include "DS12CR887.h"

#include "DS18B20.h"

#include "nongli.h"

#include "displaytime.h"

#define uint  unsigned int

#define uchar unsigned char

/*--------------------定义按键-----------------------------------------------*/

sbit K1  = P3^2; //K1-设置

sbit K2  = P3^1; //K2-确认、返回

sbit K3  = P3^0; //K3-加

sbit K4  = P1^7; //K4-减

sbit K5  = P1^6; //液晶背光控制按键,按一下亮,再按一下灭

sbit BLK = P1^3; //液晶背光控制输出,低电平有效,PNP三极管控制。

void DelayM(uint);

/*定义变量-------------------------------------------------------------------*/

bit q=0, w=0;    //调时标志位

/*延时函数 1MS/次------------------------------------------------------------*/

void DelayM(uint a)

{

uchar i;

while( --a != 0) { for(i = 0; i < 125; i++); }

}

/*日期、时间设置函数---------------------------------------------------------*/

void Set_time(uchar sel)

{

signed char address,item;

signed char max,mini;

unsigned char yy,mo,moontemp1,moontemp2;

ds_write(0x0a,0x00);     //进入调时,关闭时钟振荡器

write_com(0x30); write_com(0x06);

write_com(0x98); lcm_w_word("设置");

if(sel==5)  {lcm_w_word("秒钟");address=0; max=59;mini=0;}  //秒钟0

if(sel==4)  {lcm_w_word("分钟");address=2; max=59;mini=0;}  //分钟2

if(sel==3)  {lcm_w_word("小时");address=4; max=23;mini=0;}  //小时4

//        if(sel==3)  {lcm_w_word("星期");address=6; max=7; mini=1;}  //星期6  修改为自动计算

//        if(sel==2)  {lcm_w_word("日期");address=7; max=31;mini=1;}  //日期7

if(sel==2)  {lcm_w_word("日期");                                                                                //日期修改为按月份实际天数调整

address=7;                                                                                                        //日期7

mo = ds_read(0x08);//读月

moontemp1=mo/16;

moontemp2=mo%16;

mo=moontemp1*10+moontemp2;//转换成10进制月份数据

yy = ds_read(0x09);//读年

moontemp1=yy/16;

moontemp2=yy%16;

yy=moontemp1*10+moontemp2;//转换成10进制年份数据

if(mo==2&&yy%4!=0){max=28;mini=1;}//平年2月28天

if(mo==2&&yy%4==0){max=29;mini=1;}//闰年2月29天

if(mo==1||mo==3||mo==5||mo==7||mo==8||mo==10||mo==12){max=31;mini=1;}//每月31天的月份

if(mo==4||mo==6||mo==9||mo==11){max=30;mini=1;} //每月30天的月份

}

if(sel==1)  {lcm_w_word("月份");address=8; max=12;mini=1;}  //月份8

if(sel==0)  {lcm_w_word("年份");address=9; max=99;mini=0;}  //年份9

item=ds_read(address);         //读取DS12CR887某地址上的数值赋给item

if(K3 == 0) {item++;}    //K3-加数:1

if(K4 == 0) {item--;}    //K4-减数:1

if(item>max) item=mini;  //限制数值最大有效范围

if(item

ds_write(address,item);  //将调整好的item值写入DS12CR887

displaydate();                          //显示日期

displaytime();                                 //显示时间

displaynl();                                  //显示农历

displayxq();                                 //显示星期

}

/*主函数---------------------------------------------------------------------*/

void main()

{

uchar e=0;

K1=1;K2=1;K3=1;K4=1;K5=1;BLK=0;

ds_int();                        //时钟芯片初始化

lcm_init();                        //液晶初始化

welcome();                    //调用欢迎信息

DelayM(2000);                 //延时

lcm_clr();            //清屏

Clean_12864_GDRAM();         //清屏

while(1)

{

if (w == 0)                  //正常走时

{

displaydate();         //显示日期

displaynl();         //显示农历

displaytime();         //显示时间

read_temp();         //读取温度

ds1820disp();          //显示温度

displayxq();

}

else {}              //否则启动调时

/*----------------------------设置时间--------------------------------------*/

if (K1 == 0)

{

DelayM(20);                       //按键消抖

if(K1 == 0 && w == 1)      //当是调时状态 本键用于调整下一项

{

e++;

if (e >= 7 ) {e = 0;}

while(! K1 );            //等待键松开

Set_time(e);           //调整

}

if(K1 == 0 && w == 0)      //当是正常状态时就进入调时状态

{

lcm_clr();

Clean_12864_GDRAM();   //清屏

w=1;                       //进入调时

Set_time(e);

}

while(K1 == 0);            //等待键松开

}

/*--------------------------------------------------------------------------*/

if (K2 == 0)                   // 当在调时状态时就退出调时

{

DelayM(20);

if(K2 == 0 && w == 1)

{

w = 0;                       //退出调时

e = 0;                           //"下一项"计数器清0

}

if(K2 == 0 && w == 0)

{

lcm_clr(); Clean_12864_GDRAM();

write_com(0x30); write_com(0x06);

welcome();

while(K2 == 0);

}

lcm_clr(); Clean_12864_GDRAM();

ds_write(0x0a,0x20);       //调时完毕,开启时钟振荡器

displaydate();

displaynl();

displaytime();

read_temp();

ds1820disp();

while(K2 == 0);

}

/*加调整--------------------------------------------------------------------*/

if (K3 == 0 && w == 1)

{

DelayM(20);

if(K3 == 0 && w == 1) { Set_time(e); }

//                        while(K3 == 0);

while(! K3 );

}

/*减调整--------------------------------------------------------------------*/

if (K4 == 0 && w == 1)

{

DelayM(20);

if(K4 == 0 && w == 1) { Set_time(e); }

//                        while(K4 == 0);

while(! K4 );

}

/*液晶背光控制,按一下亮,再按一下灭----------------------------------------*/

if(K5 == 0)

{

DelayM(20); q = ~q;      //标志位取反

if(q){BLK = BLK | 1;}

else {BLK = BLK & 0;}

while(K5 == 0);

}

}

}

/*结束----------------------------------------------------------------------*/

51单片机驱动ds12887c语言,51单片机+DS12887+12864大数字时钟程序+电路相关推荐

  1. 51单片机驱动ds12887c语言,DS12887(时钟日历芯片) c语言驱动程序

    原标题:DS12887(时钟日历芯片) c语言驱动程序 **************** 调试******************/ 管脚配置: MOT: 接地 CS: 接地 地址:0xFF00 AS ...

  2. stc51单片机入门 c语言,STC51单片机入门 (C语言)

    51单片机发展主要历程:AT89C51系列--STC89C52系列--STC90系列--STC11系列--STC12系列--STC15F系列--STC15W系列(最新主流),由于STC12系列功能已经 ...

  3. c语言数码管数字时钟程序,LED数码管24小时时钟电路实验

    时钟是很贴近生活的电子产品.这里用4位LED数码管制作24小时制的时钟电路,可供人们放置在家中计时之用,其电路如下图所示. 在下图中,PIC16F84A的RA4位,外接的K1键就是一种键值功能键.单片 ...

  4. 数字时钟程序c语言,C语言实现电子时钟程序

    本文实例为大家分享了C语言实现电子时钟程序的具体代码,供大家参考,具体内容如下 Qt 里面运行 #include #include #include #include #include typedef ...

  5. 数字时钟程序c语言,数字时钟C语言源程序

    数字时钟C语言源程序 #include//头文件 #define uchar unsigned char #define uint unsigned int //宏定义 uchar count; ui ...

  6. 51单片机喇叭c语言,c51单片机io口直接驱动喇叭,播放《挥着翅膀的女孩》.....

    #include #include #include main() { InitialSound(); Play(Music_Girl,0,2,350); while(1) { } } //挥着翅膀的 ...

  7. 51单片机生成C语言矩形波,单片机产生方波、锯齿波、三角波程序

    单片机 产生方波.锯齿波.三角波程序 #include#define uchar unsigned char #define uint unsigned int unsigned char x=0,m ...

  8. 热电偶单片机代码c语言,基于单片机的热电偶发生器设计(含电路原理图,程序)...

    基于单片机的热电偶发生器设计(含电路原理图,程序)(课题申报表,任务书,开题报告,中期检查表,外文翻译,论文15000字,程序,答辩PPT) 摘 要 热电偶标准信号发生器为袖珍式键控现场检测仪表.其由 ...

  9. plc和单片机及c语言区别,单片机和PLC的区别大解析

    首先我们先来看下什么是单片机? 什么是PLC? 单片机(英文名:Microcontrollers):它是一种集成电路芯片,单片机也被称为微控制器,是因为它最早被用在工业控制领域. PLC 其实就是可编 ...

最新文章

  1. VS.NET2003 开发环境 生成样式表 和 自动书写HTML对象模型
  2. Vivado Hardware Manager的使用
  3. 如何向列表中添加数据值(管理员篇)
  4. Redis-12Redis 流水线( pipeline )
  5. qscrollbar 固定滑块大小_五金模具设计:通用滑块结构形式!模具滑块的设计标准!值得收藏...
  6. vue获取当前日期和时间并进行格式化
  7. 前端学习(2783):封装myrequest并绑定到全局
  8. java面向对象编程思想_Java面向对象编程思想
  9. 我的世界java 内存_我的世界如何分配内存
  10. 陈国良院士将出席“首届对象存储技术与应用大会”
  11. 南华大学ACM队2021年7.14训练赛题解
  12. 电脑上没有tts信息服务器,TTS——让你的电脑会说话-win7 tts
  13. [bigdata-093] drool 规则引擎安装和试用(不全)
  14. Maven 安装教程详解
  15. Java十大常用框架介绍
  16. Excel从入门到精通--基础篇
  17. 大数据Hadoop之——Cloudera Hadoop(CM 6.3.1+CDH 6.3.2环境部署)
  18. 常用正则表达式大全 (转)
  19. 想要制作令人震撼的大屏可视化,要如何提升自己的可视化效果?
  20. golang的杀手级应用:docker

热门文章

  1. go WaitGroup 简单示例
  2. 大剑无锋之mysql中的行转列如何写?【面试推荐】
  3. 浅析请求转发和重定向
  4. 【Redis】杂项基础知识;Redis数据类型
  5. 【Java数据库】ORM思想:对象关系映射 使用Java容器存储多条记录
  6. 汇编语言 用push指令将a段中的前8个字形数据,逆序存储到b段中
  7. dart系列之:浏览器中的舞者,用dart发送HTTP请求
  8. JDK15真的来了,一起来看看它的新特性
  9. Java知识整理——ServletJSP
  10. python爬虫机器人价格_Python