1、基于单片机C定时闹钟的课程设计前言20世纪末,电子技术获得了飞速的发展。在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高.同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。 时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。但是,一旦重要事情,一时的耽误可能酿成大祸。例如,许多火灾都是由于人们一时忘记了关闭煤气或是忘记充电时间.所以有必要制作一个定时系统。随时提醒这些容易忘记时间的人。 而钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展
2、了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等等。所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。随着生活水平的提高,人们越来越追求人性化的事物。传统的时钟已不能满足人们的需求。而现代的时钟不仅需要模拟电路技术和数字电路技术而且更需要单片机技术,增加数字钟的功能。利用软件编程尽量做到硬件电路简单稳定,减小电磁干扰和其他环境干扰,减小因元器件精度不够引起的误差,但是数字钟还是可以改进和提高如选用更精密的元器件。但与机械式时钟相比已经具有更高的准确性和直观
3、性,且无机械装置,具有更长的使用寿命,因此得到了广泛的使用.数字钟通过数字电路实现时、分、秒.数字显示的计时装置,广泛用于个人家庭、车站、码头办公室等公共场所成为人们日常生活中不可少的必需品.由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度远远超过老式钟表。多功能数字钟的应用非常普遍。由单片机作为数字钟的核心控制器,通过它的时钟信号进行实现计时功能,将其时间数据经单片机输出,利用显示器显示出来。通过键盘可以进行校时、定时等功能。输出设备显示器可以用液晶显示技术和数码管来显示技术。 本系统利用单片机实现具有计时、校时等功能的数字时钟,是以单片机STC89C52为核心元件同时采用
4、LCD1602显示“时、“分、“秒”的现代计时装置.另外具有校时功能,秒表功能,定时器功能和继电器控制外围电路功能,利用单片机实现的数字时钟具有编程灵活,便于功能的扩充等优点。摘要单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。而51单片机是各单片机中最为典型和最有代表性的一种。本设计以STC89C52芯片为核心,辅以必要的外围电路,设计了一个结构简单,功能齐全的电子时钟,它由5V直流电源供电。在硬件方面,除了CPU外,使用LCD1602来进行显示。软件方面采用C语言编程。整个电子钟系统能完成时间的显示、调时、校时和三组定时闹钟的功能。选用单片
5、机最小系统应用程序,添加比较程序、时间调整程序及蜂鸣程序,通过时间比较程序触发蜂鸣,实现闹钟功能,完成设计所需求的软件环境.介绍并使用Keil单片机模拟调试软件,测试程序的可行性并用Proteus进行仿真。关键词:单片机,定时器,中断,闹钟,LCD1602第1章课题的背景1。1 课题的来源随着生活水平的提高,人们越来越追求人性化的事物,传统的时钟已不能满足人们的需求.现代的时钟不仅需要模拟电路技术而且需要数字电路技术和单片机技术,增加时钟的功能。数字电子钟可利用软件编程尽量做到硬件电路简单稳定,减小电磁干扰和其他环境干扰,减小因元器件精度不够引起的误差;尽管如此数字钟还是可以改进和提高,比如选
6、用更精密的元器件.但与机械式时钟相比已经具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,因此得到了广泛的使用。1.2 课题研究的目的和意义20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。 时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间.忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。但是,一旦重要事情,一时的耽误可能酿成大祸。例如,许多火灾都是由于人们一时忘记了关闭煤气或是忘记充电时间等造成
7、的.而钟表的数字化给人们生产生活带来了极大的方便。数字钟是通过数字电路实现时,分,秒数字显示的计时装置,广泛用于个人家庭、车站、码头办公室等公共场所,成为人们日常生活中不可少的必需品。由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能,诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烤箱、通断动力设备、甚至各种定时电气的自动启用等。所有这些,都是以钟表数字化为基础的.因此,研究数字钟及扩大其应用,有着非常现实的意义。1.3应解决的主要问题及达到的技
8、术要求使用STC89C52单片机结合字符型LCD显示器设计一个简易的定时闹钟LCD时钟,若LCD选择有背光显示的模块,在夜晚或黑暗的场合中也可使用。定时闹钟的基本功能如下:(1)同时设置一个夜晚的全芯片休眠功能,当定时时间到后,激活单片机同时启动报警,以起到一个节能的作用.(2)显示格式为“时时:分分”。(3)由LED闪动来做秒计数表示.(4)一旦时间到则发出声响,同时继电器启动,可以扩充控制家电开启和关闭。(5)程序执行后工作指示灯LED闪动,表示程序开始执行,LCD显示“00:00”,按下操作键K1K4动作如下:K1-设置现在的时间.K2-显示闹钟设置的时间。K3-设置闹铃的时间。K4闹铃
9、ON/OFF的状态设置,设置为ON时连续三次发出“哗”的一声,设置为OFF发出“哗”的一声。设置当前时间或闹铃时间如下。K1时调整。K2-分调整。K3设置完成。K4闹铃时间到时,发出一阵声响,按下本键可以停止声响.第2章方案的选择和论证2。1 单片机型号的选择通过对多种单片机性能的分析,最终认为STC89C52是最理想的电子时钟开发芯片。STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash存储器。STC89C52使用经典的MCS51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可
10、编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。2。2 按键的选择方案一:44矩阵式键盘。如果选择此方案,那么在修改时钟或设置闹铃时间时就可以直接从键盘输入,方便、快捷,但程序较为复杂。 方案二:独立式按键。如果设置过多按键,将会占用较多I/O口,而且会给布线带来不便,因此,此方案适用于按键较少的情况。如果选择此方案,由于按键较少,在修改时间或设置闹铃时间时就不能直接输入,只能通过加或减完成,稍为麻烦一些,但其程序简单。 由于并不需要经常修改时间和设置闹铃时间,而且方案二的程序简单,按键少、成本低,因此,选择方案二.2.3 显示器的选择方案一:液晶显示
11、器。如果选择此方案,将会降低系统的功耗,这样就可以用电池供电,便于携带.但液晶显示器的驱动电路复杂,使用起来有一定的难度. 方案二:用数码管作为显示器.数码管的驱动电路简单,使用方便,其缺点是功耗较大。 由于液晶显示器功耗低,显示的内容灵活,因此选择方案一。2。4 计时部分的选择如果使用时钟芯片,系统就不怕掉电且时间精确。但这种芯片比较贵,况且,设计本系统主要是为了学习单片机程序的编写和调试以及设计硬件电路的一些方法,因此采用软件的方法来计时而没有采用价格较高的时钟芯片。2。5 发音部分的设计通过三极管放大后驱动蜂鸣器工作。2.6 显示器驱动电路采用LCD1602显示所需显示的字符,需要用电位
12、器调节背光。2.7 电源的选择如果是用电池供电,就比较方便携带,但需要经常更换电池。况且,本系统的体积较大,即使使用电池供电也不能随身携带,因此,用电池供电不大合适,所以用5V外部稳压电源来供电。第3章数字电子钟的设计原理和方法3.1 设计原理系统原理图图3-1 系统原理图3。2 硬件电路的设计STC89C52单片机简介STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能.具有以下标准功能: 8k字节Flash,512字节RAM, 3
13、2 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。3。2.2 键盘电路的设计键盘采用4个独立按键实现对时钟和闹钟的设定及修改.时钟电路单片机的时钟产生方法有两种:内部时钟方式和外部时钟方式。本系统中STC89C52单片机采用内部时钟方式。最常用的内部时钟方式是采用外接晶体和电容组成的并联谐振回路。振荡晶体可在1。2MHz12MHz之间。电容值无严格要求,但电容取值对振荡频率输出的稳定性、大小和振荡电路起振速度有少许影响,一般可在20pF100pF之
14、间取值3。2。4蜂鸣器驱动电路发音部分是通过三极管放大驱动蜂鸣器工作,当闹钟开启时响三声,闹钟关闭时响一声。图36 蜂鸣器驱动电路3.2.5继电器电路当单片机的引脚输出高电平时,三极管截止,继电器线圈两端没有电位差,继电器衔铁释放,同时状态指示的发光二极管也熄灭,继电器的常开触点释放,相当于开关断开.在三极管截止的瞬间,由于线圈中的电流不能突变为零,继电器线圈两端会产生一个较高电压的感应电动势,线圈产生的感应电动势则可以通过二极管IN4148释放,从而保护了三极管免被击穿,也消除了感应电动势对其他电路的干扰,这就是二极管的保护作用。3。2.6LCD1602电路3.2。7复位电路复位电路工作原理
15、如上图所示,VCC上电时,电容充电,在电阻上出现电压,使得单片机复位;几个毫秒后,电容充满,电阻上电流降为0,电压也为0,使得单片机进入工作状态。工作期间,按下按键,电容放电.松手,电容又充电,在电阻上出现电压,使得单片机复位。总电路图3.3 软件部分的设计主程序部分的设计主程序流程图如下图37。是图 37主程序流程图 4个按键每个都具有两个功能,以最终实现菜单化的输入功能。采用通过逐层嵌套的循环扫描,实现嵌套式的键盘输入。当到达所设定的时间之后,蜂鸣器发出声音,并且继电器启动,以此控制连接的外围器件。 要达到按键具有多个功能,需在程序内设置变量,当按键按下与变量的值同时满足实现一个功能,不同
16、时满足时实现另一个功能。第4章实验结果此电子闹钟设计是先利用Proteus仿真软件进行仿真,实现了课程设计要求实现的功能.然后在使用AltiumDesigner绘制原理图和PCB,图3-14 运行仿真图实际电路运行图总结通过自己的不懈努力,我完成了单片机课程设计上的任务要求。功能上达标:时钟的显示,调时功能、校时功能、闹铃功能、闹钟设功能.其精确度完全可以满足日常生活显示时间的需要;调时功能,方便快捷;校时功能保证了时钟准确和可靠性,通过继电器可以扩展多种外围电路的可能。硬件设施合乎要求,软件设计可以配合硬件实现要求的功能。可见技术在不断进步,机械式时钟已经被淘汰,取而代之的是具有高度准确性和
17、直观性且无机械装置,具有更长的使用寿命等优点的数字时钟。数字时钟更具人性化,更能提高人们的生活质量,更受人们欢迎。 无可否认机械时代已经过去,电子时代已经到来。做为新时代的我们,更应该提高自身能力,适应新时代的发展。知识来自实践,多去生活中探询所需要的。对于上述所提到的研究课题,我们应尽量考虑到人的因素,增强时钟的实用性和操作性,为使用者提供切实的方便,营造一种舒适的生活氛围。所以,在设计的时候,应该从多方面、多角度去考虑问题,而且应该进一步提高时钟的质量。另外,在本次设计的过程中,我发现很多的问题,虽然以前没有做过这样的设计但通过这次设计我学会了很多东西,单片机课程设计重点就在于软件算法的设
18、计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,比如写一个程序看其功能很少认为编写程序简单,但到编程的时候才发现一些细微的知识或低级错误经常犯做不到最后常常失败,所以有些东西只有学精弄懂并且要细心才行,只学习理论有些东西是很难理解的,更谈不上掌握。从这次的课程设计中,我们真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的练习的过程中才能提高,我想这就是我在这次课程设计中的最大收获。附 录相关的程序代码:includereg52。h#includeintrins。hdefine ui
19、nt unsigned int#define uchar unsigned chardefine LCD1602_DB P0uchar code table=”CurrentTime”;uchar code table1=”00:00:00”;uchar key1Flag = 0;uchar key2Flag = 0;uchar key3Flag = 0;uchar key4Flag = 0;uchar temp = 0;uchar sec = 0;uchar min = 0;uchar hour = 0;uchar clkHour = 0;uchar clkMin = 0;uchar clk
20、Flag = 0;uchar beepNum = 0;uchar relayFlag = 1;sbit LCD1602_RS = P20; /数据/命令选择端(电平H/L)sbit LCD1602_RW = P21; /数据/命令选择端(电平H/L)sbit LCD1602_E = P22; /使能信号sbit Key1 = P10;sbit Key2 = P11;sbit Key3 = P12;sbit Key4 = P13;sbit Led = P24;sbit Speaker = P25;sbit Relay = P23;void Delay1ms() /12。000MHz unsign
21、ed char i, j; i = 12; j = 169; do while (-j); while (-i);void Delay20ms() /12。000MHz unsigned char i, j, k; _nop_(); _nop_(); i = 1; j = 234; k = 113; do do while (-k); while (j); while (-i);void Beep() Speaker = 0; Delay20ms(); Speaker = 1;void LcdWaitReady() unsigned char sta; LCD1602_DB = 0xFF; L
22、CD1602_RS = 0; LCD1602_RW = 1; do LCD1602_E = 1; sta = LCD1602_DB; LCD1602_E = 0; while(sta & 0x80);void LcdWriteCmd(unsigned char cmd) LcdWaitReady(); LCD1602_RS = 0; LCD1602_RW = 0; LCD1602_DB = cmd; LCD1602_E = 1; LCD1602_E = 0;void LcdWriteDat(unsigned char dat) LcdWaitReady(); LCD1602_RS = 1; L
23、CD1602_RW = 0; LCD1602_DB = dat; LCD1602_E = 1; LCD1602_E = 0;void LcdSetCursor(unsigned char x, unsigned char y) unsigned char addr; if(y = 0) addr = 0x00 + x; else addr = 0x40 + x; LcdWriteCmd(addr 0x80);void LcdShowStr(unsigned char x, unsigned char y, unsigned char str) LcdSetCursor(x, y); while
24、(*str != 0) LcdWriteDat(str+); void InitLcd1602() LcdWriteCmd(0x38); LcdWriteCmd(0x0C); LcdWriteCmd(0x06); LcdWriteCmd(0x01);void WriteAddress(uchar x) LcdWriteCmd(0x80 + x);void DisplayMinTens() /显示分十位 WriteAddress(0x49); LcdWriteDat((min / 10) + 0); Delay1ms();void DisplayMinUnits() /显示分个位 WriteAd
25、dress(0x4A); LcdWriteDat((min 10) + 0); Delay1ms(); void DisplayHourTens() /显示时十位 WriteAddress(0x46); LcdWriteDat((hour / 10) + 0); Delay1ms();void DisplayHourUnits() /显示时个位 WriteAddress(0x47); LcdWriteDat(hour 10) + 0); Delay1ms(); void DisplayClkMinTens() /显示时钟分十位 WriteAddress(0x49); LcdWriteDat(c
26、lkMin / 10) + 0); Delay1ms();void DisplayClkMinUnits() /显示时钟分个位 WriteAddress(0x4A); LcdWriteDat((clkMin 10) + 0); Delay1ms(); void DisplayClkHourTens() /显示时钟时十位 WriteAddress(0x46); LcdWriteDat((clkHour / 10) + 0); Delay1ms();void DisplayClkHourUnits() /显示时钟时个位 WriteAddress(0x47); LcdWriteDat(clkHour
27、 10) + 0); Delay1ms(); void DisplayClkSecTens() /显示秒十位 WriteAddress(0x4C); LcdWriteDat((sec / 10) + 0); Delay1ms(); void DisplayClkSecUnits() /显示秒个位 WriteAddress(0x4D); LcdWriteDat((sec % 10) + 0); Delay1ms(); void ScanKey4() if(Key4 = 0)(clkFlag =1)) Delay20ms(); if(Key4 = 0)(clkFlag =1)) clkFlag =
28、 0; beepNum = 0; key4Flag = 0; void InitTimer0() /初始化定时器0 TMOD = 0x01; TH0 = (65536 - 50000) / 256; TL0 = (65536 50000) 256; EA = 1; ET0 = 1; TR0 = 1; void main() InitLcd1602(); LcdShowStr(0,0,table); LcdShowStr(6,1,table1); InitTimer0(); while(1) if(sec = 60) sec = 0; min+; if(min = 60) min = 0; ho
29、ur+; if(hour = 24) hour = 0; LcdShowStr(0,0,table); DisplayHourTens(); DisplayHourUnits(); LcdShowStr(8,1,:”); DisplayMinTens(); DisplayMinUnits(); LcdShowStr(11,1,”:”); DisplayClkSecUnits(); DisplayClkSecTens();/= if((Key1 = 0)(key1Flag = 0) /设置当前时间 Delay20ms(); if(Key1 = 0)(key1Flag = 0)) TR0 = 0; InitLcd1602(); LcdShowStr(0,0,SetCurrentTime); DisplayHourTens(); DisplayHourUnits(); LcdShowStr(8,1,”:); DisplayMinTens(); DisplayMinUnits(); key1Flag = 1; while(key1Flag = 1) if(Key1 = 0) Delay20ms(); if(Ke
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1