找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1725|回复: 0
收起左侧

基于时钟日历芯片的电子钟程序Proteus仿真图

[复制链接]
ID:1015184 发表于 2022-5-3 16:45 | 显示全部楼层 |阅读模式
电子时钟.png 51hei.png

单片机源程序如下:
#include<reg51.h>
#include "LCD1602.h"
#include "DS1302.h"

#define uchar unsigned char
#define uint unsigned int

sbit speaker=P2^4;
bit key_flag1=0,key_flag2=0;
         
SYSTEMTIME adjusted;//此处为结构体定义

uchar sec_add=0,min_add=0,hou_add=0,day_add=0,mon_add=0,yea_add=0;
uchar data_alarm[7]={0};

/*********************************键盘控制****************************************************/
int key_scan()  //扫描是否有键按下
{
  int i=0;
  uint temp;

  P1=0xf0;
  temp=P1;
  if(temp!=0xf0)
  {
    i=1;
  }
  else
  {
    i=0;
  }

  return i;
}

uchar key_value()                 //确定按键的值
{
  uint m=0,n=0,temp;
  uchar value;
  uchar v[4][3]={'2','1','0','5','4','3','8','7','6','b','a','9'}        ;

  P1=0xfe;temp=P1; if(temp!=0xfe)m=0;//采用分行、分列扫描的形式获取按键信息
  P1=0xfd;temp=P1; if(temp!=0xfd)m=1;
  P1=0xfb;temp=P1; if(temp!=0xfb)m=2;
  P1=0xf7;temp=P1; if(temp!=0xf7)m=3;
  P1=0xef;temp=P1; if(temp!=0xef)n=0;
  P1=0xdf;temp=P1; if(temp!=0xdf)n=1;
  P1=0xbf;temp=P1; if(temp!=0xbf)n=2;

  value=v[m][n];

  return value;
}

/************************************修改时间操作****************************************/
void adjust(void)
{
  if(key_scan()&&key_flag1)
  switch(key_value())
  {
    case '0':sec_add++;break;
    case '1':min_add++;break;
    case '2':hou_add++;break;
    case '3':day_add++;break;
    case '4':mon_add++;break;
    case '5':yea_add++;break;
    default: break;
  }
    adjusted.Second+=sec_add;
    adjusted.Minute+=min_add;
    adjusted.Hour+=hou_add;
    adjusted.Day+=day_add;
    adjusted.Month+=mon_add;
        adjusted.Year+=yea_add;
    if(adjusted.Second>59)        
        {
          adjusted.Second=adjusted.Second%60;
          adjusted.Minute++;
        }
        if(adjusted.Minute>59)        
        {
          adjusted.Minute=adjusted.Minute%60;
          adjusted.Hour++;
        }
        if(adjusted.Hour>23)               
        {
          adjusted.Hour=adjusted.Hour%24;
          adjusted.Day++;
        }
        if(adjusted.Day>31)               
          adjusted.Day=adjusted.Day%31;
        if(adjusted.Month>12)               
          adjusted.Month=adjusted.Month%12;
        if(adjusted.Year>100)               
          adjusted.Year=adjusted.Year%100;
}        

/************************************************中断处理函数*********************************/
void changing(void) interrupt 0 using 0                   //需要修改时间和日期,或者停止修改
{
  if(key_flag1)
    key_flag1=0;        
  else
    key_flag1=1;
}/*********************************主函数*************************************************/   
main()
{
  uint i;
  uchar p1[]="D:",p2[]="T:";
  SYSTEMTIME T;

  EA=1;
  EX0=1;
  IT0=1;
  EA=1;
  EX1=1;
  IT1=1;
  init1602();
  Initial_DS1302() ;

  while(1)
  {        
    write_com(0x80);
    write_string(p1,2);
    write_com(0xc0);
    write_string(p2,2);
    DS1302_GetTime(&T) ;
    adjusted.Second=T.Second;
    adjusted.Minute=T.Minute;
        adjusted.Hour=T.Hour;
        adjusted.Week=T.Week;
        adjusted.Day=T.Day;
        adjusted.Month=T.Month;
        adjusted.Year=T.Year;
        for(i=0;i<9;i++)
        {
          adjusted.DateString[ i]=T.DateString[ i];
          adjusted.TimeString[ i]=T.TimeString[ i];
    }
        adjust();
        DateToStr(&adjusted);
        TimeToStr(&adjusted);
        write_com(0x82);
    write_string(adjusted.DateString,8);
    write_com(0xc2);
    write_string(adjusted.TimeString,8);
        delay(10);
  }         
}

Keil代码与Proteus8.8仿真下载: 仿真程序.7z (49.57 KB, 下载次数: 34)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表