电子时钟系统设计.docx

上传人:b****5 文档编号:5923447 上传时间:2023-01-02 格式:DOCX 页数:23 大小:430.53KB
下载 相关 举报
电子时钟系统设计.docx_第1页
第1页 / 共23页
电子时钟系统设计.docx_第2页
第2页 / 共23页
电子时钟系统设计.docx_第3页
第3页 / 共23页
电子时钟系统设计.docx_第4页
第4页 / 共23页
电子时钟系统设计.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

电子时钟系统设计.docx

《电子时钟系统设计.docx》由会员分享,可在线阅读,更多相关《电子时钟系统设计.docx(23页珍藏版)》请在冰豆网上搜索。

电子时钟系统设计.docx

电子时钟系统设计

课程设计任务书

题目电子时钟系统设计

专业、班级电信11-02学号541101030218姓名李瑞

主要内容、基本要求、主要参考资料等:

一、主要内容:

熟悉单片机应用系统的设计方法和规范,达到综合的目的。

学习文件检索和查找数据手册的能力、

学习protel软件的使用。

学会整理和总结设计文档报告。

二、基本要求:

以MCS-51系列单片机为核心,组成一个电子时钟系统、

系统显示由6位数码管显示组成,分别显示时间值的时、分、秒。

能够随时对当前时间进行调整。

能够随时输入定时(闹钟)时间。

定时(闹钟)时间到,发出闹钟提醒信号。

闹钟提醒信号的声音为断续形式,最长不超过1分钟。

三、主要参考资料:

张毅坤等单片微型计算机原理及应用西安西安电子科技大学出版社

李建忠编著单片机原理及应用西安西安电子科技大学出版社

完成期限:

2015年1月17日

指导教师签名:

课程负责人签名:

2015年1月4日

摘要

单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用特别广泛、发展特别快。

Intel公司生产的MCS-8051系列单片机是各单片机中最为典型和最有代表性的一种。

本次设计以MCS—8051芯片为核心,辅助以必要的外围电路,设计了一个结构简单功能齐全的数值时钟、在硬件方面,单片机外接12MHz芯片进行驱动。

通过数码管能够准确明亮的显示时、分、秒;四个简单的按键实现对时间的调整;蜂鸣器实现闹钟响铃功能;软件方面采纳c语言编程。

整个电子钟系统能完成时间的显示、调试和一组定时闹钟的功能。

关键词:

51单片机定时器闹钟数码管

1设计方案选择

1、1单片机选型

依照选题芯片采纳MCS-8051单片机,Intel公司生产的51系列8位单片机,凭借其成熟的技术标准和特别高的性价比得到了广泛的普及与应用,其功能强大,用来做电子表硬件易实现,编程规范。

1、2按键模块

方案一:

4×4行列式键盘

假如选择此方案,那么在修改时钟或设置闹铃时间时就能够直截了当从键盘输入,方便、快捷。

缺点也特别明显,一是浪费按键,用全键盘来实现设定时间的小功能不免大材小用;二是从实用性考虑,全键盘体积大,明显不经济不方便。

故放弃。

方案二:

独立式按键

假如设置过多按键,将会占用较多I/O口,而且会给布线带来不便,同时浪费按键,不高效,程序繁琐、本次设计适用于按键较少的情况。

为了尽量实现按键的高效性,此次设计采纳四个独立式按键,分别定义为key_mode、key_add、key_move,key_confirm,依次是模式键、加数键、移位键、确认键。

1、3显示模块

方案一:

液晶显示器LCD

假如选择此方案,将会降低系统的功耗,能够用电池供电,便于携带,但液晶显示器的驱动电路复杂,使用起来有一定的难度。

方案二:

数码管LED

数码管的驱动电路简单,使用方便,假如选择了此方案,那么在夜间看时间的时候就不需要有光源,特别方便、其缺点是功耗较大。

依照此次任务书设计要求,选择两个4位一体七段数码管用于显示。

1。

4计时参考模块

方案一:

专用时钟芯片

假如使用时钟芯片,系统就不怕掉电且时间精确,但这种芯片比较贵,浪费资源不经济、

方案二:

单片机内部定时/计数器

由于本次设计本主要是为了学习单片机程序的编写和调试,以及设计硬件电路的一些方法,因此采纳软件的方法来计时、

本次设计用单片机内部定时/计数器T0作为电子时钟参考、

1、5显示器驱动模块

