#include <AT89X51.H>
#include<absacc.h>
//#define<reg51.h>
#define TM_second XBYTE[0x8000]
#define AM_second XBYTE[0x8001]
#define TM_minute XBYTE[0x8002]
#define AM_minute XBYTE[0x8003]
#define TM_hour XBYTE[0x8004]
#define AM_hour XBYTE[0x8005]
#define TM_week XBYTE[0x8006]
#define TM_day XBYTE[0x8007]
#define TM_month XBYTE[0x8008]
#define TM_year XBYTE[0x8009]
#define REG_A XBYTE[0x800a]
#define REG_B XBYTE[0x800b]
#define REG_C XBYTE[0x800c]
#define REG_D XBYTE[0x800d]
#define RAM_114 XBYTE[0x800e]
#define uchar unsigned char
#define uint unsigned int
sbit DIN=P1^0;
sbit LOAD=P1^1;
sbit CLK=P1^2;
sbit MANU=P1^3;
sbit SAY=P1^4;
sbit DATE=P1^5;
sbit restchip=P1^6;
sbit PLAY=P1^7;
uchar xdata i=0,j=0,count=0;
uint xdata dat;
//uchar xdata
uint xdata time_buf[17];
uint xdata set_buf[17];
uchar code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
uchar code speak_buf[]=
{0x00,0x01,0x02,0x03,0x04,0x05,
0x06,0x07,0x08,0x09,0x0a,0x0b,
0x0c,0x0d,0x0e,0x0f,0x10,0x11};
uchar xdata spea[15];
/*延时程序*/
void delay(uchar t)
{
uchar m,n,s;
for(m=t;m>0;m--)
{ for(n=20;n>0;n--)
for(s=248;s>0;s--);}
}
/*设置时钟*/
void settime()
{
REG_B=0XFA;
TM_second=time_buf[5];
TM_minute=time_buf[4];
TM_hour=time_buf[3];
TM_day=time_buf[2];
//TM_week=time_buf[4];
TM_month=time_buf[1];
TM_year=time_buf[0];
REG_B=0X7A;}
/*读时钟芯片中的数据*/
read_time()
{uchar xdata a;
do{a=REG_A;}
while((a&0x80)==0x80);
time_buf[11]=AM_second;
time_buf[10]=AM_minute;
time_buf[9]=AM_hour;
time_buf[8]=TM_day;
time_buf[7]=TM_month;
time_buf[6]=TM_year;
time_buf[5]=TM_second;
time_buf[4]=TM_minute;
time_buf[3]=TM_hour;
time_buf[2]=TM_day;
time_buf[1]=TM_month;
time_buf[0]=TM_year;
}
/*此子程序输入的是两个八位的数据
前面的是命令后面的是数据*/
void send_led(uchar com,uchar dat)
{
uchar ADS,n,m;
LOAD=0;
n=0;
while(n<16)
{
if(n<8)
ADS=com;
else
ADS=dat;
for(m=8;m>=1;m--)
{
DIN=ADS&0x80;
ADS<<=1;
CLK=1;
CLK=0;
}
n=n+8;
}
LOAD=1;
}
/*发送时钟数据到数码管驱动芯片*/
send_time(uchar a,uchar b)
{ uchar n,m=0;
for(n=a;n<=b;n++)
{m=m|0x01;
send_led(m,table[speak_buf[n]]);
}
}
/*打开时钟芯片*/
void start_time()
{
restchip=0;
restchip=1;
REG_A=0x2f;
REG_B=0xfa;
}
/*报时子程序*/
speak(uchar a)
{
PLAY=0;
P3=P3|a;
delay(20);
PLAY=1;
P3=P3|0xff;
}
/*time_buf[]转spea[]程序*/
chan(uint a)
{
while(a/10)
{spea[j]=a%10;
a=a/10;
j++;
if(j==14)
{j=0;}}
spea[j]=a;
}
/*---------------*/
ti_sp()
{uchar n;
for(n=0;n<6;n++)
{chan(time_buf[n]);}
}
/*-------------*/
set_sp()
{uchar n;
for(n=0;n<6;n++)
{chan(set_buf[n]);}
}
/*报时缓冲子程序*/
speak_huan()
{uchar n;
for(n=0;n<14;n++)
{ti_sp();
send_time(8,13);
switch(n)
{case 3:speak(speak_buf[n]),speak(0x0b);break;
case 5:speak(speak_buf[n]),speak(0x0c);break;
case 7:speak(speak_buf[n]),speak(0x0d);break;
case 9:speak(speak_buf[n]),speak(0x0e);break;
case 11:speak(speak_buf[n]),speak(0x0f);break;
case 13:speak(speak_buf[n]),speak(0x10);break;
default:if(n<3) speak(speak_buf[n]);break;}
if((n==4)||(n==6)||(n==8)||(n==10)||(n==12))
{if(spea[n]==0)
continue;
else if(spea[n]==1)
{speak(0x0a);}
else
{speak(speak_buf[n]);
speak(0x0a);
}
}
}}
/*显示日历子程序 */
reli()
{uchar n,m;
for(n=7,m=12;n>=0;n--,m--)
{read_time();
send_time(n,m);
speak(0x11);
delay(20);
}}
/*数据缓冲和数据上限设定*/
can(uint a,uint b)
{if(dat==b)
{dat=a;}
if(count==1)
{time_buf[i]=dat;
ti_sp();
if(i<=4)
send_time(8,13);
else
send_time(0,7);
}
else if (count==2)
{set_buf[i]=dat;
set_sp();
if(i<=4)
send_time(8,13);
else
send_time(0,7);
}
}
/*按键识别子程序*/
kk()
{if(DATE==0)
{delay(2);
if(DATE==0)
i++;
if(i==8)
{i=0;}}
if(SAY==0)
{delay(2);
if(SAY==0)
{if(count==1)
dat=time_buf[i];
else
dat=time_buf[i+6];
dat++;
switch(i)
{case 0:can(0,60);break;
case 1:can(0,60);break;
case 2:can(0,24);break;
//case 3:can(0,7);break;
case 3:can(0,30);break;
case 4:can(0,12);break;
case 5:can(2004,2009);break;
}
}}}
/*--------------------------*/
void key(void)
{while(1)
{ if(MANU==0)
{ delay(2);
if(MANU==0)
{count++;
if(count==3)
count=0;
if(count==1)
kk();
if(count==2)
kk();
if(count==0)
{read_time();
ti_sp();
send_time(8,13);}
}
}
if(SAY==0)
{delay(2);
if(SAY==0)
{ti_sp();
speak_huan();}}
if(DATE==0)
{delay(2);
if(DATE==0)
{ti_sp();
reli();}}}}
/*主函数*/
main(void)
{
start_time();
send_led(0x0c,0x01);//停机方式------很重要
send_led(0x09,0x00);//译码模式:不译码
send_led(0x0a,0x08);//亮度:中
send_led(0x0b,0x07);//扫描界限:全部扫描
while(1)
{ read_time();
ti_sp();
send_time(8,13);
if((MANU==0)||(SAY==0)||(DATE==0))
{delay(2);
if((MANU==0)||(SAY==0)||(DATE==0))
key();
}
}
}
数字钟51单片机程序.zip
版权申诉
198 浏览量
2022-06-30
00:37:16
上传
评论
收藏 2KB ZIP 举报
卷积神经网络
- 粉丝: 338
- 资源: 8460
最新资源
- 基于QT+C++的智能云监护仪项目,能够实时显示使用者心电、血氧、血压波形及其它各种参数+源码(毕业设计&课程设计&项目开发)
- 基于java开发的app接收硬件端传输的心音信号,具有显示心音波形,发出心音的功能+源码(毕业设计&课程设计&项目开发)
- Python 程序语言设计模式思路-行为型模式:职责链模式:将请求从一个处理者传递到下一个处理者
- 9241703124789646.16健身系统2.apk
- postgresql-16.3-1-windows-x64.exe
- Python 程序语言设计模式思路-结构型模式:装饰器讲解及利用Python装饰器模式实现高效日志记录和性能测试
- 基于YOLOv5和DeepSORT的多目标跟踪仿真与记录
- Python 程序语言设计模式思路-创建型模式:原型模式:通过复制现有对象来创建新对象,面向对象编程
- 卸载软件geek卸载软件geek
- Python 程序语言设计模式思路-创建型模式:单例模式,确保一个类的唯一实例(装饰器)面向对象编程、继承
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