简易时钟设计讲解.docx
- 文档编号:6628419
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:30
- 大小:408.22KB
简易时钟设计讲解.docx
《简易时钟设计讲解.docx》由会员分享,可在线阅读,更多相关《简易时钟设计讲解.docx(30页珍藏版)》请在冰豆网上搜索。
简易时钟设计讲解
等级:
课程设计
课程名称
单片机原理与应用课程设计
课题名称
简易时钟设计
专业
电子信息工程
班级
电信1301班
学号
31
姓名
彭颗
指导老师
林国汉
2016年3月25日
电气信息学院
课程设计任务书
课题名称
简易时钟设计
姓名
彭颗
专业
电子信息工程
班级
1301
学号
01
指导老师
林国汉
课程设计时间
2016年3月14日-2016年3月25日(3、4周)
教研室意见
意见:
审核人:
一、任务及要求
设计任务:
本课题要求以MCS-51系列单片机为核心,设计一个数字时钟。
(1)具有时钟和跑表功能,用LED或者液晶显示器进行显示;
(2)具有时钟调整功能
(3)具有闹钟功能,(4)*能将闹钟时间在AT24C02保存(5)*其它功能
设计要求:
(1)确定系统设计方案;
(2)进行系统的硬件设计;(3)完成应用程序设计;
(4)应用系统的硬件和软件的调试。
二、进度安排
第一周:
周一:
集中布置课程设计任务和相关事宜,查资料确定系统总体方案。
周二~周三:
完成硬件设计和电路连接
周四~周日:
完成软件设计
第二周:
周一~周三:
程序调试
周四~周五:
设计报告撰写。
周五进行答辩和设计结果检查。
三、参考资料
1、51单片机C语言教程郭天祥编著电子工业出版社
2、单片机原理与应用第2版王迎旭主编机械工业出版社
3单片机原理与应用及C51程序设计杨加国清华大学出版社,2009
1总体方案设计
1.1设计方案
(1)、通过单片机内部的计数/定时器,采用软件编程来实现时钟计数,一般称为软时钟,这种方法的硬件线路简单,系统的功能一般与软件设计相关,通常用在对时间精度要求不高的场合。
(2)、采用时钟DS1302芯片,它的功能强大,功能部件集成在芯片内部,具有自动产生时钟等相关功能,硬件成本相对较高;软件编程简单,通常用在对时钟精度要求较高的场合。
方案选择:
最终这次我选择的是方案
(1),因为方案
(1)硬件电路简单,操作更方便简单。
1.2设计思路及系统框架图
我们采用的是AT89C51作为时钟控制芯片。
电子时钟主要由时钟显示模块、校时模块、秒表模块和闹钟模块组成。
其中需要对时,分,秒的数值进行操作,并且秒计算到60的时候,要自己清零并向分进1;分计算到60的时候,要自己清零并向时进1,时进到24的时候,要清零,这样才能进行循环计时。
秒表模块需要重新显示一个秒表界面,同时也应该需要通过另外一个定时器T1对秒表进行操作,从而保证在秒表界面,时钟显示模块的时间还在进行。
闹钟模块则需要设计闹钟时间,当设计的闹钟时间和时钟的时间相等,蜂鸣器响起,从而达到闹钟功能。
此外还要实现对时间的调整功能,AT89C51的P3.2、P3.3、P3.5外接三个独立按键,当按下P3.2按键时,系统进行功能切换,依次可以切换成时钟功能,秒表功能,时钟设置功能,闹钟设置功能;当按下P3.3按键时,时钟显示时对显示的数码管进行加一的功能,或者在进入秒表功能时,实现启动和暂停功能;当按下P3.5按键时,对显示的数码管进行移位的功能,达到调整时间的目的。
或者在进入秒表后,实现清零功能。
在单片机内部构建三个模块:
控制模块、译码模块、定时模块,用以实现自动计数、译码显示功能。
单片机外部构建四个电路:
时钟电路、复位电路、外部按钮电路、显示电路,用以实现对单片机内部计数控制以及译码输出的正确显示。
该电子时钟是将秒、分、时显示在人的视觉器官面前的一种计时装置。
故将计时周期设置为24小时,当显示满刻度是23时59分59秒时,数码管显示为0。
为了确保时间正常校对,在系统中设有校对按钮,用以实现对数码管显示的正确调整。
如图1所示为系统框架图
图1系统框架图
2硬件电路设计
2.1单片机AT89C51
AT89C51是一种带4K字节FLASH存储器的低电压、高性能CMOS的8位微处理器,俗称单片机。
AT89C51是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
如图2所示为AT89C51的管脚图。
图2AT89C51管脚图
由于电路原理中只用到单片机的p0、p1、p2口,所示下面对这三个端口进行详细介绍。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P0口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。
本次课设中我P0口接的是74LS245的输入和8个电阻。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为低八位地址接收。
本次P1口接的数码管的6个位选端口。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
本次课设中P2口接的是开关和蜂鸣器。
2.2复位电路和时钟电路
计算机在启动运行时都需要复位,复位时使中央处理器CPU和内部其他部件处于一个确定的初始状态,从这个状态开始工作。
AT89C51单片机有一个复位引脚RST,高电平有效。
在时钟电路工作以后,当外部电路使得RST端出现两个机器周期(24个时钟周期)以上的高电平,系统内部复位。
复位有两种方式:
上电复位和按钮复位。
在此次的设计中,我采用按键复位,只要RST保持高电平,AT89C51单片机将循环复位。
复位期间,ALE、PSEN输出高电平。
RST从高电平变为低电平后,PC指针变为0000H,使单片机从程序存储器地址为0000H的单元开始执行程序。
当单片机执行程序出错或进入死循环时,可按复位按钮重新启动。
在本次设计中,时钟电路设计就是采用内部方式,即利用芯片内部的振荡电路。
AT89C51单片机内部有一个用于构成振荡器的高增益反相放大器。
引脚XTAL1和XTAL2是高增益反相放大器的输入端和输出端。
这个高增益反相放大器将与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。
外接晶体振荡器以及电容C1和C2构成并联谐振电路,接在放大器的反馈回路中。
此系统电路的晶体振荡器的值为12MHz,我的电容为选取18pF。
如图3所示为复位和时钟电路。
图3复位电路
2.3LED显示电路和按键电路
图4LED显示电路和按键电路
在本次的设计中,采用的6位的数码管显示器。
数码管如果按照段数分可为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多了一个小数点的显示;如果按能够显示多少个“8”分类的话,也可以可分为1位、2位、4位等数码管,如果按照发光二极管单元的连接方式又可以分为共阳极数码管和共阴极数码管。
共阳极的数码管是将所有发光二极管的阳极接到一起后就形成公共阳极(COM)的数码管,共阳极数码管在应用时要将公共极(COM)接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。
共阴极数码管是将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴极数码管在应用时应将公共极(COM)接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。
独立式键盘是各按键相互独立,每个按键各接一根I/O接口线,每根I/O接口线的按键是不会影响其他的I/O接口线。
本次课设中按键K1、K2、K3分别接I0口P3.2、P3.3、P3.6,来控制数码管的显示。
如上图4所示
3软件设计
3.1主程序
先对显示单元和定时器/计数器初始化,然后重复调用数码管显示模块和按键处理模块,检测按键标志位K1_bit,则转入相应的功能程序。
3.2数码管显示模块
本设计有6个数码管,从右到左为时、分、秒。
在本系统中数码管显示采用软件译码动态显示。
在系统中从P0端口控制数码管的段选,输入数码管数组对数码管进行显示。
同时在P1端口对6位数码管实现位选。
由于本次课设要求时钟和秒表的功能,因为我分别写了两个数码管显示函数,两个功能显示的格式进行了更改。
3.3按键模块
本次设计按键模块我采用的是按键扫描,设置K1为功能切换键,设立一个模式切换的标志K1_bit,然后检测K1_bit的值来进行模式的切换,然后每个模式下都实现不同的功能。
当K1_bit=0时,显示时钟时间。
K1_bit=1时,显示秒表功能,按下K2可以实现开始/暂停功能,按下K3可以实现清零功能。
K1_bit=2时,进入时钟调整功能,按下K2可以实现闪现时长标记位加1功能,按下K3实现切换时长标志位。
K1_bit=3时,进入闹钟功能,K2,K3和在时钟调整时的功能一样。
如图5所示
图5按键模块
3.4定时器模块
T0用于计时,选中方式一,重复定时,定时时间设为50ms,定时时间到则中断,在中断服务程序中用一个计数器对50ms计数,计20次则对秒单元加一。
秒单元加到60则对分单元加一,同时秒单元清0;分单元加到60则对时单元加一,同时分单元清0;时单元加到24则对时单元清0,标志一天时间计满。
在对各单元计数的同时,把他们的值放到存储器单元的指定位置。
流程图如图6:
图6定时器框架图
4调试
4.1系统调试
单片机应用系统的调试包括硬件和软件两部分,但是他们并不能完全分开。
一般的方法是排除明显的硬件故障,再进行综合调试,排除可能的软/硬件故障。
硬件调试过程中注意数码管是共阴极还是共阳极,搞反了就会出现数码管乱码的现象。
软件程序的调试一般可以将重点放在分模块调试上,统调是最后一环。
软件调试可以采取离线调试和在线调试两种方式。
前者不需要硬件仿真器,可借助于软件仿真器即可;后者一般需要仿真系统的支持。
本次课题,Keil软件来调试程序,通过各个模块程序的单步或跟踪调试,使程序逐渐趋于正确,最后统调程序。
仿真部分采用protus6professional软件,此软件功能强大且操作较为简单,可以很容易的实现各种系统的仿真。
首先打开protus6professional软件,在元件库中找到要选用的所有元件,然后进行原理图的绘制;绘制好后再选择已经编译好的*.hex文件,选择运行,观察显示结果,根据显示的结果和课题的要求再修改程序,再运行查,直到满足要求。
4.2调试中遇到的问题及解决方法
在调试的过程我遇到了一个问题,当我在编写闹钟模块的时候,我定义一个闹钟函数,写好闹钟函数之后,我在主函数里面去调用的时候编译老是显示”重复定义”的错误,最后在请教老师的情况下,我得到了解决,把闹钟函数加进了主函数,闹钟功能得以实现。
5总结
通过这次课程设计,我学到了不少课本上没有的知识,也锻炼了自己的动手能力,将以前学过的零散的知识串到一起。
首先硬件方面,基本了解了电子产品的开发流程和所要做的工作。
基本掌握了PROTUES原理图的方法,并设计了一个单片机最小系统。
通过开发板的设计和硬件搭建的过程,使我对51系单片机的接口有了更深层次的理解,熟悉了一些单片机常用的外围电路引脚和连接方法。
并且我学会了分析问题解决问题的能力,加深了对所学理论知识的理解和运用。
我的动手能力得到了很大的提高,创新意识得到了锻炼。
设计主要用到的原件不多,最主要的是程序比较繁琐尤其是校时模块。
显示模块以前都有学过,所以想对来说较为简单。
这次设计就是让我们学以致用,将书本上学到的知识应用于实践。
虽然在设计中遇到了不少困难,在我们通过自己的各种方式解决问题的同时,也提升了自己的专业水平。
这次课程设计,我收获了很多,在设计过程中遇到了不少困难,都在同学老师的帮助下一步步得到解决。
我深深体会到团结合作,互相帮助是何等重要。
还加深了对51单片机系列知识及其系统的认识。
这个设计题目并不怎么新颖,但从中体现到了个系统开发设计的过程,让我们受益匪浅.在这次的设计中,让我更进一步的提高了动手能力,也重新复习了一次单片机的程序编程能力,加强了对编程能力的理解和对相应资料的查阅。
最后要感谢林国汉老师对我此次课设的悉心指导,使我的课设能实现相应的功能。
参考资料
1、51单片机C语言教程郭天祥编著电子工业出版社
2、单片机原理与应用第2版王迎旭主编机械工业出版社
3单片机原理与应用及C51程序设计杨加国清华大学出版社,2009
附录A原理图
附录B程序清单
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodeTab0[]=//定义数码管数组,没有小数点
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};
ucharcodeTab1[]=//定义数码管数组,有小数点
{
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef
};
sbitK1=P3^2;//模式选择键,本程序三种模式,分别是时间显示、秒表、时间设置
sbitK2=P3^3;//设置时间时加一/开始(暂停)秒表按键
sbitK3=P3^6;//切换设置位/清零秒表按键
sbitbeep=P2^6;
uinttimes=20,timemin=57,timeh=23;//分别定义三个变量表示闹钟的秒,分,时
voidDelay(ucharx);//延时函数
voidDisplay0();//时间显示函数
voidDisplay1();//秒表显示函数
voidDisplay2();//时间设置显示函数
voidDisplay3();//闹钟设置显示函数
voidInit();//中断初始化函数
voidMode_K1();//模式切换函数
voidKEY_MiaoBiao();//检测秒表操作按键
voidKEY_Time_Set();//检测时间设置按键
ucharHours=23,Minutes=56,seconds=55;//分别定义三个变量表示时、分、秒
ucharTime0_bit=0;//用于定时器0的溢出标志
bitSet_Time=0;//设置时闪烁时长的标志位
bitSet0=0;
bitSet1=0;//设置时间标志,确定是设置‘分’还设置‘时’
ucharK1_bit=0;//用于模式切换的标志
ucharMiao_Biao0,Miao_Biao1,Miao_Biao2,Miao_Biao3,Miao_Biao4;//用于秒表的变量
voidmain()
{
Init();//中断初始化
while
(1)//死循环
{
Mode_K1();//模式扫描
switch(K1_bit)//模式选择
{
case0:
{
Display0();//显示时间
break;
}
case1:
{
Display1();//显示秒表
KEY_MiaoBiao();//扫描秒表操作
break;
}
case2:
{
Display2();//设置时间时的显示程序,可闪烁定位
KEY_Time_Set();//扫描按键
break;
}
case3:
{
Display3();
if(K1_bit==3)//判断是否为闹钟设置模式
{
if(K2==0)//K2有按下(下同)
{
Delay(10);//延时消抖(下同)
if(K2==0)//再次检测是否为误按
{
if(Set1==0)
{
timemin++;//‘分’加1
if(timemin==60)//当'分'加到60时,重新赋值0
timemin=0;
}
else
{
timeh++;
if(timeh==24)//当'时'加到24时,重新赋值0
timeh=0;
}
while(!
K2);//按键松开检测,消除松开按键时的抖动干扰
}
}
if(K3==0)
{
Delay(10);
if(K3==0)
{
Set1=~Set1;//K3每按一次Set1取反,以确定是设置‘时’还是设置‘分’,Set0为0时设置‘分’,Set0为1时设置‘时’
while(!
K3);
}
}
}
if(times==seconds&&timemin==Minutes&&timeh==Hours)
{
beep=!
beep;
Delay(50);
}
while(times==seconds&&timemin==Minutes&&timeh==Hours)
break;
}
}
}
}
voidKEY_Time_Set()//设置时间时的按键扫描函数
{
if(K1_bit==2)//判断是否为时间设置模式
{
if(K2==0)//K2有按下(下同)
{
Delay(10);//延时消抖(下同)
if(K2==0)//再次检测是否为误按
{
if(Set0==0)//检测是设置‘时’还是分,Set0为0时设置‘分’,Set0为1时设置‘时’
{
Minutes++;//‘分’加1
if(Minutes==60)//当'分'加到60时,重新赋值0
Minutes=0;
}
else
{
Hours++;//‘时’加1
if(Hours==24)//当'时'加到24时,重新赋值0
Hours=0;
}
while(!
K2);//按键松开检测,消除松开按键时的抖动干扰
}
}
if(K3==0)
{
Delay(10);
if(K3==0)
{
Set0=~Set0;//K3每按一次Set0取反,以确定是设置‘时’还是设置‘分’,Set0为0时设置‘分’,Set0为1时设置‘时’
while(!
K3);
}
}
}
}
voidKEY_MiaoBiao()//检测秒表按键操作
{
if(K1_bit==1)//判断是否为秒表模式
{
if(K2==0)
{
Delay(10);
if(K2==0)
{
TR1=~TR1;//K2每按一次TR1取反,暂停或开始定时器1,达到暂停或开始秒表的目的
while(!
K2);
}
}
if(K3==0)
{
Delay(10);
if(K3==0)//当K3按下时秒表所有数据清零,并停止定时器1
{
TR1=0;//停止定时器1
Miao_Biao0=0;//清零数据
Miao_Biao1=0;
Miao_Biao2=0;
Miao_Biao3=0;
Miao_Biao4=0;
while(!
K3);
}
}
}
}
voidMode_K1()//模式选择键,本程序四种模式,分别是时间显示、秒表、时间设置、闹钟
{
if(K1==0)
{
Delay(10);
if(K1==0)
{
K1_bit++;
if(K1_bit==3)
{
K1_bit=0;
}
while(!
K1);
/***********************************************************************
*************当K1_bit为0时显示时钟,为1时进入秒表,*********************
*******************为2时进入时间设置模式,为3时进入闹钟模式***************
***********************************************************************/
}
}
}
voidTime1()interrupt3//定时器1函数
{
TH1=(65536-50000)/256;//重装初值
TL1=(65536-5
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简易 时钟 设计 讲解