多功能数字钟的设计.docx
- 文档编号:6453471
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:21
- 大小:274.51KB
多功能数字钟的设计.docx
《多功能数字钟的设计.docx》由会员分享,可在线阅读,更多相关《多功能数字钟的设计.docx(21页珍藏版)》请在冰豆网上搜索。
多功能数字钟的设计
电子技术课程设计
题目名称:
多功能数字钟的设计
班级:
学号:
姓名:
指导教师:
日期:
二零一五年六月二十日
多功能数字钟的设计
一、设计任务及要求
设计任务:
设计一个多功能的数字钟。
设计要求:
内容要求:
说明设计题目及要求。
剖析题目并提出设计构想。
提出设计实现方案。
根据确定的设计方案进行细致构思和实现。
画出总体原理图。
对总体原理图进行深入剖析及定量计算,详尽说明各部分电路的原理并求出必要的参数值。
⑥对电路进行仿真,给出仿真结果。
⑦对本次课程设计进行总结
1.以数字形式显示时、分、秒的时间。
2.小时的计时要求为24进制,分钟和秒的计时要求为60进制。
3.能手动快速校时、校分。
4.具有整点报时功能。
5.具有秒表计数功能。
6.具有闹钟功能。
7.电路中所需的直流电源需自行设计。
整体设计及原理框图
整体设计:
本实验为多功能数字钟的设计,小时为24进制,分钟和秒为60进制,具有校时校分,整点报时,秒表计数,闹钟功能,数字以液晶屏显示出来。
时钟秒分钟小时的产生,10ms信号,计100次够1s,够60s计分钟,够60分钟小时,够24小时清零。
以ms定义毫秒,以s定义秒,m定义分钟,h定义小时。
闹钟设计的小时与分钟与定时器的小时和分钟返回单片机进行比较,如果相等则传给蜂鸣器,蜂鸣器响,不相等则不执行,修改时间有单片机检测按键来进行时间的修改。
秒表由单片机给秒表信号开始计数每10ms显示一次。
设计的读取和指令的发出都由单片机来实现。
数字时钟功能齐全,而且操作方便,符合现实要求。
原理框图:
ms定义s定义秒m定义分钟h定义小时
定时器产生10ms1s60s1h24小时清零
比较是否相等清零
比较是否相等
单片机
液晶屏
清零
秒表10ms1s60s1h24小时清零
相
等
清零
闹钟
小时分钟按键
蜂鸣器
二、各模块设计原理
时钟信号的产生
51单片机定时器T0原理:
定时器/计数器简称定时器,其作用主要包括产生各种时标间隔、记录外部事件的数量等,是微机中最常用、最基本的部件之一。
803l单片机有2个16位的定时器/计数器:
定时器0(T0)和定时器1(T1)。
T0由2个定时寄存器TH0和TL0构成,T1则由TH1和TL1构成,它们都分别映射在特殊功能寄存器中,从而可以通过对特殊功能寄存器中这些寄存器的读写来实现对这两个定时器的操作。
作定时器时,每一个机器周期定时寄存器自动加l,所以定时器也可看作是计量机器周期的计数器。
由于每个机器周期为12个时钟振荡周期,所以定时的分辨率是时钟振荡频率的1/12。
作计数器时,只要在单片机外部引脚T0(或T1)有从1到0电平的负跳变,计数器就自动加1。
计数的最高频率一般为振荡频率的l/24。
工作方式:
T0或T1无论用作定时器或计数器都有4种工作方式:
方式0、方式1、方式2和方式3。
除方式3外,T0和T1有完全相同的工作状态。
下面以T1为例,分述各种工作方式的特点和用法。
工作方式0:
13位方式由TL1的低5位和TH1的8位构成13位计数器(TL1的高3位无效)。
工作方式0的结构见下图:
图中,C/T为定时/计数选择:
C/T=0,T1为定时器,定时信号为振荡周期12分频后的脉冲;C/T=l,T1为计数器,计数信号来自引脚T1的外部信号。
定时器T1能否启动工作,还受到了R1、GATE和引脚信号INT1的控制。
由图中的逻辑电路可知,当GATE=0时,只要TR1=1就可打开控制门,使定时器工作;当GATE=1时,只有TR1=1且INT1=1,才可打开控制门。
GATE,TR1,C/T的状态选择由定时器的控制寄存器TMOD,TCON中相应位状态确定,INT1则是外部引脚上的信号。
在一般的应用中,通常使GATE=0,从而由TRl的状态控制Tl的开闭:
TRl=1,打开T1;TRl=0,关闭T1。
在特殊的应用场合,例如利用定时器测量接于INT1引脚上的外部脉冲高电平的宽度时,可使GATE=1,TRl=1。
当外部脉冲出现上升沿,亦即INT1由0变1电平时,启动T1定时,测量开始;一旦外部脉冲出现下降沿,亦即INT1由l变O时就关闭了T1。
定时器启动后,定时或计数脉冲加到TLl的低5位,从预先设置的初值(时间常数)开始不断增1。
TL1计满后,向THl进位。
当TL1和THl都计满之后,置位T1的定时器回零标志TFl,以此表明定时时间或计数次数已到,以供查询或在打开中断的条件下,可向CPU请求中断。
如需进一步定时/计数,需用指令重置时间常数。
时钟的秒,分钟,小时的产生模块:
10ms计100次够1s,够60s计分钟,够60分钟小时,够24小时清零。
秒表:
单片机给秒表信号,从零开始计数,从10ms开始显示,10ms计100次够1s,够60s计分钟,够60分钟小时,够24小时清零。
闹钟的设定模块:
设置闹钟变量,单片机检测按键,通过闹钟变量给小时,分钟赋值。
修改时间模块:
通过单片机检测按键来给时钟小时分钟进行修改,并且不改变闹钟设定的时间。
按键控制模块:
单片机对按键扫描,当检测到按键的变化时执行相应操作。
一共有三个按键和两个开关。
总体电路设计图
设计程序:
#include
#defineucharunsignedchar
#defineuintunsignedint
#definedataportP2//1602数据端
sbitrs=P1^7;//写命令数据控制端
sbitlcden=P1^5;//1602使能端
sbithadd=P1^6;
sbitmadd=P1^4;
sbitjishi=P1^3;
sbitturn=P1^2;
sbitsounder=P1^1;
ucharh=10,m,s_1,count,count_1,ms,flag,h_1,m_1,s_2,ms_1,h_2,m_2,s_3,ms_2,flag_1=3,ms_3,m_3,s_4,h_3,nm,nh;
codecharC1[10]="0123456789";//定义一个数组用来装载本实验所需要的十进制数字
codeunsignedcharC2[]="00:
00:
00:
00";
codecharname[6]="M:
PYAN";
voiddelay(us);//延时子函数
voidwrite_com(ucharcom);
voidwrite_data(uchardat);
voidjishi_1();
voidinit1602()
{
write_com(0x38);//显示模式设置
write_com(0x08);//显示打开
write_com(0x01);//显示清屏
write_com(0x06);//显示光标移动设置
write_com(0x0c);//显示开及光标设置
}
voiddelay(us)
{
unsignedintj;
while(us--)
{
for(j=80;j>0;j--);
}
}
voidshijian()
{
write_com(0x80+0X40);
write_data(C1[h/10]);
write_com(0x80+0X41);
write_data(C1[h%10]);
write_com(0x80+0X42);
write_data(':
');
write_com(0x80+0X43);
write_data(C1[m/10]);
write_com(0x80+0X44);
write_data(C1[m%10]);
write_com(0x80+0X45);
write_data(':
');
write_com(0x80+0X46);
write_data(C1[s_1/10]);
write_com(0x80+0X47);
write_data(C1[s_1%10]);
}
voidjishi_1()
{
write_com(0x80);
write_data(C1[h_1/10]);
write_com(0x80+0X01);
write_data(C1[h_1%10]);
write_com(0x80+0X02);
write_data(':
');
write_com(0x80+0X03);
write_data(C1[m_1/10]);
write_com(0x80+0X04);
write_data(C1[m_1%10]);
write_com(0x80+0X05);
write_data(':
');
write_com(0x80+0X06);
write_data(C1[s_2/10]);
write_com(0x80+0X07);
write_data(C1[s_2%10]);
write_com(0x80+0X08);
write_data(':
');
write_com(0x80+0X09);
write_data(C1[ms_1/10]);
write_com(0x80+0X0a);
write_data(C1[ms_1%10]);
}
voidjishi_3()
{
write_com(0x80);
write_data(C1[h_3/10]);
write_com(0x80+0X01);
write_data(C1[h_3%10]);
write_com(0x80+0X02);
write_data(':
');
write_com(0x80+0X03);
write_data(C1[m_3/10]);
write_com(0x80+0X04);
write_data(C1[m_3%10]);
write_com(0x80+0X05);
write_data(':
');
write_com(0x80+0X06);
write_data(C1[s_4/10]);
write_com(0x80+0X07);
write_data(C1[s_4%10]);
write_com(0x80+0X08);
write_data(':
');
write_com(0x80+0X09);
write_data(C1[ms_3/10]);
write_com(0x80+0X0a);
write_data(C1[ms_3/10]);
}
voidjishi_2()
{
write_com(0x80);
write_data(C1[h_2/10]);
write_com(0x80+0X01);
write_data(C1[h_2%10]);
write_com(0x80+0X02);
write_data(':
');
write_com(0x80+0X03);
write_data(C1[m_2/10]);
write_com(0x80+0X04);
write_data(C1[m_2%10]);
write_com(0x80+0X05);
write_data(':
');
write_com(0x80+0X06);
write_data(C1[s_3/10]);
write_com(0x80+0X07);
write_data(C1[s_3%10]);
write_com(0x80+0X08);
write_data(':
');
write_com(0x80+0X09);
write_data(C1[ms_2/10]);
write_com(0x80+0X0a);
write_data(C1[ms_2%10]);
}
voidplay_nz()//闹钟函数
{
write_com(0x80+0X49);
write_data('N');
write_com(0x80+0X4A);
write_data(':
');
write_com(0x80+0X4B);
write_data(C1[nh/10]);
write_com(0x80+0X4C);
write_data(C1[nh%10]);
write_com(0x80+0X4D);
write_data('-');
write_com(0x80+0X4E);
write_data(C1[nm/10]);
write_com(0x80+0X4F);
write_data(C1[nm%10]);
}
voidnz()
{
if(nm==m&&nh==h)
{
sounder=0;
delay(100);
delay(100);
sounder=1;
}
}
/**************************************************************************************/
/***********************************写数据函数*****************************************/
voidwrite_data(uchardat)
{
rs=1;//选择写数据
lcden=0;
P2=dat;
lcden=1;
delay
(1);
lcden=0;
}
/**************************************************************************************/
/***********************************写命令*****************************************/
voidwrite_com(ucharcom)//写命令子函数
{
rs=0;//为0则为写命令,为1则为写数据
lcden=0;
P2=com;
lcden=1;
delay
(1);
lcden=0;
}
voidinit()
{
TMOD=0X01;//定时器0的工作方式1
TH0=0x0FF;
TL0=0x9C;//初始化计数器值
TR0=1;//定时器0的中断控制位
EA=1;
ET0=1;//定时器0的中断控制位
IE0=1;//
EX0=1;//外部中断0的标志位
IT0=1;//外部中断0的方式选择位,本实验选择底电平触发//开启总中断
init1602();
}
voidzhengdian()
{
if(m==0&&s_1==0)
{
sounder=0;
delay(100);
sounder=1;
delay(100);
sounder=0;
delay(100);
sounder=1;
delay(100);
sounder=0;
delay(100);
sounder=1;
delay(100);
}
}
voidkeyscan_1()
{
if(jishi==1)
{
//init_jishi();
h_3=0;
m_3=0;
s_4=0;
ms_3=0;
jishi_3();
}
else
{
if(flag==0)
{
jishi_2();
}
if(flag==1)
{
jishi_1();
}
}
}
voidkeyscan_2()
{
if(turn==0)//修改时间
{
if(hadd==0)
{
while(!
hadd);
h++;
if(h>=24)
{h=0;}
}
if(madd==0)
{
while(!
madd);
m++;
if(m>=60)
{m=0;}
}
}
if(turn==1)//设置闹钟
{
if(hadd==0)
{
while(!
hadd);
nh++;
if(nh>=24)
{nh=0;}
}
if(madd==0)
{
while(!
madd);
nm++;
if(nm>=60)
{nm=0;}
}
}
}
voidstudent_name()
{
uchari;
write_com(0x80+0x0b);//选择显示的地址
for(i=0;i<6;i++)
{
write_data(name[i]);
}
}
voidmain()
{
init();
while
(1)
{
keyscan_1();
keyscan_2();
student_name();
shijian();
play_nz();
nz();
zhengdian();
}
}
voidT0_test()interrupt1
{
TH0=0x0FF;
TL0=0x9C;//
count++;
if(count==100)//中断10次,时间1秒
{
count=0;
ms++;
ms_1++;
if(ms==100)
{
ms=0;
s_1++;
if(s_1==60)//减到0之后停止
{
s_1=0;
m++;
if(m==60)
{m=0;
h++;
if(h>=24)
{
h=0;
}
}
}
}
if(ms_1==100)
{
ms_1=0;
s_2++;
if(s_2==60)//减到0之后停止
{
s_2=0;
m_1++;
if(m_1==60)
{m_1=0;
h_1++;
if(h_1==24)
{
h_1=0;
}
}
}
}
}
}
voidI0_test()interrupt0
{
if(flag==1)
{
h_2=h_1;
m_2=m_1;
s_3=s_2;
ms_2=ms_1;
}
if(flag==0)
{
h_1=0;
m_1=0;
s_2=0;
ms_1=0;
}
flag=!
flag;
}
三、电路仿真
液晶屏的工作:
1602LCD内置HD44780专用液晶显示控制器,分为带背光和不带背光两种,带背光的比不带背光的厚,在应用中并无差别。
显示容量为16*2个字符。
芯片工作电压:
4.5-5.5V:
最佳工作电压为5V。
工作电流:
2.0mA。
各引脚功能:
VSS:
电源地VDD:
电源正极VEE:
液晶显示偏压,为对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高会产生鬼影,使用时可以通过一个10k的电位器调整对比度。
RS:
数据/命令选择信号,高电平时选择数据寄存器、低电平时选择指令寄存器。
RW:
读/写控制信号,高电平时进行读操作,低电平时进行写操作。
E:
使能端,为1时读取信息,当E端由高电平跳变成低电平时液晶模块执行命令。
D0~D7:
8位双向数据线BLA:
背光源正极BLK:
背光源负极。
仿真后从十点开始计时。
闭合开关开始调节时间。
(上面按键调节分钟,下面按键调节小时)。
调节后时间显示,与当时时间一致。
闹钟的调节
断开开关调节闹钟,上面按键调节分钟,下面按键调节小时,调节闹钟到12点。
当闹钟时间与显示时间一致时,蜂鸣器响,响铃时间为一分钟
蜂鸣器的工作原理
(蜂鸣器)
秒表计时
右边开关闭合,左边按键按下开始计时,再次按下左边按键暂停,右边开关断开这计时清零。
重复开始操作则可重新计时。
四、设计心得及体会
本次数数字时钟的设计过程比较漫长,主要是设计功能较多,有些功能的设计遇到不少难题,主要是秒表的设计,通过查阅资料,最终也是解决。
本次设计主要运用到了单片机和1602液晶显示屏来实现数字时钟计时,校准,闹钟,秒表等功能。
这次电子设计收获很多,主要是对单片机和电子设计有了更深的了解,本次也不是第一次使用protues进行仿真,所以进展还比较顺利,最终成功实现报告所要求的全部内容,也是非常的欣慰。
单片机的设计一直是个难题,因为没有专门上过这方面的课程,许多东西只能自学和请教学习过的同学,可以说是费了很多心思。
其实设计中,较大的问题是程序的编写,平常很少实现这么多功能的设计,所以c语言编程也相应比较复杂,重新参考了c语言程序设计和相应资料,程序长所以中间出现错误也很多,有些是疏忽造成,有些是语法错误,所以修改了较长时间。
费的心思越多,学的也越多,学到这里,我也体会到单片机的强大和重要性,在以后的学习中一定要多多练习,更多的使用和了解其功能,做出更好更强大的设计。
参考文献:
[1]康华光.电子技术基础高等教育出版社出版日期:
2006.1(2014.1重印)
[2]吴建国、张彦.数字电子技术华中科技大学出版社出版日期:
2010.8
[3]孙焕铭、赵会成、王金51单片机C程序应用实例讲解北京航空航天大学出版社出版日期:
2011.3
[4]谭浩强C程序设计清华大学出版社出版日期:
2010.6(2013.11重印)
[5]李亮51单片机定时器/计数器的结构和原理电气自动化技术网时间2013-03-03
[6]网址1602液晶显示原理
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多功能 数字 设计