由于通过数码管公共极的电流较大,单片机I/O口驱动能力是不够的,故LED驱动模块必不可少、为幸免过多地使用分立元件,本次设计采纳一片74LS245来驱动位码,用P2口进行位选扫描。

图174LS245元件封装图

74LS245是常用来驱动LED或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据,74LS245还具有双向三态功能。

片选端,接低电平时传输数据,接高电平常A、B均为高阻态。

方向选择端AB/,接高电平常信号由A向B传输(发送),接低电平常信号由B向A传输(接收)、

1、6闹钟响铃模块

通过三极管放大后驱动蜂鸣器工作,单片机I/O接三极管基极。

1。

7电源模块

本系统采纳了数码管作为显示器,功耗较大,不便于使用电池供电、况且本系统的体积较大,即使使用电池供电也不便于随身携带,因此用5V外部稳压电源来供电、

2硬件接线及设计

图2系统硬件框图

2。

1单片机晶振配置

图3单片机晶振配置和复位电路

晶振选择12MHz,接到如图所示引脚。

2。

2复位电路设计

图4复位电路

复位电路兼具上电复位功能以及按键复位功能,接到如图所示引脚。

2、3按键电路设计

图5按键电路

采纳4个独立按键配以4个上拉电阻实现对时钟和闹钟的设定及修改。

四个独立式按键分别定义为key_mode、key_add、key_move、key_confirm,依次是模式键、调时加键、调时移位键、确认键。

2、4蜂鸣器驱动电路设计

图6蜂鸣器驱动电路

蜂鸣器采纳NPN三极管放大电路驱动,接到如图所示引脚。

2。

5显示模块电路设计

显示设备为共阳7段数码管(LED),用单片机P0口作为LED段选控制端,用单片机P2口作为LED位选控制端,并采纳集成块74LS245作为位驱动模块、片选端接地,方向选择端AB/接电源。

3软件部分

3。

1主函数流程图

图7主函数程序流程图

3、2定时器T0中断服务程序流程图

图8定时器T0中断服务程序流程图

3。

3闹钟响应程序流程图

图9闹钟响应程序流程图

3、4键盘扫描程序流程图

图10键盘扫描程序流程图

4系统综述

4、1上电界面

电子表上电后自动初始化,接着从00-00-00开始走时,显示正常走时界面,此时闹钟默认关掉。

按下key_mode键,可依次切换到调时界面、调闹钟界面、正常走时界面,如此循环往复。

上电初始化后,调时初值为0000-00,闹钟初值为00—0000。

4、2调时界面

调时界面,从左至右依次显示时、分、秒,数字右下角小点代表调整位到达位置。

在调时界面下,按下key_move键能够移动调整位,数字下标小点用以指示当前操作的数位,按下key_add键能够对调整位进行加数操作。

当且仅当在调时界面下,按下key_confirm键可确认设定,电子表按设定时间更新并走时,同时自动清零设定时间。

此时再按key_mode键切换回正常走时界面即能看到时间差不多更新。

假如调时后没有按下key_confirm键确认,而是直截了当按key_mode键切换回正常走时界面,则设置时间被保存,当前时间并不更新。

4。

3闹钟设定界面

闹钟设定界面,从左至右依次显示时、分、秒,数字右下角小点代表调整位到达位置。

在闹钟设定界面下,按下key_move键能够移动调整位,数字下标小点用以指示当前操作的数位,按下key_add键能够对调整位进行加数操作。

闹钟设置好后直截了当按key_mode键返回正常正常走时界面即可,无需按key_confirm键确认,闹钟设定值会自动保存。

4、4正常走时界面

正常走时界面,从左至右依次显示时、分、秒,小点亮灭代表闹钟开闭。

在正常走时界面下,按下key_add键和key_move键不产生操作,LED显示无变化;按下key_confirm键可循环开闭闹钟,LED显示对应变换提示闹钟的开闭;按下key_mode键可依次切换到调时模式、闹钟设定模式、正常走时模式,循环往复。

4。

5闹钟响应

当正常走时到达闹铃设定值后,闹铃响应,正常情况下持续蜂鸣一分钟后自动关闭蜂鸣器。

闹铃响铃过程中,若按下key_confirm键可立刻关闭蜂鸣器。

闹铃响应后自动等待下次响应。

总结

在这次课程设计中,运用到了特别多往常的专业知识,尽管过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率特别高,这是我做这次课程设计的一大收获、另外,要做好一个课程设计,就必须做到:

