单片机自动打铃系统设计方案.doc_第1页
单片机自动打铃系统设计方案.doc_第2页
单片机自动打铃系统设计方案.doc_第3页
单片机自动打铃系统设计方案.doc_第4页
单片机自动打铃系统设计方案.doc_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机自动打铃系统设计方案1.1 设计要求它可以作为时钟电路来显示时间,进行设置,定时打铃。按照自顶向下设计方法划分自动打铃系统的功能。可分为:时间设置电路,计时电路,显示电路和定时打铃控制电路等。(以信息科学与技术学院的打铃情况设计内容时间起床8:10 早自习7:30-8:10第一节课8:20-9:00第二节课9:10-9:50第三节课10:00-10:40第四节课10:50-11:30第五节课13:30-14:10第六节课14:20-15:00第七节课15:20-16:00第八节课16:10-16:50晚自习19:00-20:30熄灯22:301.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单片机完全兼容的AT89C52功耗单片机。1.4 总体设计框图图一 整体框图第二章 硬件电路设计2.1 基本原理概述本系统主要由主控模块,时钟模块,显示模块,键盘接口模块等4 部分构成。通过内部定时产生中断,从而使驱动电铃打铃。设定51 单片机工作在定时器工作方式1 ,每100ms产生一次中断,利用软件将基准100ms 单元进行累加,当定时器产生10 次中断就产生lS 信号,这是秒单元加1 。同理,对分单元和时单元计数从而产生秒,分,时的值,通过六位七段显示器进行显示。由于动态显示法需要数据所存等硬件,接口较复杂,考虑显示只有六位,且系统没有其他浮躁的处理程序,所有采用动态扫描LED 的显示。本系统采用四个按键,当时钟时间和设置时间一直时,驱动程序动作,进行打铃,每次打铃30S2.2 主要原件参数及功能简介2.2.1 主控器AT89C52AT89C52为8 位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52 相同,其主要用于会聚调整时的功能控制。功能包括对会聚主IC 内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。主要管脚有:XTAL1(19 脚)和XTAL2(18 脚)为振荡器输入输出端口,外接12MHz 晶振。RST/Vpd(9 脚)为复位输入端口,外接电阻电容组成的复位电路。VCC(40 脚)和VSS(20 脚)为供电端口,分别接+5V电源的正负端。P0P3 为可编程通用I/O 脚,其功能用途由软件定义,在本设计中,P0 端口(3239 脚)被定义为N1 功能控制端口,分别与N1的相应功能管脚相连接,13 脚定义为IR输入端,10 脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12 脚、27 脚及28 脚定义为握手信号功能端口,连接主板CPU 的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。2.2.2 DS13021)性能特性DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线:1.RSE复位,2.I/O数据线,3.SCLK 串行时钟。时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式通信。DS1302 工作时功耗很低,保持数据和时钟信息时功率小十1mW 。提供秒分时日日期。月年的信息,每月的天数和闰年的天数可自动调整时钟,操作可通过AM/PM 指示决定采用24 或12 小时格式。 2)管脚描述XI XZ 32.768KHz 晶振管脚GND 接地RST 复位脚I/O 数据输入/输出引脚SCLK 串行时钟Vcc1,Vcc2 电源供电管脚DS1302 串行时钟芯片8 脚 DIPDS1302S 串行时钟芯片8 脚 SOIC 200milDS1302Z 串行时钟芯片8 脚 SOIC 150mi2.3 单元电路的设计2.3.1显示电路显示部分采用1602采用标准的16脚接口,其中:第1脚:VSS为电源地第2脚:VCC接5V电源正极第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会 产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令普通的LCD1602显示2.3.2 键盘接口电路设计由于键盘只有四个,采用独立式按钮,用查询法完成读健功能。 图五 按键电路2.3.3 响铃电路设计响铃电路用到了蜂鸣器、三极管、1K电阻。蜂鸣器两端分别接地和三极管。三极管一段电源另一端与电阻相连并接入AT89C51的P3.7接口。电路原理图使用SH69P43 为控制芯片,使用4MHz 晶振作为主振荡器。 PORTC.3/T0 作为I/O 口通过三极管Q2 来驱动蜂鸣器LS1,而PORTC.2/PWM0 则作为PWM 输出口通过三极管Q1 来驱动蜂鸣器LS2。另外在PORTA.3 和PORTA.2 分别接了两个按键,一个是PWM 按键,是用来控制PWM 输出口驱动蜂鸣器使用的;另一个是PORT 按键,是用来控制I/O 口驱动蜂鸣器使用的。连接按键的I/O 口开内部上拉电阻。 先分析一下蜂鸣器。所使用的蜂鸣器的工作频率是2000Hz,也就是说蜂鸣器的驱动信号波形周期是500s,由于是1/2duty 的信号,所以一个周期内的高电平和低电平的时间宽度都为250s。软件设计上,将根据两种驱动方式来进行说明。 a) 蜂鸣器工作原理:PWM 输出口直接驱动蜂鸣器方式 由于PWM 只控制固定频率的蜂鸣器,所以可以在程序的系统初始化时就对PWM 的输出波形进行设置。 首先根据SH69P43 的PWM 输出的周期宽度是10 位数据来选择PWM 时钟。系统使用4MHz 的晶振作为主振荡器,一个tosc 的时间就是0.25s,若是将PWM 的时钟设置为tosc 的话, 则蜂鸣器要求的波形周期500s 的计数值为500s/0.25s=(2000)10=(7D0)16,7D0H 为11 位的数据,而SH69P43 的PWM输出周期宽度只是10 位数据,所以选择PWM 的时钟为tosc 是不能实现蜂鸣器所要的驱动波形的。 这里将PWM 的时钟设置为4tosc,这样一个PWM 的时钟周期就是1s 了,由此可以算出500s 对应的计数值为500s/1s=(500)10=(1F4)16,即分别在周期寄存器的高2 位、中4 位和低4 位三个寄存器中填入1、F 和4,就完成了对输出周期的设置。再来设置占空比寄存器,在PWM 输出中占空比的实现是 通过设定一个周期内电平的宽度来实现的。当输出模式选择为普通模式时,占空比寄存器是用来设置高电平的宽度。250s 的宽度计数值为250s/1s=(250)10=(0FA)16。只需要在占空比寄存器的高2 位、中4 位和低4 位中分别填入0、F 和A 就可以完成对占空比的设置了,设置占空比为1/2duty。 以后只需要打开PWM 输出,PWM 输出口自然就能输出频率为2000Hz、占空比为1/2duty 的方波。 b) 蜂鸣器工作原理:I/O 口定时翻转电平驱动蜂鸣器方式 使用I/O 口定时翻转电平驱动蜂鸣器方式的设置比较简单,只需要对波形分析一下。由于驱动的信号刚好为周期500s,占空比为1/2duty 的方波,只需要每250s 进行一次电平翻转,就可以得到驱动蜂鸣器的方波信号。在程序上,可以使用TIMER0 来定时,将TIMER0 的预分频设置为/1,选择TIMER0 的始终为系统时钟(主振荡器时钟/4),在TIMER0 的载入/计数寄存器的高4 位和低4 位分别写入00H 和06H,就能将TIMER0 的中断设置为250s。当需要I/O 口驱动的蜂鸣器鸣叫时,只需要在进入TIMER0 中断的时候对该I/O 口的电平进行翻转一次,直到蜂鸣器不需要鸣叫的时候,将I/O 口的电平设置为低电平即可。不鸣叫时将I/O 口的输出电平设置为低电平是为了防止漏电。2.4 总体运行进程首先实现24小时制电子钟,在8位数码管显示,显示为时分秒,实现的格式为:23-59-59。到达预定时间启动蜂鸣器开始打铃,打铃的方式分为起床、熄灯和上下课铃两种。系统使用了4个按键,3只按键用来调整时间,另一只为强制打铃按钮。通过选择键选择调整位,选中位闪烁,按增加键为选中位加1,按减少键为选中位减1。按强制打铃按钮是实现强制打铃或者强制关闭打铃。第三章 软件电路设计及流程图3.1 基本原理概述主程序首先是初始化部分,主要是计时单元清零,中断初始化,堆栈指针初始化,启动定时器工作,然后是调用显示子程序。主程序的起始存储地址是0000H单元,但由于本系统用了定时器T0的中断,中断服务程序入口地址为000BH,因此从0000H单元起存放一条短调转指令AJMP,使真正的主程序从0300H单元开始存放。3.1.1 中断服务程序设计单片机内部的定时/计数器T0定时100ms,即0.1s,10次中断即为1秒,60秒为1分,60分为1小时,24小时为一天,如此循环,从而实现计时功能。编写中断服务程序关键要注意:1.现场保护,本系统中是累加器A和程序状态字PSW值的保护。2.计时处理时采用的确十进制,因此时,分,秒单元加1后要进行十进制调整,即要执行DAA指令,还要注意的是时计到24就回零,分和秒计到60就回零。3.中断返回前的现场恢复。3.1.2 显示程序设计和按键判断与按键处理程序设计显示采用的是动态显示,段控和位控都经过反相器,显示的字形代码是共阳的显示代码,位控信号输出时是高电平有效,在校时时,采用的是点亮小数点信位调节器标志,哪位小数点亮表示调整的是该为的值。显示子程序的第一部分是拆字,显示缓冲区是2FH2AH;第二部分是查字型码,输出段控和位控信号,由于采用的是动态显示,所以每出输出一位的段控和位控信号要延时一定的时间,使LED显示器显示的字符时稳定的。按键判断程序有编写时应注意按键的去抖动,该系统采用的是延时去抖动的方法,延时是通过调用子程序来实现的,每个按键按下后都要等待释放后再返回。按键处理程序中的按键式校时的,所以进入按键处理程序后就关闭定时中断,对于动能键注意设置显示标志。3.2 流程图3.2.1 系统主程序流程图3.2.2 系统定时中断流程图第四章 系统程序设计4.1 程序设计概要程序名称:51 单片机自动扫铃机控制系统说明:实现24 小时制电子钟,8 位数码管显示,显示时分秒显示格式:23-59-59(小时十位如果为0 则不显示)。到预定时问启动蜂鸣器模拟打铃,蜂鸣器BEEP: P3.7。打铃方式分起床、熄幻铃和上、下课铃两种。系统使用4 只按键,3 只按键用来调整时间,另一只为闹钟按钮即定时扫铃。键SET_KFY: PI.0;通过选择键选择调整位,选中位闪烁。增加键ADD_KEY:PI.1;按一次使选中位加1。减少键DEC_KEY: PI.2;按一次使选中位位。1如果长按ADD_KEY 或DEC_KEY,识别后则进行调时快进,此时停止闪烁。如果选中位是秒,则按增加键或减少键都是将秒清零。定时扫铃键DALING_KEY: P1.3;用来强制打铃或强制关闭铃声PO 口输出数码管段选信号,P2 口输出数码管位选信号。晶振12M4.2 源程序清单#include /包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include #include ds1302.h#include delay.h#include 1602.h#include i2c.h/管脚定义sbit SPEAK= P37; /蜂鸣器sbit KEY_SET=P32; /设置 返回sbit KEY_ENTER=P33; /确认 下一个参数sbit KEY_UP=P34; /增加sbit KEY_DOWN=P35; /减小sbit KEY_SAVE=P36; /保存/按键菜单的数据定义bit bSet_Time_Flag = 0;/进入设置时间的标志位bit bShow_Time_Flag = 1;/进入设置时间的标志位unsigned char ucPage = 0;/页面菜单unsigned char ucMenu_Count = 1;/菜单的数据bit bSet_Model_Frash = 0;/数据保存相关#define FLAG_ADDR 250#define FLAG_DAT 41 #define MAX_LIST 15#define Start_Time_First 0 /第一个保存的时间/设置的时间缓存idata unsigned char ucSave_Time_Set163 = 10,0,0, 10,45,0, 10,55,0, 11,40,0, 12,10,0, 12,55,0, 13,5,0, 13,50,0, / 16,0,0, 16,45,0, 16,55,0, 17,40,0, 18,10,0, 18,55,0, 19,5,0, 19,50,0; /void Write_Time_Dat(unsigned char ucAddr,unsigned char *ucSet_Time)/数据定义bit bRead_Time_Flag = 1;bit bSave_Dat_Flag = 0;/保存标志位 unsigned char time_use_Set8;unsigned char time_use_Set_Dis16; /*- 主函数-*/ /读取时间 void Read_Time_Once(void); /定时器初始化 void Init_Timer0(void);/按键扫描函数void Key_Scan(void); void Del_Time(unsigned char ucPage,unsigned char ucPositon,unsigned char ucHang_Num,char ucDel_Fun);/主函数入口void main (void) unsigned char ucGlobal_Dat = 0;/临时使用的变量SPEAK = 1;LCD_Init(); /初始化液晶DelayMs(20); /延时有助于稳定LCD_Clear(); /清屏/ Ds1302_Init(); /ds1302初始化Ds1302_Read_Time(); /首次读取时间LCD_Write_String(0,0,OPEN SYSETM ) ; /之前没有写入时间 就要写入时间if( FLAG_DAT != read_IIC(FLAG_ADDR)/标志位没有写入 Ds1302_Write_Time(); write_IIC(FLAG_ADDR, FLAG_DAT); for(ucGlobal_Dat = Start_Time_First;ucGlobal_Dat Start_Time_First + 48;ucGlobal_Dat += 3) Write_Time_Dat(ucGlobal_Dat,ucSave_Time_SetucGlobal_Dat/3); DelayMs(2); else for(ucGlobal_Dat = Start_Time_First;ucGlobal_Dat 7) ucMenu_Count = 1; ucPage+;if(ucPage = (MAX_LIST + 1)/限值处理 ucPage = 0; bSet_Model_Frash = 1; while(KEY_ENTER = 0); else if(KEY_UP = 0)/增加 DelayMs(10); if(KEY_UP = 0) if(bSet_Time_Flag = 0) return; if(ucMenu_Count = 1) Del_Time(ucPage,0,0,1);/减法 else if(ucMenu_Count = 4) Del_Time(ucPage,1,0,1);/减法 else if(ucMenu_Count = 4) Del_Time(ucPage,2,0,1);/减法 bSet_Model_Frash = 1; bSave_Dat_Flag = 1; while(KEY_UP = 0); else if(KEY_DOWN = 0)/减小 DelayMs(10); if(KEY_DOWN = 0) if(bSet_Time_Flag = 0) return; if(ucMenu_Count = 1) Del_Time(ucPage,0,0,0);/减法 else if(ucMenu_Count = 4) Del_Time(ucPage,1,0,0);/减法 else if(ucMenu_Count = 4) Del_Time(ucPage,2,0,0);/减法 bSet_Model_Frash = 1; bSave_Dat_Flag = 1;/数据发生改变 while(KEY_DOWN = 0); else if(KEY_SAVE = 0)/保存 DelayMs(10); if(KEY_SAVE = 0) if(bSet_Time_Flag = 0) return;LCD_Clear( );if(bSave_Dat_Flag = 1)LCD_Write_String(0,0,SAVE TIME DATA OK) ; for(cI = Start_Time_First;cI Start_Time_First + 48;cI += 3) Write_Time_Dat(cI,ucSave_Time_SetcI/3); for(cI =0;cI ) ; DelayMs(200); DelayMs(200); DelayMs(200); bSave_Dat_Flag = 0;else LCD_Write_String(0,0,TIME NOCHANGE ) ; LCD_Write_String(0,1,SAVE TIME FAILRE ) ; /保存失败 DelayMs(200); DelayMs(200); DelayMs(200); LCD_Clear( ); bSet_Model_Frash = 1; while(KEY_SAVE = 0); if(bSet_Model_Frash) /LCD_Write_Com(0x0c);/归位bSet_Model_Frash = 0;Show_Time(0,0,ucSave_Time_SetucPage,ucPage);LCD_Write_String(14,0,-);if(ucPage (MAX_LIST) Show_Time(0,1,ucSave_Time_SetucPage + 1,ucPage + 1); else Show_Time(0,1,ucSave_Time_SetucPage - MAX_LIST,ucPage - MAX_LIST); / LCD_Write_Com(0x0f); LCD_Write_Com(0x80 + ucMenu_Count);/ /读取一次时间unsigned char ucTime_Old = 0; void Read_Time_Once(void) char cTime_Copy = 0; if(bRead_Time_Flag)Ds1302_Read_Time();/读取时间参数 if(bShow_Time_Flag) /显示当前的时间 sprintf(time_use_Set_Dis,DATE %02d-%02d-%02d ,(int)time_buf11,(int)time_buf12,(int)time_buf13);/年月日周 /,(int)time_buf17LCD_Write_String(0,0,time_use_Set_Dis);/显示第一行 sprintf(time_use_Set_Dis,TIME %02d:%02d:%02d,(int)time_buf14,(int)time_buf15,(int)time_buf16);/时分秒LCD_Write_String(0,1,time_use_Set_Dis);/显示第二行for(cTime_Copy = 0;cTime_Copy 8;cTime_Copy+)time_use_SetcTime_Copy = time_buf1cTime_Copy; /判断数据 if(ucTime_Old != time_buf15) ucTime_Old = time_buf15; for(cTime_Copy = 0;cTime_Copy (MAX_LIST + 1);cTime_Copy+) if(time_buf14 = ucSave_Time_SetcTime_Copy0 )&(time_buf15 = ucSave_Time_SetcTime_Copy1 ) for(cTime_Copy = 0;cTime_Copy =24)ucTime0 = 0;if(ucTime1=60)ucTime1 = 0;if(ucTime2=60)ucTime2 = 0; /时间处理函数 /根据页面参数 选择对应的参数列表 void Del_Ti

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论