课程设计单片机时钟打铃系统.docx
- 文档编号:29666991
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:24
- 大小:309.13KB
课程设计单片机时钟打铃系统.docx
《课程设计单片机时钟打铃系统.docx》由会员分享,可在线阅读,更多相关《课程设计单片机时钟打铃系统.docx(24页珍藏版)》请在冰豆网上搜索。
课程设计单片机时钟打铃系统
目录
第1章概述2
1.1设计要求2
1.2设计目的2
1.3设计意义2
第2章系统总体方案选择与说明3
第3章硬件电路设计4
3.1按键控制模块4
3.2时间显示模块5
3.3打铃模块6
第4章应用软件设计8
4.1系统软件设计思想8
4.2系统主程序8
4.3中断子程序9
4.4按键扫描子程序11
第5章系统仿真调试12
5.1软件简介12
5.2软件仿真12
第6章硬件调试与结果分析15
结束语17
致谢18
参考文献19
附录A系统硬件电路原理图20
附录B程序清单21
评分表29
第1章概述
1.1设计要求
本设计要求设计学校作息时间控制器,其设计实现的功能主要有:
使用4位七段显示器来显示现在的时间,显示格式为“时分”,由LED闪动作为秒计数表示,到响应时间打铃,可冬夏季切换。
可以设定作息时间,并进行到时提示。
能够根据预先设定好的作息时间表自动启停控制电路,完成对外部设备的实时控制。
1.2设计目的
增强对单片机的认识,与理解,提高时间能力与水平。
学会使用proteus仿真软件,充分把所学电路、模数电理论与实践结合,了解和掌握单片机设计软件与硬件设计结合过程、方法和实现,以及掌握单片机的内部模块的应用。
1.3设计意义
用单片机及c语言编程模拟学校作息时间,到时打铃,以及冬季夏季手动切换打铃时间。
第2章系统总体方案选择与说明
由按键控制模块控制单片机最小系统的时间、月份、年以及打铃时间,在有单片机控制数码管显示以及蜂鸣器。
本次设计实现的功能主要有:
使用4位七段显示器来显示现在的时间,显示格式为“时分”,由LED小数点闪动作为秒计数表示。
可以设定作息时间,并进行到时提示。
能够根据预先设定好的作息时间表自动启停控制电路,完成对外部设备的实时控制。
由按键输入控制设置年月日以及当前时间、并可设置闹钟定时,时间到由蜂鸣器发出响声。
图2-1
第3章硬件电路设计
3.1按键控制模块
按键控制模块主要有由五个按键组成:
K1、K2、K3、K4、K5。
分别接P1.3-P1.7口。
K1的功能是模式切换键;K2的作用是加一;K3的作用是闹钟使能;K4的作用是减一;K5的作用是冬夏季切换。
图3-1
当需要设定时间或是校正时间,即可按下模式切换键来进行。
校正时间:
按第一次K1键,进入小时校正状态,通过按K2、K4键进行小时校正,按一下K2键则加一,按一下K3键则减一。
按第二次K1键,进入分校正状态,通过按K2、K4键进行分钟校正。
按第三次K1键,进入小时设定状态,此时若不需要设置则不操作。
按第四次K1键,进入分钟设定状态,若此时不需要设置则不操作。
按第五次K1键进入月份校正状态,通过按K2、K4键进行月份校正。
按第六次K1键,进入日校正状态,通过按K2、K4键进行日校正。
按下第七次K1键进入年份校正状态,通过按K2、K4键来进行年份校正。
校正完毕后,再按一次K1键,则退出时间校正状态,并显示当前校正后的准确时间。
设定时间:
按第一次K1键进入小时校正状态,此时若不需要设置,则不操作;以此类推。
第三次按下K1键,进入小时设定状态,通过按K2、K4键进行小时设定。
按下第四次K1键,进入分钟设定状态,通过按K2、K4键进行分钟设定。
设定完毕后,按一下K3键(闹钟使能)。
继续按K1键,若不需要设置,则不操作,以此类推,到按最后一次K1键则退出时间设定状态并显示当前时间,当时间与我们设定的时间一致时,通过闹钟电路响声提示。
若要关闭闹钟,此时再按一次K3键即可停止响声。
若k5=1,执行冬季打铃时间。
若k5=0,则执行夏季打铃时间。
3.2时间显示模块
本设计采用四位七段共阳数码管做显示模块,其中前两位做时、月份显示,其余两位作为分、日显示,选取前两位的一个dp点作为秒点。
单片机P0.0-P0.7分别接七段数码管的abcedfg和dp引脚。
P2.0-P2.3分别作为四个七段数码管的片选端。
图3-2
时间显示模块主要由四位数码管来显示,配合按键控制模块的校正与设定时间,相应的显示。
时间正常显示时,LED每闪动60次,分钟自动加一;每六十分钟小时自动加一;每24小时天自动加一。
3.3打铃模块
单片机p3.7口控制蜂鸣器,若数码管显示时间与设定的学校作息时间相同,蜂鸣器模拟打铃一分钟。
图3-3
打钟模块快的主要功能:
闹铃。
当设定时间与当前时间一致时,则闹钟自动闹铃进行提示,一分钟后,自动退出响铃状态,若按K3键,闹钟退出响铃状态。
第4章应用软件设计
4.1系统软件设计思想
本系软件设计中,利用单片机定时器设计时间计时处理,采用单片机内部的T0定时器溢出中断来实现,工作在T1方式下,定时50微妙,则连续中断20次即为一秒,得到了我们所需时间的最小单位。
该设计用C51编写程序,由于汇编语言的移植性比较差,而C语言则比较灵活。
许多子函数都可以直接移植过去。
在程序中除了有主函数外还包含许多子函数,如延时函数、按键扫描函数、初始化函数、时间显示函数、设定闹钟显示函数、设定日期显示函数、设定年份显示函数、月份选择函数、年份显示辅助函数、冬夏季作息时间切换函数。
4.2系统主程序
在主控程序循环中主要工作为扫描是否有按键,若有按健则做相应的功能处理,同时也扫描显示器显示时间数据,并检查所设置的时间是否到了。
时间计时处理程序是等过了1s后,则更新时间数据,将最新的时、分的数据转换为数字数据并显示在七段显示器上。
图3-2主程序流程图
4.3中断子程序
中断子程序的主要功能:
提供时间基准。
当连续中断20次时,即为一秒,此时秒加一。
当秒值为60时,分钟加一,同时秒清零;当分钟值为60时,小时加一,同时分钟值清零。
当小时为24时,天值加一,同时小时清零。
由于每月天数不定,1、3、5、7、8、10、12月为31天,当计数到此类月份时,天值为32时,月值加一,同时天值为1;4、6、9、11月为30天,当计数到此类月份时,天值为31时,月值加一,同时天值为1。
如果是闰年,则2月为29天,当计数到此类月份时,天值为30时,月值加一,同时天值为一。
如果不是闰年,则2月为28天,当计数此类月份时,天值为29时,月值加一,同时天值为一。
当月值为13时,则年值加一,同时月值为一。
图3-3定时器中断函数
4.4按键扫描子程序
按键扫描子程序是程序计中相当重要的一部分。
按键扫描子程序的功能是:
扫描是否有按键按下,若有键按下,则执行相应功能。
设计中包含了防抖动程序,延时20ms,判断是否为抖动,若不是抖动则执行相应程序功能。
第5章系统仿真调试
5.1软件简介
本次课程设计仿真主要采用proteus。
Proteus与其它单片机仿真软件不同的是,它不仅能仿真单片机CPU的工作情况,也能仿真单片机外围电路或没有单片机参与的其它电路的工作情况。
从某种意义上讲,是弥补了实验和工程应用间脱节的矛盾和现象。
5.2软件仿真
启动Proteus进行仿真时显示的初始化时间。
初始界面仿真图如图:
图5-1
时间校正:
当我们需要正确的显示时间即可进行时间校正,按一下K1即进入小时校正状态,通过K2加一或K4减一来进行小时校正,再按一次K1键即可进行分钟校正,校正原理同小时校正相同。
其仿真图如图5-2所示。
图5-2
日期校正:
当我们需要与当前日期保持一致时,则可以使用日期校正功能,连续按动五次K1键,则进入月份校正状态,通过K2加一键或K4减一键进行校正月份,再按一次K1键,则可进行日期校正,校正原理同月份校正原理相同。
其仿真图如图5-3。
图5-3
年份校正:
当我们需要保持年份与当前年份一一致时,则可以进行年份校正。
连续按动七次K1键,即进入年份校正状态,通过K2加一键或K4减一键进行校正。
其仿真图如图5-4所示。
图5-4
到时打铃:
当单片机显示时间与设定学校打铃时间相同时,蜂鸣器响。
如图5-5所示。
图5-5
第6章硬件调试与结果分析
结束语
此次课程设计为期两个星期,围绕着利用最小单片机系统设计模拟学校作息时间打铃系统,实现了时间计时,时间调整,时间暂停,到点响铃和冬夏季切换等功能。
使用4位七段显示器来显示现在的时间,显示格式为“时分”,由LED小数点闪动作为秒计数表示。
可以设定作息时间,并进行到时提示。
能够根据预先设定好的作息时间表自动启停控制电路,完成对外部设备的实时控制。
由按键输入控制设置年、月、日以及当前时间并可设置闹钟定时,显示时间与设计作息时间相同时由蜂鸣器发出响声。
设计之初,由于忽略了数码管共阴与共阳的问题,导致在硬件调试的时候未能成功,修改后,导致秒点不能闪烁,一直未能找出原因,最后发现是忽略了与、或之间没转换。
在设计冬夏季切换时,对主函数初始化问题理解不透彻,致使一开始不能切换。
在设计打铃时间表时,还可以采用查表法,此方法相比可以节约程序空间。
致谢
通过两周的课程设计,利用单片机把复位电路,显示电路,电源电路,继电器电路,电铃电路连接起来,在通过单片机的编程实现设计要求。
单片机作息时间控制系统是利用定时器计时处理来做秒计数,当所设置的时间到了,则发出一阵声响,启动继电器,由继电器可以控制收音机开启或者关闭。
时,分,秒数据是存在变量内并写入七段显示管的缓冲区内,由显示管扫描中定时时扫描而显示出时间。
我由最初的不知所措到后来的获益良多,觉得这两周过得很充实,也积累了一些设计的宝贵经验。
这些离不开我的团队对我的帮助,更离不开王老师的悉心指导。
参考文献
附录A系统硬件电路原理图
附录B程序清单
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodea[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbitK1=P1^4;
sbitK2=P1^5;
sbitK3=P1^6;
sbitK4=P1^7;
sbitsd=P1^0;
sbitBEEP=P3^7;
ucharm=59,h=7,sec=30,cnt=0,x,y,qian,bai,shi,ge;
ucharset_h=8;
ucharset_m=6;
ucharmonth=6;
ucharday=12;
ucharth0_f;
uchartl0_f;
uintyear=2013;
voiddelay(uchart);
voidscankey(void);
voidinit(void);
voiddisplay(void);
voidset_time(void);
voidset_day(void);
voidm_choose(void);
voidbianhuan(void);
voidbianhuan1(void);
voidtime0(void)interrupt1
{
TH0=0x3c;
TL0=0xb0;
cnt++;
if(y==1&&(set_h==h&&set_m==m))sd=0;
elsesd=1;
if(y==1&&(h==8&&m==0))sd=0;
elsesd=1;
if(cnt==20)
{
sec++;
cnt=0;
if(sec==60)
{
sec=0;
m++;
if(m==60)
{
m=0;
h++;
if(h==24)
{
h=0;
day++;
switch(month)
{
case1:
if(day==32){month++;day=1;}break;
case2:
if(year%4==0)
{if(day==30){month++;day=1;}}
else{if(day==29){month++;day=1;}}break;
case3:
if(day==32){month++;day=1;}break;
case4:
if(day==31){month++;day=1;}break;
case5:
if(day==32){month++;day=1;}break;
case6:
if(day==31){month++;day=1;}break;
case7:
if(day==32){month++;day=1;}break;
case8:
if(day==32){month++;day=1;}break;
case9:
if(day==31){month++;day=1;}break;
case10:
if(day==32){month++;day=1;}break;
case11:
if(day==31){month++;day=1;}break;
case12:
if(day==32){month++;day=1;}break;
}
if(month==13)
{
month=1;
year++;
}
}
}
}
if(x==0)bianhuan1();
}
}
timer1()interrupt3
{
BEEP=~BEEP;
}
voidmain(void)
{
init();
while
(1)
{
if(k5==0)
vary1();
if(k5==1)
vary2();
}
}
voidvary1()
{
display();
scankey();
if(y==1&&(set_h==h&&set_m==m))BEEP=0;
elseBEEP=1;
if(y==1&&(h==8&&m==0))BEEP=0;
elseBEEP=1;
if(y==1&&(h==8&&m==45))BEEP=0;
elseBEEP=1;
}
voidvary2()
{
{
display();
scankey();
if(y==1&&(set_h==h&&set_m==m))BEEP=0;
elseBEEP=1;
if(y==1&&(h==8&&m==2))BEEP=0;
elseBEEP=1;
if(y==1&&(h==8&&m==47))BEEP=0;
elseBEEP=1;
}
}
voidinit(void)
{
BEEP=0;
TMOD=0x11;
TH0=0x3c;
TL0=0xb0;
ET0=1;
TR0=1;
ET1=1;
TR1=0;
EA=1;
}
voiddisplay(void)
{
P2=0xfe;
P0=a[qian];
if(x%2==1&&cnt>=10)
P0|=0xff;
delay(20);
P2=0xfd;
P0=a[bai];
if(x%2==1&&cnt>=10)
P0|=0xff;
elseif(x==0&&cnt>=10)
P0&=0x7f;
delay(20);
P2=0xfb;
P0=a[shi];
if(((x%2==0&&x!
=0)||x==7)&&cnt>=10)
P0|=0x7f;
delay(20);
P2=0xf7;
P0=a[ge];
if(((x%2==0&&x!
=0)||x==7)&&cnt>=10)
P0|=0x7f;
delay(20);
}
voidm_choose(void)
{
switch(month)
{
case1:
if(day==32){month++;day=1;}break;
case2:
if(year%4==0){if(day==30){month++;day=1;}}
else{if(day==29){month++;day=1;}}break;
case3:
if(day==32){month++;day=1;}break;
case4:
if(day==31){month++;day=1;}break;
case5:
if(day==32){month++;day=1;}break;
case6:
if(day==31){month++;day=1;}break;
case7:
if(day==32){month++;day=1;}break;
case8:
if(day==32){month++;day=1;}break;
case9:
if(day==31){month++;day=1;}break;
case10:
if(day==32){month++;day=1;}break;
case11:
if(day==31){month++;day=1;}break;
case12:
if(day==32){month++;day=1;}break;
}
}
voidset_time(void)
{
qian=set_h/10;
bai=set_h%10;
shi=set_m/10;
ge=set_m%10;
}
voidset_day(void)
{
qian=month/10;
bai=month%10;
shi=day/10;
ge=day%10;
}
voidbianhuan(void)
{
qian=year/1000;
bai=year%1000/100;
shi=year%100/10;
ge=year%10;
}
voidbianhuan1(void)
{
qian=h/10;
bai=h%10;
shi=m/10;
ge=m%10;
}
voidscankey(void)
{
if(K1==0)
{
delay(20);
if(K1==0)
{
while(K1==0);
x++;
if(x==3)set_time();
elseif(x==5)set_day();
elseif(x==7)bianhuan();
elseif(x==8){x=0;bianhuan1();}
}
}
if(K2==0)
{
delay(20);
if(K2==0)
{
while(K2==0);
switch(x)
{
case0:
break;
case1:
h++;if(h==24)h=0;bianhuan1();break;
case2:
m++;if(m==60)m=0;bianhuan1();break;
case3:
set_h++;if(set_h==24)set_h=0;set_time();break;
case4:
set_m++;if(set_m==60)set_m=0;set_time();break;
case5:
day++;m_choose();set_day();break;
case6:
month++;if(month==13)month=1;set_day();break;
case7:
year++;bianhuan();break;
}
}
}
if(K3==0)
{
delay(20);
if(K3==0)
{
while(K3==0);
y++;
if(y==2)y=0;
}
}
if(K4==0)
{
delay(20);
if(K4==0)
{
while(K4==0);
switch(x)
{
case0:
break;
case1:
h--;if(h==255)h=23;bianhuan1();break;
case2:
m--;if(m==255)m=59;bianhuan1();break;
case3:
set_h--;if(set_h==255)set_h=23;set_time();break;
case4:
set_m--;if(set_m==255)set_m=59;set_time();break;
case5:
day--;m_choose();set_day();break;
case6:
month--;if(month==0)month=12;set_day();break;
case7:
year--;bianhuan();break;
}
}
}
}
voiddelay(uchart)
{
uchari;
do
{
for(i=0;i<23;i++)
;;;
}while(t--);
}
评分表
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 单片机 时钟 打铃 系统