在设计程序之前,对所用单片机的内部结构有一个系统的了解,明白该单片机内有哪些资源;要有一个清楚的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白您的思路,如此也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是特别正常德,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的课程设计结束了,然而从中学到的知识会让我受益终身。

发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。

设计过程,好比是我们人类成长的历程,常有一些不如意,但毕竟这是第一次做,难免会遇到各种各样的问题。

在设计的过程中发现了自己的不足之处,对往常所学过的知识理解得不够深刻,掌握得不够牢固,不能灵活运用、

参考文献

[1] 郑君里,应启珩,杨为理。

信号与系统(第二版)上册[M]、高等教育出版社,2000

[2] 郑君里,应启珩,杨为理。

信号与系统(第二版)下册[M]。

高等教育出版社,2000

[3] 谭浩强、C程序设计(第二版)[M]。

清华大学出版社,2003

[4]于京、 51系列单片机C程序设计与应用案例[M]、北京:

中国电力出版社,2006、

[5]孙育才、 ATMEL新型AT89S52系列单片机及其应用[M]、北京:

清华大学出版社,2005、

[6] 吴坚,刘高平。

基于GPRS网络的点对点图像传输方案[J]。

计算机应用研究,2004,

附录

附录1总体设计电路图

附录2PCB图

附录3元件清单

序号

元件名称

规格型号/参数

数量(个)

1

单片机

AT89C51

1

2

显示驱动三极管

Q1

1

3

晶振

12MHz

1

4

电容

33pF

2

10μF

1

5

按键

S1

1

6

排阻

102

1

7

电阻

10K

1

4。

7K

1

8

蜂鸣器

LS1

1

9

数码管

4BIT_8SEG_LED

2

10

驱动芯片

74LS245

1

附录4总程序

//****************头文件及宏定义*******************************

#include〈reg51、h〉

#defineucharunsignedchar

#defineuintunsignedint

//****************软件延时程序*********************************

voiddelay(uintii)

{while(-—ii);}

//****************定义数码管驱动码******************************

ucharduan[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,

0XBF,0XFF,0X7F};//段选,0123456789—灭。

ucharwei[]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};//位选,共阳,从右至左

//****************定义变量**************************************

uchart=0,sec=0,min=0,hour=0;//正常走时时间变量

ucharsec1=0,min1=0,hour1=0;//时间设定值变量

ucharsec2=0,min2=0,hour2=0;//闹钟设定值变量

ucharalarm_en=0;//闹钟开关变量

ucharalarm_flag=0;//闹钟定时到达标志变量

ucharp3=0,moshi=0,mov=0;//P3口查询,模式值,调整位

//显示缓冲区,依次为正常、调时、闹钟设定、调整位带点标记

uchartemp[8],temp1[8],temp2[8],temp3[8];

//****************函数声明*************************************

voidinitialize(void);//初始化

voidshow(void);//正常走时显示

voidshow1(void);//时间设定显示

voidshow2(void);//闹钟设定显示

voidshow3(void);//调整位标记

voidshow4(void);//闹钟开关标记

voidkeyscan(void);//键盘扫描

voidadd(void);//调时调闹钟加数程序

voidconfirm(void);//调时确认,闹钟开关

voidalarm_judge(void);//闹钟定时到达判定

voidbeep(void);//闹钟响铃程序

//******************主函数***************************

voidmain()

initialize();

while

(1)

{

keyscan();

alarm_judge();

switch(moshi)

case0:

show();show4();break;//显示正常走时

case1:

show1();show3();break;//显示设置时间

case2:

show2();show3();break;//显示闹钟时间

if(alarm_flag==1&&alarm_en==1)//定时时间到达且闹钟打开

{beep();}

}

//*****************定时器初始化**************************

voidinitialize(void)

TMOD=0x01;

TH0=0X3C;

TL0=0XB0;//50ms

ET0=1;

EA=1;

TR0=1;

P1=0X7F;//初始化时关掉蜂鸣器

alarm_flag=alarm_en=0;

//*****************定时器T0中断服务程序****************

voidTimer0(void)interrupt1

TL0=0XB0;

TH0=0X3C;

t++;

if(t==20)//(50ms*20=1s)

{t=0;sec++;}

if(sec==60)//秒为60,则清零,分加1

{sec=0;min++;}

if(min==60)//分为60,则清零,时加1

{min=0;hour++;}

if(hour==24)//时为24,则清零

{hour=0;}

