首页 学校教务系统自动打铃系统设计_

学校教务系统自动打铃系统设计_

举报
开通vip

学校教务系统自动打铃系统设计_目 录 TOC \o "1-2" \h \z \u 一、设计任务和性能指标 2 1.1设计任务 2 1.2性能指标 2 二、设计方案 2 三、系统硬件设置 3 3.1、单片机最小系统 3 3.2时钟电路DS1302 4 3.3、显示电路的设计 5 3.4、键盘接口的设计 6 3.5打铃电路的设计 6 四、系统软件设计 7 4.1程序流程图 7 4.2主程序设计 10 4.3显示子程序的设计 12 五、调试及性能分析 12 5.1调试步骤 13 5.2性能分析 13 六、心得体会 13 参考文献 13 附录1 系统硬...

学校教务系统自动打铃系统设计_
目 录 TOC \o "1-2" \h \z \u 一、 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 任务和性能指标 2 1.1设计任务 2 1.2性能指标 2 二、设计 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 2 三、系统硬件设置 3 3.1、单片机最小系统 3 3.2时钟电路DS1302 4 3.3、显示电路的设计 5 3.4、键盘接口的设计 6 3.5打铃电路的设计 6 四、系统软件设计 7 4.1程序流程图 7 4.2主程序设计 10 4.3显示子程序的设计 12 五、调试及性能分析 12 5.1调试步骤 13 5.2性能分析 13 六、 心得体会 决胜全面小康心得体会学党史心得下载党史学习心得下载军训心得免费下载党史学习心得下载 13 参考文献 13 附录1 系统硬件电路图 15 附录2 程序清单 16 一、设计任务和性能指标 1.1设计任务 用单片机器件为主体,设计一台自动打铃系统。 (一)基本要求 1、基本计时和显示功能(用12小时制显示)。包括上下午标志,时、分的数字显示,秒信号指示。 2、能设置当前时间(含上、下午,时,分)。 3、能实现基本打铃功能, 规定 关于下班后关闭电源的规定党章中关于入党时间的规定公务员考核规定下载规定办法文件下载宁波关于闷顶的规定 :上午6:00起床铃:打铃5秒、停2秒、再打铃5秒。下午10:30熄灯铃:打铃5秒、停2秒、再打铃5秒。铃声可用小喇叭播放,凡是用到铃声功能的均按此处理。 (二)发挥部分 1、增加整点报时功能,整点时响铃5秒,要求有控制启动和关闭功能。 2、增加调整起床铃、熄灯铃时间的功能。 3、增设上午4节课的上下课打铃功能,规定如下: 7.30 上课,8.20下课:8.30上课,9.20下课;9.40 上课,10.30下课;10.40上课,11.30下课;每次铃声5秒。 4、特色和创新自选。 1.2性能指标 1.​ 时钟:上下午(1位)、时(2位) 、分(2位) 2.​ 校对键:确认键/设置键 、右移键/灭铃键、加键、减键 3.​ 响铃:蜂鸣器二.设计方案 二、设计方案 按照系统设计的功能的要求,初步确定设计系统由主控模块、时钟模块、显示模块、键扫描接口电路共四个模块组成,电路系统构成框图如图1.1所示通过内部定时产生中断,从而驱动电铃打铃。电路系统构成框图如图1.1所示。主控芯片使用51系列AT89C52单片机,采用高性能的静态80C51设计,由先进工艺制造,并带有非易失性Flash程序存储器。它是一种高性能、低功耗的8位COMS微处理芯片,市场应用最多。 时钟芯片使用美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片DS1302。采用DS1302作为主要计时芯片、可以做到计时准确。更重要的是,DS1302可以在很小的电流的后备电源(2.5~5.5V电源,在2.5V时耗电小于300nA)下继续计时,并可编程选择多种充电电流对后备电源进行慢速充电,可以保证后备电源基本不耗电。采用串行数据传输,与单片机硬件连接简单,如果使用时钟芯片DS12887,将采用并行数据传输,占用更多的硬件资源。因此为节省单片机端口,时钟芯片采用DS1302。 1.1 硬件电路设计 设定51单片机工作在定时器工作方式1,每100ms产生一次中断,利用软件将基准100ms单元进行累加,当定时器产生10次中断就产生1S信号,这时秒单元加1。同理,对分单元时单元和上下午单元计数,从而产生秒,分,时,上下午的值,通过五位七段显示器进行显示。由于动态显示法需要数据锁存等硬件,接口较复杂,考虑显示只有五位,且系统没有其他复杂的处理任务,所以采用动态扫描实现LED的显示。 本系统采用四个按键,1键为功能键,另外三个做控制键。按一下1键进入时间设置,接着按2键选择需要调整的位,然后按3和4键进行时调整,按3键进行加数,按4键进行减数,按两下1键调整结束时钟继续走动。当时钟时间与设置时间一致时,驱动电路动作进行打铃,按时间点不同打铃规则不同,此时按2键强制灭铃。 三、系统硬件设置 3.1单片机最小系统 单片机最小应用系统的设计电路原理图,如图3.1所示。 本次设计我们选用了AT89C52单片机。该单片机要求电源电压为+5V,所以40号引脚接+5V电源,20号脚接地。因为AT89C52单片机的片内ROM为4KB,128位RAM,根据初步分析,本设计程序应该小于4KB,故无须外扩的ROM,所以单片机应直接访问片内程序存储器,单片机的31号脚接高电平。 AT89C52单片机是一种时序逻辑电路,必须有脉冲信号才能正常工作,而时钟脉冲是由振荡电路提供的,时钟可以由内部方式或外部方式产生,内部振荡方式,只要接上两个微调电容和一个晶振即可,其中微调电容选用33pF其作用是稳定振荡频率,快速起振。本次毕业设计我们采用内部振荡方式,外接晶振为11.0592MHz,振荡周期=1/11.0592μs, 时钟周期=2/11.0592μs,机器周期=12/11.0592μs,指令周期=1~4μs。 AT89C52在开机时需复位,以便CPU及其它功能部件都处于确定的初始状态,有利于进行下一步操作。MCS-51系列单片机的有效复位信号两个机器周期以上的高电平。其复位的实现通常可以采用开机上电复位和外部手动复位两种方式。图中采用的是开机上电复位,复位电路由10μF的电解电容和8.2K电阻组成,其时间常数为T=RC,T=10μf×8.2k,T=82ms大于10ms,所以单片机能够有效复位,单片机只要保持82ms以上的高电平就能使单片机有效复位 图3.1 单片机最小应用系统 3.2时钟电路DS1302 (1)性能特性 实时时钟可对秒,分,时等进行计数,存在高速数据暂存的31*8位RAM,最少引脚的串行I/O口;2.5~~5.5V电压工作范围;2.5V耗电小于300nA;用于时钟或RAM数据读/写的单字节或多字节数据传送方式;简单的3线接口;可选的慢速充电的能力。 DS1302时钟芯片包括实时时钟和31字节的静态RAM,它经过一个简单的串行接口与微处理器通信,实时时钟提供秒,分,时等信息,时钟运行可以采用24H,或带AM/PM的12H格式,采用三线接口与CPU进行同眇通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302有主电源/后备电源双电源引脚; (2)工作原理 DS1302在任何数据传送时必须先初始化,把RST引脚置为高电平,然后把8位地址和命令装入移位寄存器,数据在SCLK的上升沿被输入,无论是读周期还是写周期开始8位指定40个寄存器中哪个将被访问到,在开始8个时钟周期,把命令字节装入揿位寄存器之后,另外的时钟周期在闱时操作时输出数据,在写操作时写入数据,时钟脉冲的个数在单位字节下为8加8,在多字节方式下为8加字节数,最大可达248字节数。 为了提高对32个地址的寻址能力,可以把时钟或RAM寄存器规定为多字节方式,在多字节方式中,读或写从地址0的位0开始,必须管按数据传送的次序电先的8个寄存器。但是当以多个字节写RAM时,为了传送数据不必写所有31字节,不管是否写了全部31字节,所写的每个字节都将传送至RAM。 时钟暂停:秒寄存器的位7定义位时钟暂停位,当它为1时,DS1302停止振荡,进入低功耗的备份方式,通常在对DS1302进行写操作时,停止振荡,当它为0时时钟将开始启动。 8051通过串口向DS1302写数据的程序框图如图3.2,其中,Px可以是8051单片机的任何一位I/O口,注意因为DS1302的数据发送或接收时序和8051的串行口不完全一致,因此,需要在TXD的输出端加反相器,另外,接收数据时,不能以串行口的接收方式接收,必须将串行口当作普通I/O口进行数据接收. DS1302的晶振选用32.768KHZ,电容推荐值为6PF,因为振荡频率较低,也可以不接电容, 对计时精度影响不大。 图3.2 DS1302写数据的程序框图 3.3显示电路的设计 显示部分采用普通的共阳数码管显示,采用动态扫描,以减少硬件电路,数码管分别为上下午,十时,时,十分,分显示,显示时采用串行口输出控制数码管,其中P2.2~P2.4口控制数码管的位选,低电平数码管显示,动态扫描显示中单片机P0口输出数码管的段码。 3.4键盘接口的设计 图3.4 键盘电路 本次设计的控制电路是由4个按键组成的,用以实现时钟信息的调整。其电路图如图3.4所示,按键与P1口的P1.0到P1.3相连。由于P1口内有上拉电阻,所以该图中上拉电阻可以省去。四个按键中,S1为数据+1键,S2为数据-1键,S3为数据选择键,S4为强制打铃或者强制关闭键。 3.5打铃电路的设计 本次设计打铃电路如图3.5所示,单片机通过P3.7控制蜂鸣器是否发出声响。当时间与预定打铃时间相同时,单片机通过P3.7输出为1KHz的方波,使得蜂鸣器发出声响。图中PNP三极管作用是电流放大,以保证蜂鸣器能正常发出声音。 图3.5 打铃电路 四、系统软件设计 4.1程序流程图 主程序流程图 定时中断程序流程图 显示程序流程图 4.2主程序设计 void main() { uchar NowKey; uchar BeforKey=0xff; uchar KeyCount=0; uchar i=0; AlarmSingal=0; RayFlag=1; RayFlag2=1; TMOD=0x10;//设置T1 EA=1; ET1=1; TH1=0x3c; TL1=0xb0; TR1=1; while(1) { D_Scan(TimeData,0);//动态扫描 //按键控制 if(KeyCount==2) { KeyCount=0; NowKey=GetKey(); if(NowKey!=BeforKey) { switch (NowKey) { case 1: TimeSet(); break; case 2: AlarmSingal=0; break; default: break; } } BeforKey=NowKey; } else KeyCount++; } } 4.3显示子程序的设计 void D_Scan(uchar *ShowAddress,uchar FlagBit) { uchar ShowBit; uchar Show; for(ShowBit=0;ShowBit<5;ShowBit++) { if(FlagBit!=5) { switch(ShowBit) { case 0:Show=BCD_to_Text((*ShowAddress)%10);break; case 1:Show=BCD_to_Text((*ShowAddress)/10);break; case 2:Show=BCD_to_Text((*(ShowAddress+1))%10);break; case 3:Show=BCD_to_Text((*(ShowAddress+1))/10);break; case 4:Show=BCD_to_Text((*(ShowAddress+2))%10);break; } } P2=0xff; switch(FlagBit) { case 0:P0=Show;break; case 1://设分闪动 if(RayFlag2 && (ShowBit==0||ShowBit==1))P0=0x40; else P0=Show; break; case 2://设时闪动 if(RayFlag2 && (ShowBit==2||ShowBit==3))P0=0x40; else P0=Show; break; case 3://设上下午闪动 if(RayFlag2 && ShowBit==4)P0=0x40; else P0=Show; break; } P2=GetClockBit(ShowBit); Delay(1); } } 五、调试及性能分析 5.1调试步骤 进入调试状态后应该在关键的地方设置断点然后按步运行,同时观察参数的变化,通过变化来判断程序运行的过程即可找出程序中混乱的部分,进行改正,这需要对软件熟练的掌握和对语言程序的很好的理解,实验板搭建成功后,我们就进入了程序的设计和调试阶段,开始编写程序时很顺利,但是后来在调试过程中出现了很多的错误,比如定时器准确度的设置,子程序的调用问题,最困难的就是对没步程序执行顺序的分析,由于程序中一些语句的错误理解和执行顺序的判断失误,让我掉进了误区,耽误了很长时间,最后在同学的帮助下终于找到了错误的关键点,更正成功了。看来对程序的调试能力我还需要加强,程序的调试需要耐心,而且需要熟练掌握软件的跟部分功能。 5.2性能分析 自动打铃系统在学校很工厂和日常生活中应用广泛,原理主要是通过单片机的计数器进行计时,同时通过定时器中断扫描定时时间点来判断是否到了打铃时间,到了打铃,同时可以手动灭铃,主要功能即计时和打铃,相当于闹钟,通过计时器DS1302的使用使电路在断电后依然有后备电源进行计数,设计很人性化。还可以通过按键来设置时间,如果想深入设计,也可以通过键盘来设置闹钟时间,使系统更加方便。 六、心得体会 本系统被子广泛用企 事业单位 事业单位结构化面试题事业单位专业技术岗位财务人员各岗位职责公文事业单位考试事业单位管理基础知识 ,设计比较简单。经过一学期的学习,使我对单片机有了初步的认识,了解了一些软件编程的技巧。 经过这次的课程设计,使我学会了课堂上学不到的知识,颇有一番感受,对于单片机更加的了解了,对各种器件的使用方法更加熟悉,学会了电路的基本设计思路和原理,掌握单片机设计步骤,知道这门课程在工作中的重要性,因为需要大量的资料,所以我和我的合作者到图书馆查阅了大量的资料,也利用了互联网查找大量的资料,经过一番努力,第一周我们完成了电路图的设计,第二周我们领取了所需的元器件,开始了电路的装调,经过几天的努力,终于把电路装好了,但电路调试过程并不是那么的容易,但经过调试我们发现了电路的一些问题,但在老师和同学们的同共努力下都得到解决,最终看到了成果.我感谢老师,课程设计加深了学生对所学课程理论的理解,扩展了教学中的实验内容和要求,积累了实践体验和经验,让我们提前感受到毕业设计的大致过程,进而能顺利进入毕业设计,提高毕业设计质量和学生实际应用能力。 参考文献 〔1〕严仲兴,王熔熔:《单片机原理与应用》,中国计划出版社,2001 .7 〔2〕江力:《单片机原理与应用技术》,清华大学出版社,2006.5 〔3〕徐爱钧,彭秀华:《单片机高级语言C51windows环境编程与应用》,北京电子工业出版社,2001.7 〔4〕求是科技:《单片机典型模块设计实例导航》,北京人民邮电出版社,2004.5 〔5〕康华光:《电子技术基础:模拟部分》,北京高等教育出版社,1999.6 〔6〕江太辉:《MCS-51系列单片机原理与应用》.广州:华南理工大学出版社,2004.6 (7)刘海宽 单片机实验与实践教程 东南大学出版社 2009年1月出版 (8)杨易德 模拟电路 重庆大学出版社 2006年10月出版 (9)廖先芸 电子技术实践与训练 高等教育出版社 2005年6月出版 (10)郭勇 EDA技术基础 机械工业出版社 2009年1月出版 附录1 系统硬件电路图 附录2 程序清单 #include #define uint unsigned int #define uchar unsigned char uchar TimeData[]={0,0,0};//时钟数据 uchar sec;//秒 uchar i; uchar counter=0; //时钟变量 uchar RayFlag1=0;//秒闪标志1 sbit RayFlag=P3^3;//秒闪 sbit RayFlag2=P3^2;//秒闪标志2 sbit AlarmSingal=P3^7;//闹铃信号 uchar code BellData[]={ 0,0,0,0,0,0,0,0,0,1 };//上下午标志 uchar code BellDataH[]={ 6,7,8,8,9,9,10,10,11,10 };//时 uchar code BellDataL[]={ 0,30,20,30,20,40,30,40,30,30 };//分 uchar BCD_to_Text(uchar Data); uchar GetClockBit(uchar ShowBit); void Delay(uint count); void D_Scan(uchar *ShowAddress,uchar FlagBit); uchar GetKey(); void TimeSet(); //----------------------主程序----------------------------------------------- void main() { uchar NowKey; uchar BeforKey=0xff; uchar KeyCount=0; uchar i=0; AlarmSingal=0; RayFlag=1; RayFlag2=1; TMOD=0x10;//设置T1 EA=1; ET1=1; TH1=0x3c; TL1=0xb0; TR1=1; while(1) { D_Scan(TimeData,0);//动态扫描 //按键控制 if(KeyCount==2) { KeyCount=0; NowKey=GetKey(); if(NowKey!=BeforKey) { switch (NowKey) { case 1: TimeSet(); break; case 2: AlarmSingal=0; break; default: break; } } BeforKey=NowKey; } else KeyCount++; } } //---------------------DS1302------------------------------- #ifndef _DS1302_H_ #define _DS1302_H_ #define Time_12_Hour 0x00 //24时制控制 #define Time_Start 0x00 //开始走时 #define Time_Stop 0x80 //停止走时 #define DS1302_SECOND 0x80 //DS1302各寄存器操作命令定义 #define DS1302_MINUTE 0x82 #define DS1302_HOUR 0x84 #define DS1302_WEEK 0x8A #define DS1302_DAY 0x86 #define DS1302_MONTH 0x88 #define DS1302_YEAR 0x8C #define DS1302_WRITE 0x8E #define DS1302_POWER 0x90 #define BCD2DEC(X) (((X&0x70)>>4)*10 + (X&0x0F)) //用于将BCD码转成十进制的宏 #define DEC2BCD(X) ((X/10)<<4 | (X%10)) //用于将十进制转成BCD码的宏 sbit DS1302_CLK = P1^5; //实时时钟时钟线引脚 sbit DS1302_IO = P1^6; //实时时钟数据线引脚 sbit DS1302_RST = P1^4; //实时时钟复位线引脚 sbit ACC0 = ACC^0; sbit ACC7 = ACC^7; typedef struct __SYSTEMTIME__ //定义的时间类型结构体,全部数为十进制 { unsigned char Second; unsigned char Minute; unsigned char Hour; unsigned char Week; unsigned char Day; unsigned char Month; unsigned char Year; }SYSTEMTIME; //实时时钟写入一字节(内部函数) void DS1302InputByte(unsigned char d) { unsigned char i; ACC = d; for(i=8; i>0; i--) { DS1302_IO = ACC0; //相当于汇编中的 RRC DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC >> 1; } } //实时时钟读取一字节(内部函数) unsigned char DS1302OutputByte(void) { unsigned char i; for(i=8; i>0; i--) { ACC = ACC >>1; //相当于汇编中的 RRC ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; } return(ACC); } //写DS1302,ucAddr: DS1302地址, ucData: 要写的数据 void Write1302(unsigned char ucAddr, unsigned char ucDa) { DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); // 地址,命令 DS1302InputByte(ucDa); // 写1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; } //读取DS1302某地址的数据 unsigned char Read1302(unsigned char ucAddr) { unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr|0x01); // 地址,命令 ucData = DS1302OutputByte(); // 读1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData); } //读取时间函数 void DS1302_GetTime(SYSTEMTIME *Time) { unsigned char ReadValue; ReadValue = Read1302(DS1302_SECOND); Time->Second = BCD2DEC(ReadValue&0x7F); ReadValue = Read1302(DS1302_MINUTE); Time->Minute = BCD2DEC(ReadValue); ReadValue = Read1302(DS1302_HOUR); Time->Hour = BCD2DEC(ReadValue&0x7F); ReadValue = Read1302(DS1302_DAY); Time->Day = BCD2DEC(ReadValue); ReadValue = Read1302(DS1302_WEEK); Time->Week = BCD2DEC(ReadValue); ReadValue = BCD2DEC(DS1302_MONTH); Time->Month = BCD2DEC(ReadValue); ReadValue = Read1302(DS1302_YEAR); Time->Year = BCD2DEC(ReadValue); } //设置时间函数 void DS1302_SetTime(SYSTEMTIME *Time) { Write1302(DS1302_WRITE,0x00); //关闭写保护 Write1302(DS1302_YEAR,DEC2BCD(Time->Year)); Write1302(DS1302_MONTH,DEC2BCD(Time->Month)); Write1302(DS1302_WEEK,DEC2BCD(Time->Week)); Write1302(DS1302_DAY,DEC2BCD(Time->Day)); Write1302(DS1302_HOUR,DEC2BCD(Time->Hour)|Time_12_Hour); Write1302(DS1302_MINUTE,DEC2BCD(Time->Minute)); Write1302(DS1302_SECOND,DEC2BCD(Time->Second)|Time_Start); Write1302(DS1302_WRITE,0x80); //打开写保护 } //初始化DS1302 void DS1302_Initial(void) { Write1302(DS1302_WRITE,0x00); //关闭写保护 Write1302(DS1302_SECOND,Time_Stop);//停止计时 Write1302(DS1302_HOUR,Time_12_Hour);//24时制 Write1302(DS1302_POWER,0xA6); //单二极管,4K电阻充电 Write1302(DS1302_WRITE,0x80); //打开写保护 } #endif //---------------------T1中断,产生时钟------------------------------- void Timer1(void)interrupt 3 using 1 { TH1=0x3c; TL1=0xb0; if(counter%10==0) { RayFlag2=~RayFlag2; if(RayFlag1)RayFlag=0; else RayFlag=~RayFlag; } if(counter==20) { counter=0; if(sec==59) { sec=0; if(TimeData[0]==59) { TimeData[0]=0; if(TimeData[1]==11) { TimeData[1]=0; if(TimeData[2]==1) { TimeData[2]=0; } else TimeData[2]++;//上下午 } else TimeData[1]++;//时 } else TimeData[0]++;//分 } else sec++;//秒 for(i=0;i<10;i++) { if((BellData[i]==TimeData[2])&&(BellDataH[i]==TimeData[1]) && (BellDataL[i]==TimeData[0])) { if(i==0||i==9) { if(sec==0) { AlarmSingal=0; } if(sec==5) { AlarmSingal=1; } if(sec==7) { AlarmSingal=0; } if(sec==12) { AlarmSingal=1; } } else { AlarmSingal=0; if(sec==5) { AlarmSingal=1; } } break; } else AlarmSingal=1; } } else counter++; } //------------------BCD码转换成字形码的程序----------------------------- uchar BCD_to_Text(uchar Data) { switch(Data) { case 0:return 0xC0; case 1:return 0xF9; case 2:return 0xA4; case 3:return 0xB0; case 4:return 0x99; case 5:return 0x92; case 6:return 0x82; case 7:return 0xF8; case 8:return 0x80; case 9:return 0x90; } } //-----------------------------得到位地址的程序------------------------- uchar GetClockBit(uchar ShowBit) { switch(ShowBit) { case 0:return 0xfe; case 1:return 0xfd; case 2:return 0xfb; case 3:return 0xf7; case 4:return 0xef; } } //---------------------延时count个ms的程序------------------------- void Delay(uint count) { uint i,j; for(i=count;i>0;i--) for(j=100;j>0;j--); } //-----------------------动态扫描的程序------------------------------- void D_Scan(uchar *ShowAddress,uchar FlagBit) { uchar ShowBit; uchar Show; for(ShowBit=0;ShowBit<5;ShowBit++) { if(FlagBit!=5) { switch(ShowBit) { case 0:Show=BCD_to_Text((*ShowAddress)%10);break; case 1:Show=BCD_to_Text((*ShowAddress)/10);break; case 2:Show=BCD_to_Text((*(ShowAddress+1))%10);break; case 3:Show=BCD_to_Text((*(ShowAddress+1))/10);break; case 4:Show=BCD_to_Text((*(ShowAddress+2))%10);break; } } P2=0xff; switch(FlagBit) { case 0:P0=Show;break; case 1://设分闪动 if(RayFlag2 && (ShowBit==0||ShowBit==1))P0=0x40; else P0=Show; break; case 2://设时闪动 if(RayFlag2 && (ShowBit==2||ShowBit==3))P0=0x40; else P0=Show; break; case 3://设上下午闪动 if(RayFlag2 && ShowBit==4)P0=0x40; else P0=Show; break; } P2=GetClockBit(ShowBit); Delay(1); } } //----------------得到键盘值的程序---------------------------------- uchar GetKey() { uchar p; p=P1&0x0f; switch(p) { case 0x0f:return 0; case 0x0e:return 1; case 0x0d:return 2; case 0x0b:return 3; case 0x07:return 4; } } //-------------时间设置的程序-------------------------------------------- void TimeSet() { uchar S_Flag=1; uchar M_Flag=1; uchar H_Flag=1; uchar count1=0x40;//无操作时的时间控制 uchar count2=0xff;//无操作时的时间控制 uchar NowKey=0xff; uchar BeforKey=0xff; uchar KeyCount=0; uchar FlagBit=1; uchar LS_TimeData[3]; uint a=0; LS_TimeData[2]=TimeData[2]; LS_TimeData[1]=TimeData[1]; LS_TimeData[0]=TimeData[0]; while(1) { if(S_Flag)LS_TimeData[0]=TimeData[0]; if(M_Flag)LS_TimeData[1]=TimeData[1]; if(H_Flag)LS_TimeData[2]=TimeData[2]; D_Scan(LS_TimeData,FlagBit);//动态扫描显示 if(KeyCount==2) { KeyCount=0; NowKey=GetKey(); if(NowKey!=BeforKey) { count1=0x40; count2=0xff; switch(GetKey()) { case 1://确定 a++; if(a==2) { a=0; TimeData[2]=LS_TimeData[2]; TimeData[1]=LS_TimeData[1]; TimeData[0]=LS_TimeData[0]; goto L1; } else break; case 2://向左移动 if(FlagBit==3)FlagBit=1; else FlagBit++; break; case 3://增加 switch(FlagBit) { case 1://分增加 if(LS_TimeData[0]==59) LS_TimeData[0]=0; else LS_TimeData[0]++; S_Flag=0; break; case 2://时增加 if(LS_TimeData[1]==23) LS_TimeData[1]=0; else LS_TimeData[1]++; M_Flag=0; break; case 3://上下午增加 if(LS_TimeData[2]==1) LS_TimeData[2]=0; else LS_TimeData[2]++; H_Flag=0; break; } break; case 4://减小 switch(FlagBit) { case 1://秒减小 if(LS_TimeData[0]==0) LS_TimeData[0]=59; else LS_TimeData[0]--; S_Flag=0; break; case 2://分减小 if(LS_TimeData[1]==0) LS_TimeData[1]=23; else LS_TimeData[1]--; M_Flag=0; break; case 3://时减小 if(LS_TimeData[2]==0) LS_TimeData[2]=1; else LS_TimeData[2]--; H_Flag=0; break; } break; } } BeforKey=NowKey; count2--; if(count2==0) { count2=0x40; count1--; if(count1==0) goto L1; } } else KeyCount++; } L1:RayFlag1=0; }
本文档为【学校教务系统自动打铃系统设计_】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_448807
暂无简介~
格式:doc
大小:462KB
软件:Word
页数:26
分类:
上传时间:2011-10-22
浏览量:68