基于单片机的学校打铃系统
基于单片机的学校打铃系统
摘要:自动打铃系统,是以一片8位单片机为核心的实时时钟及控制系统。我们知道单片机的外接石英晶体振荡器能提供稳定、准确的基准频率,并经12分频后向内部定时器提供实时基准频率信号,设定定时器工作在中断方式下,连续对此频率信号进行分频计数,便可得秒信号,再对秒信号进行计数便可得到分、时等实时时钟信息。如果石英晶体振荡器的频率信号为6MHZ ,设定定时器定时工作方式1下,定时器为3CBOH ,则定时器每100ms 产生1次中断,在定时器的中断定时处理程序中,每10次中断,则向秒计数器加1,秒计数器计数到60则向分计数器进位(并建立分进位标志),分计数器计数到60,则向时计数器进位,如此周而复始的连续计数,便可获得时、分、秒的信号,建立一个实时时钟。接下来便可以进行定时处理和打铃输出,当主程序检测到有分进位标志时,便开始比较当前时间(小时与分、存放在RAM 中)与信息时间表上的作息时间(小时与分,存放在ROM )是否相同,如有相同者,则进行报时处理并控制打铃,如有不相同则返回主程序,如此便实现了报时控制的要求。
关键字:单片机;时间设置电路;计时电路;显示电路;定时打铃控制电路
0 前言
随着科技的不断发展,各种芯片都得到了很好的发展,80C52 同样如此,从开始的无人问津到现在的随处可见,红绿灯,记分牌,电子秒表,遥控器,电饭煲,电视等只要是电子产品,都会和芯片有关,其实芯片并不是什么神秘的高科技,它只是里面装了一些己编好的程序而己.而这里要介绍的是用C 语言来编程的一个系统,它能够让一个学校实现打铃自动化,总之,一个需要时间系统的机构实现自动提醒功能。
当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未有的速度被单片机智能控制系统所取代。单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。而本文是用STC89C52单片机设计的一个自动打铃系统。
1 总体方案设计
1.1 设计要求
它可以作为时钟电路来显示时间,进行设置,定时打铃。按照自顶向下设计方法划分自动打铃系统的功能。可分为:时间设置电路,计时电路,显示电路和定时打铃控制电路等。以学校的打铃情况设计:
表1 系统原理框图
1.2 设计方案选择
1.2.1 方案一:数字电路设计的自动打铃系统
利用函数信号发生器来进行脉冲信号输出,利用74160N 来设置十进制和六进制的进位输出。利用数码显示器来显示时间,利用或门、与门、非门、与非门、等电路元件进行组合实现打铃的控制。
1.2.2 方案二:基于单片机的自动打铃系统设计
单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将时字节清零。建立完一个实时时钟后接下来进行定时处理和打铃输出,当主程序检测到有分进位标志时,便开始比较当前时间与信息时间表上的作息时间是否相同,相同者,则进行报时处理并控制打铃,不相同则返回主程序,打铃又分为夏季和冬季二种作息时间。
1.2.3 方案确定
方案一的设计只能事先设定打铃时间不能完全自动打铃,且在修改打铃时间上存在一定的困难。而方案二中的设计能完全实现自动化,诠释了我们这次毕业设计的主题。并在修改打铃时间上有了很大的方便,只需修改一部分程序便能实现不同的需要。因此我选择方案二进行设计。
1.3 基本方案
1.3.1 设计课题简要概述
自动打铃装置用于工厂、学校等地的时间控制,本设计是按照学校作息时问设定的,模拟了电了钟显示时、分、秒。还根据学校的作息时间按时打铃,本系统有4 个按钮,分别用来设置、加、减和夏季/冬季,以保证始终与标准时间相吻合。
首先设计出本系统的硬件基本框图,根据框图设计电气原理图,简要概述基本原理,按照设计技术参数设计出各部分程序。
1.3.2 系统软硬件划分
由于需要最小系统设计,因此,极大地介于系统的硬件成本,所有能用软件实现的功能都用软件完成,如按键的去抖,采用延时,显示部分用动态显示等,这样硬件部分的设计可以采用单片机最小系统,所谓最小系统时仅有程序存储器和时钟及复位电路的单片机系统。
1.3.3 单片机选型
根据课题的具体内容,任务要求,计时、校时、定时、键盘显示等功能,经多方面考虑,所选系统选项用.与MSC-51单片机完全兼容的STC89C52 低功耗单片机。
1.4 总体设计框图
图1 整体框图
2 硬件电路设计
2.1 基本原理概述
本系统主要由主控模块,时钟模块,显示模块,键盘接口模块等4 部分构成。通过内部定时产生中断,从而使驱动电铃打铃。设定51 单片机工作在定时器工作方式1 ,每10ms 产生一次中断,利用软件将基准10ms 单元进行累加,当定时器产生
10 0次中断就产生lS 信号,这是秒单元加1 。同理,对分单元和时单元计数从而产生分,时的值,通过四位七段显示器进行显示。由于动态显示法需要数据所存等硬件,接口较复杂,考虑显示只有四位,且系统没有其他浮躁的处理程序,所有采用动态扫描LED 的显示。
本系统采用四个按键,调整时钟时间,当时钟时间和设置时间一直时,驱动程序动作,进行打铃,每次打铃60S 。
2.2 主要原件参数及功能简介
2.2.1 主控器STC89C52
STC 公司生产的STC89C52 单片机用高性能的静态89C52 设计,由先进工艺制造,并带有非易失性FLASH 程序存储器,它是· 种高性能、低功耗的8 位CMOS 微处理芯片,市场应用最多,主要特点有:8K 字节程序存储空间;512字节数据存储空间; 内带2K 字节EEPROM 存储空间;可直接使用串口下载;电源控制模式:时钟可停止和恢复,空闲模式,掉电模式;6个中断源;4个中断优先级;4个8位I/O口全双工增强型UART ;2个16位定时、计数器。
2.3 单元电路的设计
2.3.1显示电路设计
显示部分采用带时间显示的共阳数码管显示,采用动态扫描,以减少硬件电路,数码管分别为十时,时,十分,分显示,显示时采用串行口输出段码。
图2 显示电路
2.3.2 键盘接口电路设计
由于键盘只有四个,采用独立式按钮,分别与STC89C52 的P1.0, P1.1, P1.2和P1.3相连,用普通按钮10K 上拉电阻,用查询法完成读健功能。
图3 按键电路
2.3.3 响铃电路设计
响铃电路用到了蜂鸣器、三极管、3.3K 电阻。蜂鸣器两端分别接地和三极管。三极管一段电源另一端与电阻相连并接入STC89C52的P3.7接口。
图4 响铃电路
2.4 总体运行进程
首先实现24小时制电子钟,在4位数码管显示,显示为时分,实现的格式为:23:59。到达预定时间启动蜂鸣器开始打铃,打铃的方式分为早读、熄灯和上下课铃3种。系统使用了4个按键,用来调整时间。通过选择键选择调整位,选中位闪烁,按增加键为选中位加1,按减少键为选中位减1。
3 软件设计
3.1 基本原理概述
主程序首先是初始化部分,主要是计时单元清零,中断初始化,堆栈指针初始化,启动定时器工作,然后是调用显示子程序。主程序的起始存储地址是0000H 单元,但由于本系统用了定时器T0的中断,中断服务程序入口地址为000BH ,因此从0000H 单元起存放一条短调转指令AJMP ,使真正的主程序从0300H 单元开始存放。
3.1.1 中断服务程序设计
单片机内部的定时/计数器T0定时10ms ,即0.01s ,100次中断即为1秒,60秒为1分,60分为1小时,24小时为一天,如此循环,从而实现计时功能。
编写中断服务程序关键要注意:1. 现场保护,本系统中是累加器A 和程序状态字PSW 值的保护。2. 计时处理时采用的确十进制,因此时,分,秒单元加1后要进行十进制调整,即要执行DAA 指令,还要注意的是时计到24就回零,分和秒计到60就回零。3. 中断返回前的现场恢复。
3.1.2 显示程序设计和按键判断与按键处理程序设计
显示采用的是动态显示,段控和位控都经过反相器,显示的字形代码是共阳的显示代码,位控信号输出时是高电平有效,在校时时,采用的是点亮小数点信位调节器标志,哪位小数点亮表示调整的是该为的值。
显示子程序的第一部分是拆字,显示缓冲区是2FH —2AH ;第二部分是查字型码,输出段控和位控信号,由于采用的是动态显示,所以每出输出一位的段控和位控信号要延时一定的时间,使LED 显示器显示的字符时稳定的。
按键判断程序有编写时应注意按键的去抖动,该系统采用的是延时去抖动的方法,延时是通过调用子程序来实现的,每个按键按下后都要等待释放后再返回。
按键处理程序中的按键式校时的,所以进入按键处理程序后就关闭定时中断,对于动能键注意设置显示标志。
3.2 流程图
3.2.1 系统主程序流程图
4 调试分析
图5 主程序流程图 图6 硬件正面图
硬件焊接严格按照电路图。焊接时要注意短路、虚焊、缺焊的情况都不要出现,而且尽量减少跳线的出现。在每一次焊接完成后都要认真检查有没有出现错误,避免在总体的焊接完毕后,出现不知所以的问题。
下载程序完成后,再次检查无误后进行调试。加电后,在一切正常的情况下,数码管显示。
5 结论及进一步设想
完成自动打铃系统设计的毕业设计我能综合运用电子技术课程中的所学到的理论知识来完成自动打铃机的设计和分析电路,学会了在虚拟的环境下创建电路,计算和调整参数,我能灵活的应用PROTEUS0软件画图,并且掌握了一定的单片片机知识,通过这门课的设计我还有以下几点收获:
(1)有利于基础知识的掌握
通过这次设计我亲手做,自己思考,将理论知识上升到实践的高度,从而进一步打破了单片机的神秘面纱。
(2)有利于逻辑思维的锻炼。
在许多常规可生的日常学习中我们不难发现这样一个现象,不少学生的思维常处于混乱的状态,写作文来前言不搭后语,解起数学题来步骤混乱,这些都是缺乏思维训练的结果,程序设计是公认的,最能直接有效的训练学生的创造思维,培养分析问题解决问题的能力的方法之一。即使见到陌生的程序,从任务分析,确定算法界面布局,缩写代码到调试运行,都能顺利完成。
整个过程需要我们有条理的构思,这之间有猜测设计,判断思维的抽象思维训练,又有分析问题解决问题,预测日标等能力的培养。
参考文献
[1] 刘复华. 单片机及其应用系统[M].北京:清华大学出版社,1992.
[2] 潘新民,王燕. 微型计算机控制技术[M].北京:电子工业出版社,2003.
[3] 郑新才,陈刚. 电机原理及其应用[M].北京:中国水利水电出版社,2008.
[4] 余永权,汪明慧,单片机在控制系统中的应用[M].北京:电子工业出版社,2003.
[5] 胡汉才. 单片机原理及其接口技术[M].北京:清华大学出版社,2004.
[6] 孙涵芳, 徐爱卿.MCS-51/96系列单片机原理及引用[M].北京航空航天大学出版社,1996.
[7] 孙育才,苏学成. 单片微型计算机应用系统设计与实现[M].东南大学出版社,1990.
[8] 沈红卫. 基于单片机的智能系统设计与实现[M].电子工业出版社,2005.
[9] 杨宏丽,王静霞. 单片机基础教程[M].人民邮电出版社,2009.
[10] 赵星寒,刘小波,王庚兰. 从0开始教你学单片机[M].北京航空航天大学出版社,2008.
[11] 张志良. 单片机原理与控制技术[M].机械工业出版社,2009.
[12] 李光弟. 单片机基础[M].北京航空航天大学出版社,1992.
[13] 林毓梁. 单片机原理及应用[M].机械工业出版社,2009.
[14] 唐继贤.51单片机工程引用实例[M].北京航空航天大学出版社,2009.
课设体会
为时两周的课设结束了,可是我仍然有些意犹未尽的感觉,我感受到了实际操作给我们带来的乐趣,在老师和同学的帮助下,我的动手能力有了很大的提升。此次课设不但让我巩固了上课时所学到的内容,而且还学到了许多课堂上学不到的知识。
在此我要对吴星刚老师表示深深的感谢,课设的每一步,从选题构思、收集资料到论文结稿,无不倾注着导师的心血和汗水。这段时间以来,我的点滴进步都离不开老师的栽培与帮助,从您身上我深切体验到了“桃李不言,下自成蹊”的无私与伟大。吴老师渊博的知识、扎实的理论基础和严谨的治学态度使学生受益匪浅。吴老师对科学精益求精、不断进取的精神和严以律己、宽以待人的崇高品质对我是永远的鞭策。吴老师的教诲与关爱给了我莫大的信心和力量。吴老师以自身孜孜以求、从容奋进的人生态度,为我在工作、学习以及生活中遇到的许多两难选择提供了无声的指导。在本科毕业论文成稿之际,我由衷地向吴老师表示诚挚的谢意。
[2016年1月 10日完成]
附录1 电路原理图
附录2 程序清单
#include
#define uint unsigned int
#define uchar unsigned char //宏定义 sbit k1=P1^0; sbit k2=P1^1; sbit k3=P1^2; sbit k4=P1^3; sbit p1=P2^6; sbit p2=P2^5; sbit p3=P2^4; sbit p4=P2^3; sbit dp=P0^7; sbit fmq=P3^4; int a,b,c,d;
int shi=0,fen=0,miao=0;
int moshi=0;kaishi=0;tiaozheng=0;count1=0;count2=0;count3=0;ss=0;naozhong=0; uchar code LEDData[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; /*****延时子程序*****/ void Delay(uint i) {
while( i-- ); }
void qudou(void) //去抖延迟 { int i;
for(i=0;i
/*****显示温度子程序*****/ void xianshi()
{p1=0;p2=0;p3=0;p4=0; P0 =LEDData[d];
p1=1;p2=0;p3=0;p4=0; Delay(300);
p1=0;p2=0;p3=0;p4=0; P0 =LEDData[a];
p1=0;p2=1;p3=0;p4=0; Delay(300);
p1=0;p2=0;p3=0;p4=0; P0 =LEDData[b];
if(count1
p1=0;p2=0;p3=1;p4=0; Delay(300);
p1=0;p2=0;p3=0;p4=0; P0 =LEDData[c]; p1=0;p2=0;p3=0;p4=1; Delay(300);
p1=0;p2=0;p3=0;p4=0; }
void shuju1()
{switch(tiaozheng) {case 1: if(ss==0) {a=shi/10; b=shi%10;} else {a=10; b=10;}
c=fen/10; d=fen%10; miao=0; break;
case 2: a=shi/10; b=shi%10; if(ss==0) {c=fen/10; d=fen%10;} else {c=10; d=10;} miao=0; break; } }
void tiaozhengmoshi() { while(tiaozheng) {
if (k1==0) //调整 { qudou(); if(k1==0) {tiaozheng++;
if(tiaozheng==3) tiaozheng=0; }while(k1==0); }
if (k2==0) //加 { qudou(); if(k2==0)
{switch(tiaozheng)
{case 1: shi++;if(shi>=24) shi=0; break; case 2: fen++;if(fen>=60) fen=0; break; }
}while(k2==0); }
if (k3==0) //加 { qudou(); if(k3==0)
{switch(tiaozheng)
{case 1: shi--;if(shi
}while(k3==0); }
if (k4==0) //加 { qudou(); if(k4==0) {tiaozheng=0;
}while(k4==0); }
shuju1(); xianshi(); } }
void key() {
if (k1==0) //按键按下 { qudou();
if(k1==0) {tiaozheng=1; }while(k1==0); }
if(tiaozheng==1) tiaozhengmoshi(); }
void shuju() { a=shi/10; b=shi%10; c=fen/10; d=fen%10; }
void dingshi()
{ if(shi==7 && fen==10) naozhong=1; else
if(shi==7 && fen==40) naozhong=1; else
if(shi==7 && fen==50) naozhong=1; else
if(shi==8 && fen==35) naozhong=1; else
if(shi==8 && fen==40) naozhong=1; else
if(shi==9 && fen==25) naozhong=1; else
if(shi==9 && fen==45) naozhong=1; else
if(shi==10 && fen==30) naozhong=1; else
if(shi==10 && fen==35) naozhong=1; else
if(shi==11 && fen==20)
naozhong=1; else
if(shi==14 && fen==0) naozhong=1; else
if(shi==14 && fen==45) naozhong=1; else
if(shi==14 && fen==50) naozhong=1; else
if(shi==15 && fen==35) naozhong=1; else
if(shi==15 && fen==40) naozhong=1; else
if(shi==16 && fen==25) naozhong=1; else
if(shi==16 && fen==30) naozhong=1; else
if(shi==17 && fen==15) naozhong=1; else
if(shi==19 && fen==0) naozhong=1; else
if(shi==21 && fen==0) naozhong=1; else
if(shi==23 && fen==0) naozhong=1; else
naozhong=0; }
/*****主函数*****/ void main(void) { TMOD = 0x01; TH0 = 0x0D8; TL0 = 0x0F0; EA = 1;
ET0 = 1; TR0 = 1; while(1) { key(); shuju(); xianshi(); dingshi(); } }
void time0(void) interrupt 1 { TH0 = 0x0D8; TL0 = 0x0F0; if(tiaozheng==0) {count1++;
if(count1==92) {count1=0; miao++;
if(miao>=60) {miao=0;fen++;} if(fen>=60) {fen=0;shi++;} if(shi>=24) {shi=0;} } }
else count1=0; if(tiaozheng>=1) {count2++;
if(count2==50) {count2=0; ss=!ss; } }
else {count2=0;ss=0;}
if(naozhong==1) {count3++;
if(count3==50) {count3=0; fmq=!fmq; } } else
{fmq=1;count3=0;} }