if(sec1==60)

{sec1=0;min1++;}

if(min1==60)

{min1=0;hour1++;}

if(hour1==24)

{hour1=0;}

if(sec2==60)

{sec2=0;min2++;}

if(min2==60)

{min2=0;hour2++;}

if(hour2==24)

{hour2=0;}

}

//******************正常时间显示程序*******************

voidshow(void)

uchari=0;

temp[0]=sec%10;

temp[1]=sec/10;

temp[2]=10;

temp[3]=min%10;

temp[4]=min/10;

temp[5]=10;

temp[6]=hour%10;

temp[7]=hour/10;

for(i=0;i<8;i++)

P2=wei[i];

P0=duan[temp[i]];

delay(100);

}

//******************调时模式显示程序*******************

voidshow1(void)

{

uchari=0;

temp1[0]=sec1%10;

temp1[1]=sec1/10;

temp1[2]=10;

temp1[3]=min1%10;

temp1[4]=min1/10;

temp1[5]=11;

temp1[6]=hour1%10;

temp1[7]=hour1/10;

for(i=0;i〈8;i++)

P2=wei[i];

P0=duan[temp1[i]];

delay(100);

}

}

//******************闹钟设定模式显示程序*******************

voidshow2(void)

uchari=0;

temp2[0]=sec2%10;

temp2[1]=sec2/10;

temp2[2]=11;

temp2[3]=min2%10;

temp2[4]=min2/10;

temp2[5]=10;

temp2[6]=hour2%10;

temp2[7]=hour2/10;

for(i=0;i〈8;i++)

P2=wei[i];

P0=duan[temp2[i]];

delay(100);

}

//******************调整位标记显示程序*******************

voidshow3(void)

ucharmovv=0;

switch(mov)

{

case0:

movv=0;break;

case1:

movv=3;break;

case2:

movv=6;break;

}

P2=wei[movv];

P0=duan[12];

delay(100);

}

//*********************闹钟开闭显示程序*******************

voidshow4(void)

if(alarm_en==1)

P2=wei[2]+wei[5];

P0=duan[12];

delay(100);

//******************键盘扫描程序***********************

voidkeyscan(void)

{

P3=0XFF;

p3=P3;

if(p3==0XFF)return;

if(p3==0XFE)//key_mode键

{

delay(10);

if(p3==0XFE)

moshi++;

if(moshi>=3)moshi=0;

while(p3==0XFE)//key_mode键按下到弹起期间

p3=P3;

switch(moshi)

{

case0:

show();break;//显示正常走时

case1:

show1();break;//显示设置时间

case2:

show2();break;//显示闹钟时间

}

}

if(p3==0XFD)//key_add键

delay(10);

if(p3==0XFD)

{

add();

while(p3==0XFD)//key_add键按下到弹起期间

p3=P3;

switch(moshi)

case0:

show();break;//显示正常走时

case1:

show1();break;//显示设置时间

case2:

show2();break;//显示闹钟时间

}

if(p3==0XFB)//key_move键

delay(10);

if(p3==0XFB)

{

mov++;

if(mov>=3)mov=0;

}

while(p3==0XFB)//key_move键按下到弹起期间

{

p3=P3;

switch(moshi)

{

case0:

show();break;//显示正常走时

case1:

show1();break;//显示设置时间

case2:

show2();break;//显示闹钟时间

}

}

if(p3==0XF7)//key_confirm键

delay(10);

if(p3==0XF7)

{

confirm();

}

while(p3==0XF7)//key_confirm键按下到弹起期间

{

p3=P3;

switch(moshi)

case0:

show();break;//显示正常走时

case1:

show1();break;//显示设置时间

case2:

show2();break;//显示闹钟时间

}

//******************调时调脑钟增数程序***********************

voidadd(void)

{

//模式1,调时模式,调时增数

if(moshi==1&&mov==0)

{sec1++;}

if(moshi==1&&mov==1)

{min1++;}

if(moshi==1&&mov==2)

{hour1++;}

//模式2,闹钟设定模式,闹钟增数

if(moshi==2&&mov==0)

{sec2++;}

if(moshi==2&&mov==1)

{min2++;}

if(moshi==2&&mov==2)

{hour2++;}

//******************确认键服务函数***************************

voidconfirm(void)

if(moshi==1)//模式1,调时环境下校正时间

{

t=TF0=0;

sec=sec1;

min=min1;

hour=hour1;

sec1=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1