利用51单片机和DS12C887时钟芯片制作万年历
半个学期51的学习之后在终于动手敲了人生中第一个模块,期间出现了很多的bug,但还好的是最后都改正了
希望对大家有一点用处。
(单片机小白一个,欢迎大佬指点。如果有大佬碰巧看见的话能不能帮我找一下相关的proteus仿真图,不胜感激!)
#include<reg52.h>
#include<define.h>
void delayms(uint xms)
{
int i,j;
for(i=1;i<110;i++)
for(j=1;j<xms;j++);
}
void di()
{
beep=0;
delayms(100);
beep=1;
}
void write_com(uchar com)
{
lcdrs=0;
lcden=0;
P0=com;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
void write_date(uchar date)
{
lcdrs=1;
lcden=0;
P0=date;
delayms(50);
lcden=1;
delayms(5);
lcden=0;
}
void init()
{
uchar num;
EA=1;
EX1=1;
IT1=1;
flag1=0;
t0_num=0;
s1num=0;
week=1;
dula=0;
wela=0;
lcden=0;
write_12c78(0xA0,0x20);
write_12c78(0xB0,0x26);
set_time();
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<15;num++)
{
write_date(table[num]);
delayms(5);
}
write_com(0x80+0x40+6);
write_date(':');
delayms(5);
write_com(0x80+0x40+9);
write_date(':');
delayms(5);
}
void write_sfm(uchar adress,uchar date)
{
char shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+adress);
write_date(0x30+shi);
write_date(0x30+ge);
}
void write_nyr(uchar adress,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+adress);
write_date(0x30+shi);
write_date(0x30+ge);
}
void write_week(uchar week)
{
write_com(0x80+12);
switch(week)
{
case 1:
write_date('M');
delayms(5);
write_date('O');
delayms(5);
write_date('N');
delayms(5);
case 2:
write_date('T');
delayms(5);
write_date('U');
delayms(5);
write_date('E');
delayms(5);
case 3:
write_date('W');
delayms(5);
write_date('E');
delayms(5);
write_date('D');
delayms(5);
case 4:
write_date('T');
delayms(5);
write_date('H');
delayms(5);
write_date('U');
delayms(5);
case 5:
write_date('F');
delayms(5);
write_date('R');
delayms(5);
write_date('T');
delayms(5);
case 6:
write_date('S');
delayms(5);
write_date('A');
delayms(5);
write_date('T');
delayms(5);
case 7:
write_date('S');
delayms(5);
write_date('U');
delayms(5);
write_date('N');
delayms(5);
}
}
void keyscan()
{
if(flag_ri==1)
{
if((s1==0)||(s2==0)||(s3==0)||(s4==0))
{
if((s1==0)||(s2==0)||(s3==0)||(s4==0))
delayms(5);
{
while(!(s1&&s2&&s3&&s4));
di();
flag_ri=0;
}
}
}
if(s1==0)
{
delayms(5);
if(s1==0)
{
s1num++;
if(flag1==1)
if(s1num==4)
s1num=1;
flag=1;
while(!s1);
di();
switch(s1num)
{
case 1:write_com(0x80+0x40+10);
write_com(0xf0);
break;
case 2:
write_com(0x80+0x40+7);
break;
case 3:
write_com(0x80+0x40+4);
break;
case 4:
write_com(0x80+12);
break;
case 5:
write_com(0x80+9);
break;
case 6:
write_com(0x80+6);
break;
case 7:
write_com(0x80+3);
break;
case 8:
s1num=0;
write_com(0xc0);
flag=0;
write_12c78(1,miao);
write_12c78(2,fen);
write_12c78(3,shi);
write_12c78(4,week);
write_12c78(5,day);
write_12c78(6,month);
write_12c78(7,year);
break;
}
}
}
if(s1num!=0)
{
if(s2==0)
{
delayms(5);
if(s2==0)
{
while(!s2);
di();
switch(s1num)
{
case 1:
miao++;
if(miao==60)
miao=0;
write_sfm(10,miao);
write_com(0x80+0x40+10);
write_12c78(1,miao);
break;
case 2:
fen++;
if(fen==60)
fen=0;
write_sfm(7,fen);
write_com(0x80+0x40+7);
write_12c78(2,fen);
break;
case 3:
shi++;
if(shi==24)
shi=0;
write_sfm(4,shi);
write_com(0x80+0x40+4);
write_12c78(3,shi);
break;
case 4:
week++;
if(week==8)
week=1;
write_week(week);
write_com(0x80+12);
write_12c78(4,week);
break;
case 5:
day++;
if(day==32)
day=1;
write_nyr(9,day);
write_com(0x80+9);
write_12c78(5,day);
break;
case 6:
month++;
if(month==13)
month=1;
write_nyr(6,month);
write_com(0x80+6);
write_12c78(6,month);
break;
case 7:
year++;
if(year==100)
year=0;
write_nyr(3,year);
write_com(0x80+3);
write_12c78(7,year);
break;
}
}
}
if(s3==0)
{
delayms(5);
if(s3==0)
{
while(!s3);
di();
switch(s1num)
{
case 1:
miao--;
if(miao==-1)
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
write_12c78(1,miao);
case 2:
fen--;
if(fen==-1)
fen=59;
write_sfm(7,fen);
write_com(0x80+0x40+7);
write_12c78(2,fen);
break;
case 3:
shi--;
if(shi==-1)
shi=23;
write_sfm(4,shi);
write_com(0x80+0x40+4);
write_12c78(3,shi);
break;
case 4:
week--;
if(week==-1)
week=7;
write_week(week);
write_com(0x80+12);
write_12c78(4,week);
break;
case 5:
day--;
if(day==-1)
day=31;
write_nyr(9,day);
write_com(0x80+9);
write_12c78(5,day);
break;
case 6:
month--;
if(month==-1)
month=13;
write_nyr(6,month);
write_com(0X80+6);
write_12c78(6,month);
break;
case 7:
year--;
if(year==-1)
year=99;
write_nyr(3,year);
write_com(0x80+3);
write_12c78(7,year);
break;
}
}
}
if(s4==0)
{
delayms(5);
if(s4==0)
{
flag1=~flag1;
while(!s4);
di();
if(flag1==0)
{
flag=0;
write_com(0x80+0x40);
write_date(' ');
write_date(' ');
write_com(0x0c);
write_12c78(1,miao);
write_12c78(2,fen);
write_12c78(3,shi);
}
else
{
read_alarm();
miao=newmiao;
fen=newfen;
shi=newshi;
write_com(0x80+0x40);
write_date('R');
write_date('i');
write_com(0x80+0x40+3);
write_sfm(4,newshi);
write_sfm(7,newfen);
write_sfm(10,newmiao);
}
}
}
}
}
void write_12c78(uchar adress,uchar date) //12c78写地址,写数据函数。
{
dscs=0;
dsas=1;
dsds=1;
dsrw=1;
P0=adress;
dsas=0;
dsrw=0;
P0=date;
dsrw=1;
dsas=1;
dscs=1;
}
uchar read_12c78(uchar daress) //12c78读地址,数据函数。
{ //daress代表所取数据的地址
uchar date;
dsas=1;
dsds=1;
dsrw=1;
P0=daress;
dsas=0;
dsds=0;
P0=0xff;
date=P0;
dsds=1;
dsas=1;
return date;
}
void set_time()
{
write_12c78(0,0);
write_12c78(1,0);
write_12c78(2,0);
write_12c78(3,0);
write_12c78(4,0);
write_12c78(5,0);
write_12c78(6,0);
write_12c78(7,0);
write_12c78(8,0);
write_12c78(9,0);
}
void read_alarm()
{
newmiao=read_12c78(1);
newfen=read_12c78(2);
newshi=read_12c78(3);
}
void main()
{
init();
while(1)
{
keyscan();
if(flag_ri==1)
{
di();
delayms(100);
di();
delayms(500);
}
if(flag==0&&flag1==0)
{
keyscan();
year=read_12c78(7);
month=read_12c78(6);
day=read_12c78(5);
week=read_12c78(4);
shi=read_12c78(3);
fen=read_12c78(2);
miao=read_12c78(1);
write_sfm(10,miao);
write_sfm(7,fen);
write_sfm(4,miao);
write_week(week);
write_nyr(3,year);
write_nyr(6,month);
write_nyr(9,day);
}
}
}
void exter() interrupt 2
{
uchar c;
flag_ri=1;
c=read_12c78(0x0c);
}
调用的define.h函数模块如下:
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit lcdrs=P3^0;
sbit lcden=P3^1;
sbit s1=P1^4
sbit s2=P1^5;
sbit s3=P1^6;
sbit s4=P1^7;
sbit beep=P2^4;
sbit dscs=P1^4;
sbit dsas=P1^5;
sbit dsrw=P1^6;
sbit dsds=P1^7;
sbit dsirp=P3^3;
bit flag1,flag_ri;
uchar count,s1num,flag,t0_num;
uchar miao,fen,shi,month,week,day,year,newmiao,newshi,newfen;
uchar code table[]="20 - - ";
uchar code table1[]=" : : :";
void write_12c78(uchar,uchar);
void set_alarm(uchar,uchar,uchar);
void read_alarm();
uchar read_12c78(uchar);
void set_time();
利用51单片机和DS12C887时钟芯片制作万年历相关推荐
- 使用51单片机和DS1302时钟芯片做一个简易的电子时钟
简易的电子时钟实验 一.前言 二.DS1302模块介绍 三.驱动DS1302的代码 3.1 初始化DS1302时钟芯片 3.2 读取DS1302时钟芯片的时间 3.3 设置DS1302时钟芯片的时间 ...
- 基于微型计算机系统的实时时钟设计,基于单片机的DS12C887时钟芯片应用研究
摘 要: 新型时钟芯片DS12C887具有计时精确.断电情况下运行十年以上不丢失资料等优点,在单片机计时系统中有着广泛应用.本文分析了DS12C887的功能特性,介绍了DS12C887与AT89C51 ...
- 基于51单片机LCD1602电子时钟实物制作
之前写了51单片机的LCD1602的程序,现在画了电路图,焊接了电路板,做出了基于51单片机LCD1602电子时钟的实物. 注意事项: 焊接过程中,注意提前布局电路. 对应好端口(避免接线错误),我由 ...
- 4.7 51单片机-DS1302 实时时钟芯片
4.7 DS1302 实时时钟芯片 4.7.1 原理图介绍 图4-7-1 图4-7-2 驱动DS1302之前,实验板上需要将JP595跳线帽和J11跳线帽断开.JP1302跳线帽接上. 4.7.2 D ...
- 51单片机使用DS1302时钟芯片实现可调时钟
文章目录 1.实现方法 2.所需函数模块 3.时钟写入(读取)函数(`DS1302.c`) 4.定时器初始化函数(`Timer0Init.c`) 5.按键扫描函数(`Key.c`) 6.时钟调整函数( ...
- c51单片机时钟c语言程序设计,基于51单片机的电子时钟设计..doc
-- I -- - - I -- 设计题目: 基于 51 单片机的电子时钟设计 摘要 单片机,是集 CPU ,RAM ,ROM ,定时器,计数器和多种接口于一体的微控制器.自 20 世纪 70 年代问 ...
- 51单片机的数字时钟系统【含仿真+程序+报告+原理图】
1.主要功能 该系统由AT89C51单片机+DS1302时钟模块+按键模块+LCD显示模块构成. 利用51单片机实现电子时钟的功能.使用DS1302芯片作为计时设备,用LCD1602作为显示设备,按键 ...
- 利用51单片机制作从左至右再从右制作的的流水灯
利用51单片机制作从左至右再从右制作的的流水灯 简述: 1.打开keil 4,新建工程 2.选择Atmel ,选择AT89C51芯片 3.新建文件另存为,将文件名末尾加上".c" ...
- 利用51单片机+hc595芯片配合在led点阵上玩贪吃蛇 第一篇“显示贪吃蛇”
利用51单片机+hc595芯片配合在led点阵上玩贪吃蛇 第一篇"显示贪吃蛇" 完整的项目链接: https://github.com/linxinloningg/51_chip_ ...
最新文章
- aws lambda使用_使用AWS Lambda安排Slack消息
- jstree如何禁止平级拖拽?_小程序为鲜花店经营带来哪些价值?如何搭建一款鲜花小程序?...
- 四叶草社交平台——十天冲刺(9)
- 2.4.1 算术逻辑单元ALU与加法器(串行加法器、并行加法器、全加器)
- 《图解服务器网络架构》 学习笔记
- java 生成 tar.gz_一文教您如何通过 Java 压缩文件,打包一个 tar.gz Filebeat 采集器包...
- elasticsearch7使用指导
- module ‘tensorflow‘ has no attribute ‘sparse ‘
- 小红书面试题——paddingNum,用逗号分割数字串
- Linux常用命令--iconv
- 高校计算机实验室安全自查报告,学校实验室安全检查自查报告
- 游戏Java类图_java含类图五子棋小游戏
- 北京计算机应用中级,计算机应用教程(中级)
- 解决navicat闪退
- LAB3 PartA 用户环境与异常处理
- 获取前N天/月/年的日期
- 定时任务的多种实现——xxl-job
- 删除Linux虚拟机中的/dev/sdb磁盘步骤
- Linux设备管理(一)_kobject, kset,ktype分析
- 交叉编译详解 - 概念篇
热门文章
- ms office excel2013教程 - 合并计算
- java 渗透_渗透课程笔记
- Android12 apk安装失败 安装包异常 安装包大小显示1k
- 互联网和大数据是什么意思_数据化和互联网行业 互联网大数据什么意思
- 常用的Web前端开发框架有哪些呢?分享这11个
- 小屏幕android电视,手机屏幕还能投屏到电视?教你4种方法,1秒钟小屏变大屏
- keyshot渲染图文教程_KeyShot中渲染汽车教程
- Qt项目中,用QPainter进行绘制图形时,边角显示不完整问题的梳理
- cv2不能识别gif
- java ipc pgsql_[转]PostgreSQL源码结构