半个学期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时钟芯片制作万年历相关推荐

  1. 使用51单片机和DS1302时钟芯片做一个简易的电子时钟

    简易的电子时钟实验 一.前言 二.DS1302模块介绍 三.驱动DS1302的代码 3.1 初始化DS1302时钟芯片 3.2 读取DS1302时钟芯片的时间 3.3 设置DS1302时钟芯片的时间 ...

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

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

  3. 基于51单片机LCD1602电子时钟实物制作

    之前写了51单片机的LCD1602的程序,现在画了电路图,焊接了电路板,做出了基于51单片机LCD1602电子时钟的实物. 注意事项: 焊接过程中,注意提前布局电路. 对应好端口(避免接线错误),我由 ...

  4. 4.7 51单片机-DS1302 实时时钟芯片

    4.7 DS1302 实时时钟芯片 4.7.1 原理图介绍 图4-7-1 图4-7-2 驱动DS1302之前,实验板上需要将JP595跳线帽和J11跳线帽断开.JP1302跳线帽接上. 4.7.2 D ...

  5. 51单片机使用DS1302时钟芯片实现可调时钟

    文章目录 1.实现方法 2.所需函数模块 3.时钟写入(读取)函数(`DS1302.c`) 4.定时器初始化函数(`Timer0Init.c`) 5.按键扫描函数(`Key.c`) 6.时钟调整函数( ...

  6. c51单片机时钟c语言程序设计,基于51单片机的电子时钟设计..doc

    -- I -- - - I -- 设计题目: 基于 51 单片机的电子时钟设计 摘要 单片机,是集 CPU ,RAM ,ROM ,定时器,计数器和多种接口于一体的微控制器.自 20 世纪 70 年代问 ...

  7. 51单片机的数字时钟系统【含仿真+程序+报告+原理图】

    1.主要功能 该系统由AT89C51单片机+DS1302时钟模块+按键模块+LCD显示模块构成. 利用51单片机实现电子时钟的功能.使用DS1302芯片作为计时设备,用LCD1602作为显示设备,按键 ...

  8. 利用51单片机制作从左至右再从右制作的的流水灯

    利用51单片机制作从左至右再从右制作的的流水灯 简述: 1.打开keil 4,新建工程 2.选择Atmel ,选择AT89C51芯片 3.新建文件另存为,将文件名末尾加上".c" ...

  9. 利用51单片机+hc595芯片配合在led点阵上玩贪吃蛇 第一篇“显示贪吃蛇”

    利用51单片机+hc595芯片配合在led点阵上玩贪吃蛇 第一篇"显示贪吃蛇" 完整的项目链接: https://github.com/linxinloningg/51_chip_ ...

最新文章

  1. aws lambda使用_使用AWS Lambda安排Slack消息
  2. jstree如何禁止平级拖拽?_小程序为鲜花店经营带来哪些价值?如何搭建一款鲜花小程序?...
  3. 四叶草社交平台——十天冲刺(9)
  4. 2.4.1 算术逻辑单元ALU与加法器(串行加法器、并行加法器、全加器)
  5. 《图解服务器网络架构》 学习笔记
  6. java 生成 tar.gz_一文教您如何通过 Java 压缩文件,打包一个 tar.gz Filebeat 采集器包...
  7. elasticsearch7使用指导
  8. module ‘tensorflow‘ has no attribute ‘sparse ‘
  9. 小红书面试题——paddingNum,用逗号分割数字串
  10. Linux常用命令--iconv
  11. 高校计算机实验室安全自查报告,学校实验室安全检查自查报告
  12. 游戏Java类图_java含类图五子棋小游戏
  13. 北京计算机应用中级,计算机应用教程(中级)
  14. 解决navicat闪退
  15. LAB3 PartA 用户环境与异常处理
  16. 获取前N天/月/年的日期
  17. 定时任务的多种实现——xxl-job
  18. 删除Linux虚拟机中的/dev/sdb磁盘步骤
  19. Linux设备管理(一)_kobject, kset,ktype分析
  20. 交叉编译详解 - 概念篇

热门文章

  1. ms office excel2013教程 - 合并计算
  2. java 渗透_渗透课程笔记
  3. Android12 apk安装失败 安装包异常 安装包大小显示1k
  4. 互联网和大数据是什么意思_数据化和互联网行业 互联网大数据什么意思
  5. 常用的Web前端开发框架有哪些呢?分享这11个
  6. 小屏幕android电视,手机屏幕还能投屏到电视?教你4种方法,1秒钟小屏变大屏
  7. keyshot渲染图文教程_KeyShot中渲染汽车教程
  8. Qt项目中,用QPainter进行绘制图形时,边角显示不完整问题的梳理
  9. cv2不能识别gif
  10. java ipc pgsql_[转]PostgreSQL源码结构