精确时钟课程设计新编单片机原理及应用.docx
- 文档编号:5180189
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:23
- 大小:742.50KB
精确时钟课程设计新编单片机原理及应用.docx
《精确时钟课程设计新编单片机原理及应用.docx》由会员分享,可在线阅读,更多相关《精确时钟课程设计新编单片机原理及应用.docx(23页珍藏版)》请在冰豆网上搜索。
精确时钟课程设计新编单片机原理及应用
目录
第1章系统总体方案与说明3
1.1系统总体方案3
1.2系统设计说明3
1.3系统设计目的4
1.4系统设计要求4
第2章硬件电路设计4
2.1总原理图4
2.2各个模块设计5
2.3器件清单9
第3章软件设计10
3.1硬件框图10
3.2程序流程图10
第4章心得体会11
第5章附件12
附录A.源程序清单12
附录B.硬件原理图28
附件C参考文献29
第1章系统总体方案与说明
1.1系统总体方案
该课程设计是利用AT89C51单片机内部的定时/计数器、中断系统、以及独立键盘和LED显示器等部件,设计的一个单片机精确时钟,16位LED数码显示,分别显示“年、月、日、时、分、秒、毫秒”。
该作品主要用于日期显示,24小时计时显示,能整时蜂鸣报时。
使用方法:
开机后按P3.6时钟在2013010100:
00:
00起开始计时。
(1)按P3.2进入选择调节状态:
每按一次系统将依次选择打开对秒、分、时、日、月、年的调节模式;
(2)按P3.3进入循环递增设定状态:
与P3.2相结合依次设定正确时间。
1.2系统设计说明
(1)系统由AT89C51、LED数码管、驱动软件、按键、电容、电阻、蜂鸣器等部分构成,能实现时间的调整、输出、调时间等功能。
(2)时间调整:
该设计需要校对时间,所以用两个按键来实现。
按“选调”来选择需要调节的部分,按“调节”来调节各部分时间。
“选调”时系统暂停计时,调节结束后将“选调”标志位(即数码管小数点点亮)移动到毫秒上时计时继续。
(3)中断:
中断技术在单片系统中有着十分重要的作用,它不仅可以提高单片机CPU的效率,也可以对突发事件处理。
所谓中断就是CPU在执行主程序的过程中,被意外事件打断,转去执行一段子程序,CPU执行完子程序后,又返回到原程序继续执行。
本系统采用的中断方式为定时器0方式2。
1.3系统设计目的
通过课程设计的教学实践,巩固、加深和扩大51系列单片机应用的知识面,提高综合及灵活运用所学知识解决工业控制的能力。
对课题设计方案的分析、选择、比较、熟悉用51单片机做系统开发、研制的过程,软硬件设计的方法、内容及步骤。
提高动手实践能力、提高科学的思维能力。
1.4系统设计要求
1.掌握单片机最小系统的电路原理图;
2.硬件的焊接、连接;
3.独立编辑、编译软件;
4.调试要求:
本设计以MCS-51系列单片机为核心,采用常见电子器件设计,一个电源开关,一个按键负责设置时间和开始走时,一个按键负责循环递增时间,16位数码管显示,可实时显示年、月、日、时、分、秒、百分秒,要求精确到0.01秒。
整点能播放提示音,最后一声较尖锐,为准确整点时间。
要求按键输入采用中断方式,按键A接INT0,按键B接INT1。
第2章硬件电路设计
2.1总原理图
如原理图所示,硬件系统主要由单片机最小应用系统、LED数码管显示模块、电源模块、晶振模块、按键模块、复位电路、整点报时电路、驱动电路等组成。
2.2各个模块设计
1、单片机最小系统
AT89C51概述:
AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4k bytes的可反复擦写的只读程序存储器(PEROM)和128 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大AT89C51单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。
功能特性概述:
AT89C51提供以下标准功能:
4k字节Flash闪速存储器,128字节
内部RAM,32个I/O口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。
空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。
掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
2、显示模块
LED数码管是由发光二极管构成的,亦称半导体数码管。
将条状发光二极管按照共阴极(负极)或共阳极(正极)的方法连接,组成“8”字,再把发光二极管另一电极作笔段电极,就构成了LED数码管。
若按规定使某些笔段上的发光二极管发光,就能显示从0~9的系列数字。
同荧光数码管(VFD)、辉光数码管(NRT)相比,它具有:
体积小、功耗低、耐震动、寿命长、亮度高、单色性好、发光响应的时间短,能与TTL、CMOS电路兼容等的数显器件。
+、-分别表示公共阳极和公共阴极。
a~g是7个笔段电极,DP为小数点。
本系统利用4个4位LED数码管显示时间,共阳极结构。
LED数码管由8段发光二极管组成,当要显示某个数字时只要将数字所对应的引脚送入低电平。
3.按键模块
本设计中主要有三个控制按键,按键功能为:
(1)按P3.6时钟在2013010100:
00:
00起开始计时;
(1)按P3.2进入选择调节状态:
每按一次系统将依次选择打开对秒、分、时、日、月、年的调节模式;
(2)按P3.3进入循环递增设定状态:
与P3.2相结合依次设定正确时间。
4.晶振模块
时钟振荡电路下图所示,时钟振荡电路用于产生单片机正常工作时所需要的时钟信号,电路由两个30pF的瓷片电容和一个11.0592MHz的晶振组成,并接入到单片机的XTAL1和XTAL2引脚处,使单片机工作于内部振荡模式。
此电路在加电后延迟大约10ms振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率决定。
电路中两个电容C1、C2的作用使电路快速起振,提高电路的运行速度。
5.复位电路
复位电路由电阻和极性电容组成,最简单的一种上电复位及按键复位电路如下图所示:
上电后,由于电容充电,使RST持续一段时间的高电平,完成复位操作;当单片机处于运行中或死锁时,按下“复位”按钮,也可使单片机进入复位状态。
通常选择C=10-30µF,R=100-1000Ω
6.整点报时电路
整点报时电路如右图所示,蜂鸣器使用三极管PN5138作为驱动器,当D8输入高电平时,三级管导通,SPEAKER蜂鸣。
在软件中,D8在一定的时间段输入矩形波信号,故蜂鸣器间歇蜂鸣。
7.
驱动电路
数码管段选采用ULN2803作为驱动元件,该电路为反向输出型,即输入低电平电压,输出端才能导通工作。
其引脚图如右图,内部电路图如下图。
数码管位选驱动采用三极管PN5138构成的驱动电路,
2.3器件清单
元件名
封装名
型号
数量
单片机
DIL40
AT89C51
1
石英晶体振荡器
XTAL18
CRYSTAL
1
四位八段共阳数码管
MPX4-CA
4
达林顿管
DIL16
ULN2003
1
三极管
TO92
PN5138
17
蜂鸣器
SPEAKER
1
按键
NULL
BUTTON
4
反相器
DIL14
74LS04
7
电容
CAPC060X33
02013A0R5CAT2A
3
电阻
RES180
10WATT0R22
若干
第3章软件设计
3.1硬件框图
根据以上的电子时钟的设计要求可以分为以下的几个硬件电路模块:
单片机模块、显示模块、时钟电路、复位电路与按键电路等,模块之间的关系图如下面得方框电路图所示。
3.2程序流程图
N
Y
第4章心得体会
本次课程设计是用AT89C51单片机CPU及接口电路设计一个精确时钟,经过两个星期的设计与调试,结果满足要求,验证无误。
通过单片机硬件电路的调试,实现了预先设定的功能,设计主要用到了多种芯片,程序也比较长比较麻烦,同时也遇到了不少困难,尤其是关于数码管驱动电路的设计实现。
由于我们采用了共16位8段数码管,因此关于数码管位选驱动元件的选择着实困难。
我们先后尝试使用74HCT245、ULN2803、PN5138等元件,尽管前两个可以在Proteus中成功的仿真出来,但实际计算确表明它们的驱动能力不足,无法满足做实物的要求。
而三极管尽管合适,但却在仿真时问题重重,无法获得稳定的数码显示,三极管上所串接的电阻也难以确定最佳阻值。
我们用了两天的时间查询资料请教学长方才完美解决。
通过本次设计,我们系统的了解了精确时钟的设计流程,尤其是硬、软件的设计方法,掌握了键盘显示电路的基本功能及编程方法,掌握了键盘电路和显示电路的一般原理,也进一步掌握并验证了了89C51定时器的使用和中断处理器程序的编程方法,并且加深了对C语言编程的掌握程度。
开拓了思路,锻炼了实践动手能力,提高了分工协作能力和分析问题,解决问题的能力,达到了本次课程设计的目的。
此次单片机课程设计,从选题到定稿,从理论到实践,在整整两个星期里,学到了很多的东西。
同时不仅巩固了以前所学过的知识,而且还学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合至关重要,而电子产品的设计更要精益求精,无论是C语言编程,还是电路图的设计与仿真,唯有细心谨慎才能获得成功!
单片机课程设计虽然结束了,但通过设计所学到的东西将长久存在。
相信这次设计带给我们的严谨的学习态度和一丝不苟的科学作风将会给我们未来的工作和学习打下一个更坚实的基础。
第5章附件
附录A:
源程序清单如下:
/**********************************************************
数码管精确时钟设计程序
**********************************************************/
#include
#definedao523
#defineuintunsignedint//数据类型定义
#defineucharunsignedchar//数据类型定义
ucharmon(ucharmonth);
ucharleap(ucharyear);
voiddelayms(uint);
voidinit();
voiddisplay();
voidmusic();
voidscankey();
voiddelayms1(uint);
voidstart();
sbitsound=P3^7;
sbitkey1=P3^6;
uintnum=0,num1=0,num2=0,num3=0,s1num=0;
uintbmiaos,bmiaog,bmiao,miaos,miaog,miao,fens,feng,fen,
shis,shig,shi,days,dayg,day=1,months,monthg,month=1,yearq,
yearb,years,yearg,year=2013,n,m,i,z=1,flag=0;
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
/****************************
主程序main()
*****************************/
voidmain()
{
while
(1)
{
if(flag==1)
{
init();
flag=0;
}
start();
scankey();
display();
}
}
/***************************
初始化子程序
****************************/
voidinit()//初始子程序
{
TMOD=0x01;
TH0=0xd8;
TL0=0xf0;
EA=1;
EX0=1;
EX1=1;
IT0=1;
IT1=1;
ET0=1;
TR0=1;
}
/*******************************************************
时钟的年、月、日、时、分、秒、百分秒动态扫描程序
********************************************************/
voiddisplay()//七段数码管显示程序
{
bmiaos=bmiao/10;//百分秒显示程序
bmiaog=bmiao%10;
P1=0x7f;
delayms
(1);
P0=table[bmiaog];
delayms1
(1);
P1=0xbf;
delayms
(1);
P0=table[bmiaos];
delayms1
(1);
miaos=miao/10;//秒显示程序
miaog=miao%10;
P1=0xdf;
delayms
(1);
P0=table[miaog];
delayms1
(1);
P1=0xef;
delayms
(1);
P0=table[miaos];
delayms1
(1);
fens=fen/10;//分显示程序
feng=fen%10;
P1=0xf7;
delayms
(1);
P0=table[feng];
delayms1
(1);
P1=0xfb;
delayms
(1);
P0=table[fens];
delayms1
(1);
shis=shi/10;//时显示程序
shig=shi%10;
P1=0xfd;
delayms
(1);
P0=table[shig];
delayms1
(1);
P1=0xfe;
delayms
(1);
P0=table[shis];
delayms1
(1);
P1=0xff;
days=day/10;//天数显示程序
dayg=day%10;
P2=0x7f;
delayms
(1);
P0=table[dayg];
delayms1
(1);
P2=0xbf;
delayms
(1);
P0=table[days];
delayms1
(1);
P2=0xff;
months=month/10;//月数显示程序
monthg=month%10;
P2=0xdf;
delayms
(1);
P0=table[monthg];
delayms1
(1);
P2=0xef;
delayms
(1);
P0=table[months];
delayms1
(1);
P2=0xff;
yearq=year/1000;//年数显示程序
yearb=year%1000/100;
years=year%100/10;
yearg=year%10;
P2=0xf7;
delayms
(1);
P0=table[yearg];
delayms1
(1);
P2=0xfb;
delayms
(1);
P0=table[years];
delayms1
(1);
P2=0xfd;
delayms
(1);
P0=table[yearb];
delayms1
(1);
P2=0xfe;
delayms
(1);
P0=table[yearq];
delayms1
(1);
P2=0xff;
}
/****************************************
模式为零,方式为一定时中断程序
*****************************************/
voidT0_time()interrupt1
{
uintn;
TH0=0xd8;
TL0=0xf0;
bmiao++;
if(bmiao==100)
{
bmiao=0;
miao++;
if((fen==59)&&(miao>=55))
{
music();
delayms
(1);
}
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
day++;
n=mon(month);
if(day==n)
{
day=1;
month++;
if(month==13)
year++;
month=1;
}
}
}
}
}
}
/************************************
计算每年每月份的天数
************************************/
ucharmon(ucharmonth)
{
switch(month)
{
case1:
case3:
case5:
case7:
case8:
case10:
case12:
return32;break;
case4:
case6:
case11:
case9:
return31;break;
case2:
returnleap(year);break;
}
}
/************************************
计算每年二月份的天数
*************************************/
ucharleap(ucharyear)
{
year+=2000;
if(year%4==0)
{
if(year%100==0)
{
if(year%400==0)
return30;
elsereturn29;
}
elsereturn30;
}
elsereturn29;
}
/**************************************
按键中断零扫描程序
***************************************/
voidscankey()
{
if(s1num==1)
{
P1=0xdf;
P0=0x7f;
delayms
(1);
}
if(s1num==2)
{
P1=0xf7;
P0=0x7f;
delayms
(1);
}
if(s1num==3)
{
P1=0xdf;
P0=0x7f;
delayms
(1);
P1=0xff;
}
if(s1num==4)
{
P2=0x7f;
P0=0x7f;
delayms
(1);
P2=0xff;
}
if(s1num==5)
{
P2=0xdf;
P0=0x7f;
delayms
(1);
P2=0xff;
}
if(s1num==6)
{
P2=0xf7;
P0=0x7f;
delayms
(1);
P2=0xff;
}
if(s1num==7)
{
TR0=1;
s1num=0;
}
}
/*****************************************
中断零程序扫描
******************************************/
voidT2_time()interrupt0
{z=0;
TR0=0;
s1num++;
}
/*****************************************
中断一程序扫描和加数字循环程序
******************************************/
voidT1_time()interrupt2
{
if(s1num==1)
{
miao++;
if(miao==60)
miao=0;
}
if(s1num==2)
{
fen++;
if(fen==60)
fen=0;
}
if(s1num==3)
{
shi++;
if(shi==24)
shi=0;
}
if(s1num==4)
{
day++;
n=mon(month);
if(day==n)
day=1;
}
if(s1num==5)
{
month++;
if(month==13)
month=1;
}
if(s1num==6)
{
year++;
if(year==2100)
year=2012;
}
}
/********************************
蜂鸣器子程序
*********************************/
voidmusic()
{
sound=~sound;
}
/*********************************
开始程序
**********************************/
voidstart()
{
if(key1==0)
{
delayms(5);
if(key1==0)
{
while(!
key1);
flag=1;
}
}
}
voiddelayms1(uintkms)//自由时间延时程序
{
uinti,j;
for(i=kms;i>0;i--)
for(j=110;j>0;j--);
}
voiddelayms(uintkms)//自由时间延时程序1
{
uinti,j;
for(i=kms;i>0;i--)
for(j=80;j>0;j--);
}
附录B:
硬件原理图:
附录C:
参考文献:
【1】汪贵平李登峰龚贤武雷旭新编单片机原理及应用
机械工业出版社
【2】彭伟单片C语言程序设计实例100例
电子工业出版社
【3】郭天祥10天学会51单片机教学视频
【4】各器件参数均来自互联网。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精确 时钟 课程设计 新编 单片机 原理 应用