基于单片机的数字钟
单片机
课程设计
专业班级:
学生姓名:
学 号:
指导教师:
题目名称: 基于单片机的数字钟的设计
单片机系统
课 程 设 计
课程设计名称: 基于单片机的数字钟的设计 专 业 班 级 :
学 生 姓 名
学 号 :
指 导 教 师 :
课程设计地点:
课程设计时间:
单片机系统 课程设计任务书
目录
一、设计课题任务........................................................................................................ 1
1.1设计题目.......................................................................................................... 1
1.2 功能要求说明................................................................................................. 1
1.3 总体方案介绍及工作原理............................................................................. 1
二、硬件系统的设计.................................................................................................... 2
2.1 系统各功能模块介绍..................................................................................... 2
2.1.1 AT89C52控制模块 .............................................................................. 2
2.1.2复位信号及其产生............................................................................. 3
2.1.3时钟电路............................................................................................... 3
2.1.4MAX232 ................................................................................................ 4
2.1.5时钟电路DS1302 ................................................................................ 5
2.1.6键盘功能模块....................................................................................... 7
2.1.7数码管显示模块................................................................................... 7
2.1.5 二极管显示模块.................................................................................. 7
2.2 系统电路图..................................................................................................... 8
2.3 系统的元器件清单......................................................................................... 8
三、软件系统的设计.................................................................................................... 8
3.1使用单片机资源介绍...................................................................................... 8
3.2 软件系统各功能模块介绍............................................................................. 9
3.2.1 独立式键盘模块.................................................................................. 9
3.2.2 数码管显示模块.................................................................................. 9
3.2.3 整点提示,半整点提示...................................................................... 9
3.3 软件系统程序流程框图............................................................................... 10
四、软件系统的程序.................................................................................................. 11
五、心得体会.............................................................................................................. 20
六、参考文献.............................................................................................................. 21
附录:............................................................................................................................ 1
基于单片机的数字钟的设计
摘要:
AT89C52单片机是一款应用广泛、功能强大的八位单片机。本设计是由单片机AT89C52作为核心,通过单片机使电子钟具有调节显示时分秒的功能,电子钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显示电子钟直观、无机械传动装置等优点。它的计时周期为24小时,显示满刻度为23时59分59秒,另外应有校时功能。K1用来切换时间日期;K3用来循环调节时间的小时;K5用来循环调节时间的分钟;K2调节年、增大;K4调节年、减小;K6用来循环调节月;K8用来循环调节日期,以便对时钟进行校对。
关键词: 电子钟 单片机 时间 日期 可调
一、设计课题任务
1.1设计题目
设计一个可调的电子钟。
1.2 功能要求说明
(1)屏幕保护(P. 显示);
(2)时、分、秒之间以及年、月、日之间都用“-”分割;
(3)小时和分钟以及年月日可调;
(4)整点时LED 灯闪烁,半整点时LED 灯闪烁,整点是闪烁的频率快。
1.3 总体方案介绍及工作原理
单片机控制示意图如下图1.1所示。
电子钟的总体功能原理是以AT89C52单片机为主要的控制核心,通过外接7个独立式键盘作为控制信号源,八个七段数码管作为显示器件,通过时钟芯片在数码管上显示出来,通过不同的按键来观看和调节各种数据。
图1.1单片机控制示意图
二、硬件系统的设计
2.1 系统各功能模块介绍
2.1.1 AT89C52控制模块
考虑到设计功能需要,控制器的功能用于外部键盘信号的接收和识别、数码管的显示控制,定时器应用等,我们选择了学习过的AT89C52系列单片机,具有反应速度极快,工作效率特高的特点。
AT89C52 主要性能与MCS-51单片机产品兼容、8K 字节在系统可编程Flash 存储器,1000次擦写周期, 全静态操作:0Hz ~33Hz 三级加密程序存储器 32个可编程I/O口线、三个16位定时器/计数器八个中断源、全双工UART 串行通道、低功耗空闲和掉电模式、掉电后中断可唤醒、看门狗定时器、双数据指针、掉电标识符。
AT89C52 是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。另外,AT89C52可降至0Hz 静态逻辑操作,支持2种软
件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM 、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM 内容被保存,振荡器被冻结, 单片机一切工作停止,直到下一个中断或硬件复位为止。
2.1.2复位信号及其产生
RST 引脚是复位信号的输入端。复位信号是高电平有效,其有效时间应持续24个振荡周期(即二个机器周期) 以上。若使用颇率为12MHz 的晶振,则复位信号持续时间应超过4us 才能完成复位操作。复位电路如图2.1所示。
图2.1
2.1.3时钟电路
STC89C52内部有一个用于构成振荡器的高增益反相放大器, 引脚RXD 和
TXD 分别是此放大器的输入端和输出端。时钟可以由内部方式产生或外部方式产生。内部方式的时钟电路如图所示,在RXD 和TXD 引脚上外接定时元件,内部振荡器就产生自激振荡。定时元件通常采用石英晶体和电容组成的并联谐振回路。晶体振荡频率可以在1.2~12MHz 之间选择,电容值在5~30pF 之间选择,电容值的大小可对频率起微调的作用。
图2.2内部时钟方式电路
2.1.4MAX232
芯片是专门为电脑的RS-232标准串口设计的单电源电平转换芯片, 使用+5v单电源供电。
图2.3MAX232引脚图
引脚介绍:
第一部分是电荷泵电路。由1、2、3、4、5、6脚和4只电容构成。功能 是产生+12v和-12v 两个电源,提供给RS-232串口电平的需要。 第二部分是数据转换通道。由7、8、9、10、11、12、13、14脚构成两 个数据通道。其中13脚(R1IN )、12脚(R1OUT )、11脚(T1IN )、14脚(T1OUT ) 为第一数据通道;8脚(R2IN )、9脚(R2OUT )、10脚(T2IN )、7脚(T2OUT )为第二数据通道;TTL/CMOS数据从T1IN 、T2IN 输入转换成RS-232数据从T1OUT 、T2OUT 送到电脑DB9插头;DB9插头的RS-232数据从R1IN 、R2IN 输入转换成TTL/CMOS数据后从R1OUT 、R2OUT 输出。第三部分是供电。15脚GND 、16脚VCC (+5v)。
主要特点:
1、符合所有的RS-232C 技术标准 ;
2、只需要单一 +5V电源供电;
3、片载电荷泵具有升压、电压极性反转能力,能够产生+10V和-10V 电 压V+、V-;
4、功耗低,典型供电电流5mA ;
5、内部集成2个RS-232C 驱动器 ;
6、内部集成两个
RS-232C 接收器下图为MX232双串口的连接图,可以分别接单片机的串行通信口或者实验板的其它串行通信接口, 保证了能正常的下载调试程序,设计单片机与PC 间通信接口电路 7、程序下载口芯片及电路: STC89C52单片机支持SPI 技术,可以通过3根线进行在线下载。MAX232是下载口电路的核心芯片,它完成计算机与单片机电平一致的转换。其电路如图所示:
图2.4程序下载口电路
2.1.5时钟电路DS1302
1、DS1302控制字的介绍
表2-1 DS1302控制字的介绍
控制字的最高有效位(位7) 必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。
位6:如果为0,则表示存取日历时钟数据,为1表示存取RAM 数据: 位5至位1 (A4~A0):指示操作单元的地址;
位0(最低有效位):如为0,表示要进行写操作,为1表示进行读操作。 读数据:读数据时在紧跟8位的控制宇指令后的下一个SCLK 脉冲的下降沿,读出DS1302的数据,读出的数据是从最低位到最高位。
写数据:控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK 时钟 的上升沿时数据被写入DS1302, 数据输入也是从最低位(0位) 开始。
位0(最低有效位):为1表示进行读操作。如为0,表示要进行写操作,控制字后SCLK 下降沿读数据SCLK 上升沿写数据。
2、DS1302的数据输入和输出控制 :
(1)复位以及时钟控制: 所有的数据传输在R5T 置一时进行(反复强调) ,RST 输入信号有两种功能:
首先,RST 接通控制逻辑,允许地址/命令序列送入移位寄存器; 其次,RST 提供终止单字节或多字节数据的传送手段。当RST 为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST 置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc>=2. 5V之前,RS'T 必须保持低电平。只有在SCLK 为低电平时,才能将RST 为高电平。I/O为串行数据输入输出端(双向) ,后面有详细说明。SCLK 始终是输入端。
(2)数据输入: 经过8个时钟周期的控制字节的输入,一个字节的输入将在下8个时钟周期 的上升沿完成,数据传输从字节最低位开始。 (3)数据输出: 经过8个时钟周期的控制读指令的输入,控制指令串行输入后,一个字节的数据 将在下个8个时钟周期的下降沿被输出,注意第一位输出是在最后一位控制指令 所在脉冲的下降沿被输出,要求RST 保持位高电平。
3、DS1302操作指令介绍
表2-2 DS1302操作指令介绍
2.1.6键盘功能模块
根据系统的基本的要求,基于时间的观看和设定等功能,采用由八个键构成的独立式键盘分别接在AT89C52单片机的P3.0-P3.7口,分别对应K1,K2,K3,K4,K5,K6,K7,K8,非常的方便,同时相对于独立式键盘大大节省了空间,在软件的设计时带来了极大的方便,使程序简易明了,可读性强。
本次设计中,七个功能键分别定义为K1,K2,K3,K4,K5,K6,K8。K1用来切换时间日期;K3用来循环调节时间的小时;K5用来循环调节时间的分钟;K2调节年、增大;K4调节年、减小;K6用来循环调节月;K8用来循环调节日期,以便用于时间显示与控制,操作起来十分的清晰与方便。
2.1.7数码管显示模块
显示模块要具有显示“小时-分钟-秒”, “年-月-日”的功能。数码管的八个位控口和段控制线已经在开发板的内部合成,接在AT89C52单片机的P0口线上,从左到右顺序连接数码管的地位到高位,P2.3接段码,P2.4接位码,这样与传统的P0接位控口P2接段空口节省了6个I/O口。
2.1.5 二极管显示模块
二极管采用共阳接法, 其负极接在P1口线上。整点闪烁一分钟,半整点闪躲一分钟,半整点闪烁的速度比整点的慢。
2.2 系统电路图
图2.5 电路原理图
2.3 系统的元器件清单
本系统中所用到的元件如表2.1所示。
表2.3 系统元器件表
三、软件系统的设计
3.1使用单片机资源介绍
AT89C52的P0、P1、P2、P3口作为输入输出口,: P0口接数码管,P2.3接段码,P2.4接位码。
P1口接8位LED 。
P3接独立按键K1,K2,K3,K4,K5,K6,K8。 P2.5,P2.6,P2.7与DS1302时钟芯片相连。 XTAL1、XTAL2:晶振输入 RST: 复位输入
片内资源主要为:定时器/计数器T0, 定时器/计数器T1, 定时器中断0。
3.2 软件系统各功能模块介绍
3.2.1 独立式键盘模块
独立式键盘软件设计通过主程序中key 去执行键盘扫描, 进行时钟的调节。单片机P3口在复位后保持高电平, 当键按下相应口线为低电平,此时CPU 做初期判断,之后延时10ms ,确定为按键后等待键松,之后执行程序。达到通过键功能程序的执行,完成对应的操作。
3.2.2 数码管显示模块
数码管显示是通过主程序中一直需要工作的部分来实现的,由于数码管动态显示,所以在执行其他的程序的时候依然要。数码管的段控由单片机改变P2口相应位电平来实现,为实现不同的显示功能,设置了不同的显示缓冲单元,通过控制标志位控制。数码管的位控由CPU 改变P0口相应位电平来实现,基于人的视觉延迟性,通过从右到左的循环保证所有数码管都被点亮。
3.2.3 整点提示,半整点提示
在软件的设计中整点提示, 提示模块是通过二极管的交替显示来告诉整点或半整点是否已到,通过闪烁频率的不同来区别整点和半整点,整点时LED 闪烁的比较快。
图3.1键盘扫描流程图
3.3 软件系统程序流程框图
3.2显示程序流程图
四、软件系统的程序
设计项目:电子钟
功能: USBRS232与计算机相连下载程序:开始 调时分秒/调年月日/整点(半整点)闪烁 K1键:切换页面
K3用来循环调节时间的小时; K5用来循环调节时间的分钟; K2调节年、增大; K4调节年、减小; K6用来循环调节月; K8用来循环调节日。 软件系统的程序
#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include "ds1302.h"
#define KeyPort P3 //定义按键端口
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换 sbit LATCH1=P2^3;//定义锁存使能端口 段锁存 sbit LATCH2=P2^4;// 位锁存 bit ReadTimeFlag;//定义读时间标志 unsigned
char
code
dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned
char
code
dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮, 即位码
unsigned char TempData[8]; //存储显示值的全局变量
void DelayUs2x(unsigned char t);//us级延时函数声明 void DelayMs(unsigned char t); //ms级延时
void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数
unsigned char KeyScan(void);//键盘扫描 void Init_Timer0(void);//定时器初始化 void displaytime(void); void displaydate(void);
/*------------------------------------------------ 主函数
------------------------------------------------*/ void main (void) { unsigned char num,displaynum; Init_Timer0(); Ds1302_Init(); //Ds1302_Write_Time(); while (1) //主循环 { num=KeyScan(); //按键扫描 switch(num) {
case 1: displaynum++;
if(displaynum==2) displaynum=0;
break;
case
2:
time_buf1[1]++;if(time_buf1[1]==100)time_buf1[1]=0;
case
Ds1302_Write_Time();break; //正常日期 年 加1
3:
time_buf1[4]++;if(time_buf1[4]==24)time_buf1[4]=0;
Ds1302_Write_Time();break; //正常时间 小时 加
1
case
time_buf1[1]--;if(time_buf1[1]==0)time_buf1[1]=99;
Ds1302_Write_Time();break; //正常日期 年 减1
case5:
time_buf1[5]++;if(time_buf1[5]==60)time_buf1[5]=0;
Ds1302_Write_Time();break;//分加1
case
time_buf1[2]++;if(time_buf1[2]==13)time_buf1[2]=1;
Ds1302_Write_Time();break; //正常日期 月 加1
case 7: break;
case
time_buf1[3]++;if(time_buf1[3]==32)time_buf1[3]=1;
Ds1302_Write_Time();break; //正常日期 日 加1
default: break;
}
if(ReadTimeFlag==1)
{
ReadTimeFlag=0; Ds1302_Read_Time();
if(displaynum==0) //显示时间
{
4:
6:
8:
入"-"
入"-"
TempData[0]=dofly_DuanMa[time_buf1[4]/10]; //时
TempData[1]=dofly_DuanMa[time_buf1[4]%10]; TempData[2]=0x40;
//加
}
TempData[3]=dofly_DuanMa[time_buf1[5]/10]; //分 TempData[4]=dofly_DuanMa[time_buf1[5]%10]; TempData[5]=0x40;
TempData[6]=dofly_DuanMa[time_buf1[6]/10]; //秒 TempData[7]=dofly_DuanMa[time_buf1[6]%10]; displaytime();
if(time_buf1[5]==00)//整点LED 以T=100ms周期闪烁 { } else { }
P1=1; P1=~P1; DelayMs(50);
else if(displaynum==1)//显示日期 {
TempData[0]=dofly_DuanMa[time_buf1[1]/10];
//
年
TempData[1]=dofly_DuanMa[time_buf1[1]%10];
TempData[2]=0x40;
//加
TempData[3]=dofly_DuanMa[time_buf1[2]/10]; //月 TempData[4]=dofly_DuanMa[time_buf1[2]%10]; TempData[5]=0x40;
TempData[6]=dofly_DuanMa[time_buf1[3]/10]; //日 TempData[7]=dofly_DuanMa[time_buf1[3]%10];
displaydate();
}
} }
}
/*------------------------------------------------ uS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M ,精确延时请使用汇编, 大致延时 长度如下 T=tx2+5 uS
------------------------------------------------*/ void DelayUs2x(unsigned char t) { while(--t); }
/*------------------------------------------------ mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M ,精确延时请使用汇编 ------------------------------------------------*/ void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
}
}
/*------------------------------------------------
显示函数,用于动态扫描数码管
输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
如输入0表示从第一个显示。
Num表示需要显示的位数,如需要显示99两位数值则该值输入2
------------------------------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{
static unsigned char i=0;
DataPort=0; //清空数据,防止有交替重影 DelayUs2x(245);
LATCH1=1; //段锁存
LATCH1=0;
DataPort=dofly_WeiMa[i+FirstBit]; //取位码
LATCH2=1; //位锁存
LATCH2=0;
DataPort=TempData[i]; //取显示数据,段码
LATCH1=1; //段锁存
LATCH1=0;
i++;
if(i==Num)
}
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用
i=0; 多个定时器时不受影响
//TH0=0x00; //给定初值
//TL0=0x00;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
static unsigned int num;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
Display(0,8); // 调用数码管扫描
//重新赋值 2ms
num++;
if(num==50) //大致100ms
{
num=0;
ReadTimeFlag=1; //读标志位置1
}
}
/*------------------------------------------------
按键扫描函数,返回扫描键值
------------------------------------------------*/
unsigned char KeyScan(void)
{
unsigned char keyvalue;
if(KeyPort!=0xff)
{
DelayMs(10);
if(KeyPort!=0xff)
{
keyvalue=KeyPort;
while(KeyPort!=0xff);
switch(keyvalue)
{
case 0xfe:return 1;break;
case 0xfd:return 2;break;
case 0xfb:return 3;break;
case 0xf7:return 4;break;
case 0xef:return 5;break;
case 0xdf:return 6;break; case 0xbf:return 7;break; case 0x7f:return 8;break; default:return 0;break; } }
}
return 0;
}
/*------------------------------------------------
时间显示子程序
------------------------------------------------*/
void displaytime(void)
{
TempData[0]=dofly_DuanMa[time_buf1[4]/10];//时 //数据的转换, TempData[1]=dofly_DuanMa[time_buf1[4]%10];//因我们采用数码管0~9的显示, 将数据分开
TempData[2]=0x40; //加入"-"
TempData[3]=dofly_DuanMa[time_buf1[5]/10];//分
TempData[4]=dofly_DuanMa[time_buf1[5]%10];
TempData[5]=0x40;
TempData[6]=dofly_DuanMa[time_buf1[6]/10];//秒
TempData[7]=dofly_DuanMa[time_buf1[6]%10];
}
/*------------------------------------------------
日期显示子程序
------------------------------------------------*/
void displaydate(void)
{
TempData[0]=dofly_DuanMa[time_buf1[1]/10];//年
TempData[1]=dofly_DuanMa[time_buf1[1]%10];
TempData[2]=0x40; //加入"-"
TempData[3]=dofly_DuanMa[time_buf1[2]/10];//月
TempData[4]=dofly_DuanMa[time_buf1[2]%10];
TempData[5]=0x40;
TempData[6]=dofly_DuanMa[time_buf1[3]/10];//日
TempData[7]=dofly_DuanMa[time_buf1[3]%10];
}
五、心得体会
在做课程设计的过程中,通过理论联系实际,不断的学习和总结经验,巩固了所学的知识,提高了处理实际问题的能力。我的理论和实践水平都有了较大的提高。在本设计中,我熟练掌握了单片机硬件设计,数码管显示以及独立按键的使用和LED 灯的显示。本次设计中最难的部分就是程序的书写与调试,通过这次课程设计,我不仅学会如何将所学专业知识运用到实际生活中,还学会如何克服未知的困难,解决难题的方法,为将来毕业设计的顺利进行打下了基础。创新,是要我们学会将理论很好地联系实际,并不断地去开动自己的大脑,从为人类造福的意愿出发,做自己力所能及的,别人却没想到的事。使之不断地战胜别人,超越前人。同时,更重要的是,我在这一设计过程中,学会了坚持不懈,不轻易言弃。设计过程,也好比是我们人类成长的历程,常有一些不如意,也许这就是
在对我们提出了挑战,勇敢过,也战胜了,胜利的钟声也就一定会为我们而敲响。
这次设计过程中也让我认识到了很多不足,在今后的学习过程中我一定努力补缺补漏,多实践,将理论知识更好地应用于实践。
最后感谢各位指导老师的指导。
六、参考文献
[1] 康华光.电子技术基础(模拟部分)(第5版)[M].北京:高等教育出版社,2004
[2] 阎石.数字电子技术基础(第5版)[M].北京:高等教育出版社,2006
[3] 陈光明. 电子技术书课程设计与综合实训[M].北京航空航天出版社. 2007
[4]LY—51S 视频教程
[5] 张迎新.单片微型计算机原理、应用及接口技术.北京:国防工业出版社,2004
[6]张迎新等,单片机初级教程. 北京;航空航天大学出版社,2000.8
[7] 皮大能等. 单片机课程设计指导书. 北京:北京理工大学出版社,2010
[8] 李林功.单片机原理与应用——基于实例驱动和Proteus 仿真.北京:科学出版社,2011
[9]张迎新. 单片微型计算机原理及接口技术. 北京:国防工业出版社,1993.12
附录:
实物连接图如下图所示: