(文末附资料)
本系统是由AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压环境中工作;时钟电路由内部时钟电路外接晶振提供,它是一种高性能、低功耗、带RAM的可随时调整时钟电路,工作电压为3V~5V;所以采用DS1302作为本设计的日历芯片;显示部份使用LCD1602B液晶模块进行数字显示,1602B液晶模块可以显示2行16个字符,有8位数据总线D0—D7,和RS、R/W、EN三个控制端口,工作电压为5V,并且带有字符对比度调节和背光。该模块也可以只用D4-D7作为四位数据分两次传送,这样就可以节省MCU的I/O口资源,系统主要由晶振电路、复位电路、时钟电路部分、中央处理单元、晶显示部分组成,单片机数字时钟的设计流程如图2-1所示。
原理框图
原理图:
时钟电路
时钟电路为整个单片机系统产生时间基准,是单片机系统必须的部分;本系统采用美国DALLAS公司推出的DS1302实时时钟芯片,工作电压为2.5V-5.5V,采用三线接口与CPU进行同步通信,并可采用突发式一次传送多个字节的时钟信号或RAM数据,该芯片是采用串行方式的实时时钟芯片,串行方式的实时时钟芯片大多数是将地址线、数据线、控制线合为一根串行传输数据的传号线,这种方式的有点是信号线少、电路连接简单、节省系统资源和电路板的面积,缺点是程序编写复杂、工作量比较大,且操作速度较慢,接下来我们来分析一下DS1302的性能与原理。
DS1302的性能:
、 计算2100年之前的秒、分、时、日、星期、月和年,能进行闰年调整;
B、31字节数据RAM;
C、引脚与TTL兼容;
D、工作电流小于300nA,有备份电源和涓流充电能力;
DS1302引脚定义:
I/O:数据输入/输出引脚
SCLK:串行时钟输入引脚
RST复位引脚
GND:接地引脚
Vcc1、Vcc2:工作电源、备份电源引脚
X1、X2:晶振接入管脚。晶振频率为32.768KHz。
液晶LCD1602显示电路
1602B液晶模块可以显示2行16个字符,有8位数据总线D0—D7,和RS、R/W、EN三个控制端口,工作电压为5V,并且带有字符对比度调节和背光。该模块也可以只用D4-D7作为四位数据分两次传送,这样就可以节省MCU的I/O口资源,液晶LCD1602引脚情况如下表(2-2-2)所示;液晶LCD1602最小系统图如2-2-1-2所示。
程序设计流程图
程序源代码
#include //头文件
#include
#define uchar unsigned char //宏定义
#define uint unsigned int //宏定义
#define fmq RD
sbit key1=P2^0; //位声明 //MODIFIED
sbit key2=P2^1;
sbit key3=P2^2;
sbit key4=P2^3;
uchar code table[]={0x3f,0x06,0x5b,//数码管显示的数值
0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,
0xbf,0x86,0xdb,//带小数点的数值
0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
void plus(); //函数声明
void minus();
void sint();
uchar table_1[6]; //定义数组,数组内含有6个数值
uchar table_2[6];
uchar shi=1,fen=1,miao=30; //显示初始值
uchar shi1,fen1,miao1,shi2,fen2,miao2,shi3,fen3,miao3;//定义全局变量
uchar flag,flag1,flag2,cnt,cnt1,count;//定义全局变量
void delay(uchar i) //延时函数,用于动态扫描数码管
{
uchar x,y;
for(x=i;x>0;x--)
for(y=110;y>0;y--);
}
void init() //初始化函数
{
TMOD=0X21; //工作方式1
TH0=(65536-50000)/256; //定时时间为:50ms
TL0=(65536-50000)%256;
ET0=1; //打开定时器
EA=1; //开总中断
TR0=1; //启动定时器
SCON = 0x50; //0101 0000 SM1SM2=10,方式二 REN=1允许接受 (串口初始化)
TH1 = 0xFD;
TR1 = 1; //启动T/C1
ES = 1;
}
void display() //显示子函数,用于显示时间数值
{
uchar i,j;
table_1[0]=miao%10; //分离秒的各位与十位
table_1[1]=miao/10;
table_1[2]=fen%10+11; //分离分的各位与十位
table_1[3]=fen/10;
table_1[4]=shi%10+11; //分离时的各位与十位
table_1[5]=shi/10;
j=0x7f; //从秒到时的扫描
for(i=2;i<6;i++)
{
P2=j;
P0=table[table_1[i]];//显示数值
delay(10);
j=_cror_(j,1);//循环右移
}
}
void display_1() //显示子函数,用于显示定时时间
{
uchar i,j;
table_2[0]=miao2%10; //以下含义同上
table_2[1]=miao2/10;
table_2[2]=fen2%10+11;
table_2[3]=fen2/10;
table_2[4]=shi2%10+11;
table_2[5]=shi2/10;
j=0x7f;
for(i=2;i<6;i++)
{
P2=j;
P0=table[table_2[i]];
delay(10);
j=_cror_(j,1);
}
}
void shijian() //时间子函数
{
if(flag>=20) //判断是否到一秒
{
flag=0; //到了,则标志位清零
miao++; //秒加1
if(miao>=60) //判断秒是否到60s
{
miao=0;//到了,则清零
fen++; //分加1
if(fen>=60) //以下含义同上 //MODIFIED
{
fen=0;
shi++;
if(shi>23)
shi=0;
}
}
}
}
.
链接:https://pan.baidu.com/s/1wd01MOkXtLbhy2d0I5lFMA
提取码:rng7
.