本文是一篇单片机论文范文,单片机类有关函授毕业论文,关于文初稿,本科毕业文相关在职研究生毕业论文范文。适合单片机及电子实习及计算机方面的的大学硕士和本科毕业论文以及单片机相关开题报告范文和职称论文写作参考文献资料下载。
SichuanTopVocationalCollegeofInformationTechnology
毕业设计论文
题目:
语音报时系统
学生姓名:苏刘春
学生学号:2005010415
专业方向:计算机应用技术
指导教师:蔡英
指导单位:四川托普信息技术职业学院
2007年8月1日至2007年10月25日
摘 要
带有语音功能的电子产品和电子设备近年来广泛地出现在我们的生活中.语音时钟是现在电子时钟多功能化发展的一个方向,将语音引入到时钟中实现时间的语音播报.
本文是设计一个基于凌阳61A单片机的语音报时系统,利用凌阳61A板这样一种本身就带有语音识别和播放功能的单片机来进行时间的播报.把凌阳61A板单片机的语音播报功能加入到设计中,通过对它的运用来了解一个带语音的系统应如何设计.在语音报时系统的设计中,要处理好以下几个关键:DA转换,语音识别,人机接口,程序设计.DA和语音识别技术关系到时间的正确播报.人机接口是播报时间和调整时间的关键.因此,利用凌阳61A单片机在语音识别和处理方面的优点,结合实践,设计出有特色的语音报时系统.
单片机是实现各种控制策略和算法的载体.因其功耗低,超小型,低成本,功能完整,非常适用于便携式仪表和就地式显示控制仪表,在国内越来越受到用户的重视和广泛的应用.随着单片机集成化程度的不断提高,现代单片机已经具备了数字信号处理功能,使语音信号处理用单片机实现成为可能.台湾凌阳科技公司(Sunplus)推出的一款SPCE061A就是这样的产品.SPCE061A是以μ'nSPTM16位微控制器及信号处理器芯片为内核的16位单片机,采用模块式集成结构,片内集成了2KBRAM,32KBFlash,ADC,DAC,并行I/O等,本文介绍如何用SPCE061A单片机实现系统语音播报.
关键字:单片机,凌阳SPCE061A,语音识别,语音报时,并行I/O口
目录
引言2
第一章需求分析3
1.1凌阳单片机的实用性3
1.2凌阳单片机的应用领域3
章二章概要设计4
2.1任务需求4
2.2设计需求4
第三章详细设计5
3.1总述5
3.1.1SPCE061A性能5
3.1.2SPCE061A芯片引脚6
3.2硬件设计6
3.2.1绘制原理图6
3.2.2PCB板的设计与生成9
3.3软件设计10
3.3.1主程序流程图10
3.3.2按键模块11
第四章测试和调试14
4.1调试步骤14
4.2硬件测试14
4.3软件调试16
第五章总结17
本文是一篇单片机论文范文,单片机类有关函授毕业论文,关于文初稿,本科毕业文相关在职研究生毕业论文范文。适合单片机及电子实习及计算机方面的的大学硕士和本科毕业论文以及单片机相关开题报告范文和职称论文写作参考文献资料下载。
6;数据回送还是数据下载进行选择.下图为74HC244芯片引脚排列图.74HC244芯片可以控制SDA信号的高低电平,这样可以使用ResWriter工具发出符合烧写芯片的时序信号,完成对芯片的擦除,写入与校验功能.
音频输入部分
此模块主要通过MICROPHONE把我们所要求语音信息进行的输入.再由SPCE061A对采集的语音信号进行处理,将提取的说话人特征参数与存储在外扩FLASH内的特征参数模板进行匹配.
3,语音输出模块
音频输出电路图.可以直接听喇叭输出的声音.图中的SPY0030也是凌阳公司的产品.SPY0030A是凌阳公司开发的专门用于语音信号放大的芯片.和LM386相比,SPY0030还具有下述优势,比如LM386工作电压需在4V以上,SPY0030仅需2.4V即可工作(两颗电池即可工作),LM386输出功率100mW以下,SPY0030约700mW.
4,电源模块
61板采用3节5号电池进行供电,由J10接入,如附录1所示.其中的前后两组电容用来去耦滤波,使其供给芯片更加平滑.为了获得标准3.3V电压,在板子上加入SPY0029A三端稳压器.
两个二极管,是为防止误将电源接反造成不必要损失而设置的,在操作过程中千万不要将电源接反,因为反向电压超过一定的值,二极管将会被损坏,达不到保护的目的.后面的零电阻及其电源,地成分不同的几路是为了减少电磁干扰设置的.
最后生成ERC报表和网络表,原理图如附录所示.
3.2.2PCB板的设计与生成
印制电路板的设计主要是针对PCB而言的,要实现电路板的版面设计和完成布线等工作.在系统操作方面,本论文只设计网络表的装入.
绘制好了电路原理图,产生了正确的ERC报告和网络表后,接下来的工作是根据网络表进行电路板的布线.为保持PCB板的大小与SPCE061A实物大小一致,规定框架大小为106*72mm,如附录1所示.
重点解决的问题:
1,元件封装
纯粹的元件封装仅仅是空间的概念,因此不同的零件可以共用封装,同时,同种元件也可以用不同的封装.在实际的设计中,元件的封装最好自制.由于用的是凌阳61板,它的封装大多是做好了的,只需要绘制几个元件封装和下载其它元件封装运用就行了.但是,在大多数设计元件的封装是需要对照实际元件,用游标卡尺准确量出元件的相关数据,再做出相应的元件封装,下面以SPY0029为例进行说明.
SPY0029的1号,2号和3号焊盘之间的距离为60mil,0号焊盘与2号焊盘之间的距离为120mil.
SPY0029是凌阳公司设计的电压调整IC,采用CMOS工艺.SPY0029具有静态电流低,驱动能力强,线性调整出色等特点.
2,焊盘大小
虽然在本设计中不牵连焊盘方面的设计,但提醒一下:无论是在调用封装还是在自制封装的过程中,需要特别注意的是元件焊盘大小的设计.焊盘小了,在钻孔的时候很容易出错,即使没有在钻孔时出错,但它对焊接技术的要求是比较高的,焊盘太大,在焊接的时候,高温的锡液就很容易通过通孔流向在面板另一面上的元件引脚,这样就很容易使元件受高温影响而坏掉.
3,工作层
KeepOut禁止布线层,MultiLayer显示复合层,本设计采用的是双面板的形式.
3.3软件设计
IDE开发环境,具有编辑\编译\链接\调试以及仿真等功能.其友好的交互界面\下拉菜单\快捷键和快速访问命令列表等,使用户的编辑\调试工作更加方便和高效.此外,IDE的软件仿真功能可以在不连接仿真板的情况下模拟硬件的各项功能来调试程序.
3.3.1主程序流程图
在编程中,运用了很多程序模块,程序模块中的文件大致可以分为两大类:一类是程序,一类是程序接口.所谓接口一般是指针对高一级的模块而言,通过接口,高一级的程序模块可以调用本级程序模块中的子程序或函数,或者使用本级模块中定义的全局变量.这样可以大大增加软件的可维护性,而程序既可以用C语言编写,也可以用凌汇编语言编写.
主程序流程图如下图所示:
3.3.2按键模块
由图可以看出按键最后要实现的功能,程序控制KEY键主要是实现复位,按K1键实现年,月,日的播报,K1键播报"*年*月*日",当K1按下持续3秒以上时K1键进入调时状态,此时用K3键对年,月,日进行递增调整,要完成此过程必须先要判断是否K1键按下才能对年,月,日进行调整.如果要回到默认值状态可按KEY键进行复位操作.
调整年,月,日按键流程图如下图所示:
由图可以看出按键最后要实现的功能,程序控制KEY键主要是实现复位,按K2键实现时分的播报,K2键播报"报时声,现在时刻,上午/下午/凌晨*时*分"当K2键按下持续3秒以上时K3键可对时,分进行递增调整,所以此过程必须要判断是否是K2键按下才能对时,分进行调整.如果要回到默认值可按复位键KEY进行复位操作.
调整时,分的流程图如下图所示:
完整程序如附录3所示.将所有的程序进行编译无错误提示后,下载程序到61板中,即设计部分结束.
第四章测试和调试
上图是完成元件焊接后的实物图.设计的最后即是按照以下步骤进行硬件和软件的调试.
4.1硬件测试
首先应该检查电路板是否有虚焊,虚焊很有可能造成最后结果的不正确或是在整个过程中出现接触不良的现象.所以在焊接时一定要注意焊接的技巧和方法.
测试工作可贯穿整个焊接过程,即在焊接好一个元件后就用数字万用表测量它的导通情况.若万用表有蜂鸣声发出,则说明已导通,否则可能出现了短路现象.当所有元件都已焊接完毕并且都处于良好的导通状态下,就将进入后期测试过程,即测试一些重要引脚上的电压是否是正常的工作电压,主要有:
1,电源电压5V或接近5V
2,VDDH,VDD引脚上的电压分别是3.5v和3v.
电源部分:
在板子的左上角.以下就采用万用表分别测试以下12个点的电压,注意数字万用表的使用方式(黑色的表笔接电源"-"端,红色的表笔接电源"+"端),些时请勿将芯片插入座中,以免电源部分有问题告成芯片烧坏.
调试1:
目的:测试61电路源和地是否有短路,
条件:断开电源并拔掉电池盒,将J5的2,3脚用跳线帽短接,
步骤:用万用表测量J10的两脚的电阻是否为零,
现象一:电阻为零,表示焊接过程中可能有短路,应进行电源部分的排查.
现象二:电阻大于300欧,表示正常.
调试2:
目的:测试61板电源部分器件是否工作正常,
条件:电池盒接到J10处,将电池盒开关拔到ON处,
现象:D1亮了表示正常.D1没点亮,电源器件有问题,按说明书排查.
最后电源部分一些器件引脚的电压进行测试,如果电压正常,则进行下一步的测试,不正常则分析它的原因.
调试3:
目的:测试61板上各器件电源供电是否正常,
条件:用跳线冒把S5的1,2脚短接,
步骤:测试U1的第7脚电压——3.3v左右,
测试U4的第20脚电压——3.3v左右,
测试J4的第1脚电压——3.3v左右,
测试U2的第7,8脚电压——4.5v左右,
测试J6,J7,J8,J9的+端电压——4.5v左右,
现象:电压正常进入下一步测试.不正常在供电的某个传输方向上出现了问题,对照原理一步一步的进行排查.
键盘部分:
目的:测试键盘输入是否正确
条件:U1U2U4芯片座中不安放元件:给61板通电,万用表选择电压档,利用万用表的负极接板子的地,万用表笔的正端分别检测接IOA0,IOA1,IOA2,
步骤:用万用表笔的正端放在IOA0上时,按下KEY1键,读取万用表上的电压值并记录,之后用同样的方法分别检测KEY2,KEY3电压值,
现象:电压为零,不正常,应更新按键,重新测试按键部分,
电压不为零,正常,进入下一部测试.
4.2调试步骤
第一步:硬件连接.
1,电源连接,可接3接电池,也可以直接连接5V的稳压源,
2,在线调试(PROBE)的连接,一端接PC机并口,一端接61板的5针接口J4,跳线要连接S5的1与2.如果使用EZ-PROBE,将一端接PC机的并口,一端接61板的5针接口J11,跳线要连接S5的2与3,
3,喇叭连接,直接接61板的J3.
第二步:打开IDE,在安装路径下(example/61-Exa)找到SpeechClock项目文件(speechclock.spj)并打开,
第三步:下载程序:检查PROBE是否连接好,程序放在主菜单build-StartDebug下,如果使用EZ-PROBE,操作同上,只是注意IDE下选择EZ-PROBE模式.
4.3软件调试
在程序编写完成后,就进入程序的调试过程.在IDE环境下,单击Debug菜单项,选择Download,将程序文件编译生成可执行文件.若调试出错,应修改程序,再进行调试,直到程序调试通过为止.
下载软件测试程序:
1,模拟部分的测试:主要有晶振部分,I/O部分和音频输出部分的测试,当测试时会有语音输出I/O测试成功.
2,数字部分的测试:断开电源,数字万用表选择鸣叫功能,查看74HC244电路是否连接正确.
3,D/A和A/D部分测试:用排线分别将IOA口的低8位和IOB口的低沉位相连,IOA口的高8位和IOB口的高8位相连,然后按下RESET复位键S4.短接J2的左边两脚短接,听到"I/O测试成功".
4,输出部分测试:看喇叭是否有响声.
5,在进行程序下载时要注意当下载完程序后要关掉电源,因为61板所能够支持的热量是有限的当板子过热时就会影响下载程序的结果.如果发生播报的错误是因为板子使用过长所造成的就应该过一段时间再使用,不然很有可能会所芯片损坏.
按以上步骤执行后就可以将已经修改好的程序下载到芯片上,按设计要求通过对程序的不断修改来实现电路板的功能.程序实现了以后,通过按键就可以控制语音报时系统.按K1键就可以播报年月日,K2键播报时间,通过K3键对系统的时间或年月日进行调整(注意:调整时间或年月日时,要连续按K2或K1键3秒钟).
例如:按K1它播报"2007年11月13日".按K2播报"现在时刻上午11点15分".如需调整时间则持续按K2键不少于3秒,接着按K3键先对小时进行调整,然后调整分钟.同理K1键的调整操作.
第五章总结
在这几个月期间我们主要进行了61板电子实习.本设计利用凌阳SPCE061A单片机,凌阳单片机是凌阳公司专为学生和电子爱好者所设计的专用单片机.这次毕业设计中首先在熟悉protel99se的情况下对电路原理图的绘制,再由各种报表与网络表来实现PCB板的设计.从而对protel99se的各种功能都有了进一步的了解与认识.并由蔡老师为我们讲诉61板的基本功能,从凌阳单片机介绍及内部器件到SPCE061A的各种I/O接口以及如何进行编程分别为我们介绍了汇编语言与C语言,让我们在编程当中有了足够的资料来编写语音报时系统.在完成了电路图和PCB板
本文是一篇单片机论文范文,单片机类有关函授毕业论文,关于文初稿,本科毕业文相关在职研究生毕业论文范文。适合单片机及电子实习及计算机方面的的大学硕士和本科毕业论文以及单片机相关开题报告范文和职称论文写作参考文献资料下载。
30340;设计以及理论知识,我们又对61板进行了焊接.当然在这次焊中让我了解了很多焊接的基础知识以及焊接原理,比如焊接要注意的问题是尽量避免虚焊.在完成了61板的焊接之后我们也要对它进行测试.实现了语音的播报功能.通过对单片机的学习,明白了凌阳单片机的系统各模块工作原理.突出了理论与实际相结合,基础实验与综合技能训练相结合的模式.参与本次设计,我也有不少收获:
第一,系统而比较全面地检查了我所学的专业知识,补充了我未学的专业知识,对一个产品的开发的步骤有一定的认识."查漏补缺"的同时进一步巩固了专业知识,锻炼了自己.
第二,训练了我的动手能力.焊接元件,制作电路板等实际操作让我真正地理解了"学以致用"的含义.
第三,在学习怎样开发SPCE061A板的同时也使我们对相应的软件环境有了更进一步的认识和了解.比如:Protel99SE电路板的设计环境,IDE单片机的开发环境等.
第四,使我真正意识到团队合作的重要性.一个产品的诞生,离不开设计参与者的文化素质,更离不开他们的团队精神.所有的参与者都是优秀的,但谁都不是最优秀的.
第五,发掘自我潜能,重视能力,注重培养自己的兴趣与爱好.学习分析和解决问题,不要因为困难而害怕困难,只有坚持才能够取得最后的成功.
本文是一篇单片机论文范文,单片机类有关函授毕业论文,关于文初稿,本科毕业文相关在职研究生毕业论文范文。适合单片机及电子实习及计算机方面的的大学硕士和本科毕业论文以及单片机相关开题报告范文和职称论文写作参考文献资料下载。
case2://日
SpeechAdjustTemp等于ReadRealMonthDay(),
PlaySpeakDay(SpeechAdjustTemp&,0x00ff),
break,
case3://时
SpeechAdjustTemp等于ReadRealHourMin(),
PlaySpeakHour(SpeechAdjustTemp>,>,8),
break,
case4://分
SpeechAdjustTemp等于ReadRealHourMin(),
PlaySpeakMinute(SpeechAdjustTemp&,0x00ff),
break,
case5:break,
default:break,
}
}
//***************语音报时子函数****************************//
//函数:PlayAdjustTime(AdjustTemp)
//描述:调用子函数:
//PlaySpeakYear():报年
//PlaySpeakMonth():报月
//PlaySpeakDay():报日
//PlaySpeakHour():报时
//PlaySpeakMinute():报分
//参数:年,月,日,时,分,数据均为16进制
//返回:无
//*********************************************************//
//input:年-----16进制
//*********************************************************//
PlaySpeakYear(intYearTemp)//*************年
{
PlayRespond((YearTemp/1000)+C_T00),
PlayRespond((YearTemp%1000)/100+C_T00),
PlayRespond((YearTemp%100)/10+C_T00),
PlayRespond((YearTemp%10)+C_T00),
PlayRespond(C_YEAR),
}
//input:月------16进制
//*********************************************************//
PlaySpeakMonth(intMonthTemp)//*************月
{
if(MonthTemp<,10)PlayRespond(MonthTemp+C_T00),
elseif(MonthTemp等于等于10)PlayRespond(C_T10),
elseif(MonthTemp等于等于11)PlayRespond(C_T11),
elseif(MonthTemp等于等于12)PlayRespond(C_T12),
PlayRespond(C_MONTH),
}
//input:日------16进制
//*********************************************************//
PlaySpeakDay(intDayTemp)//*************日
{if((DayTemp/10)>,1)PlayRespond(DayTemp/10+C_T00),//十位>,1报
if((DayTemp/10)>,0)PlayRespond(C_T10),//报十,十位为1不报1
if((DayTemp%10)!等于0)PlayRespond(DayTemp%10+C_T00),
PlayRespond(C_DAY),
}
//input:时------16进制
//*********************************************************//
PlaySpeakHour(intDayTemp)//*************时
{
if(DayTemp>,等于1&,&,DayTemp<,等于7)
{PlayRespond(C_LINGCHEN),//1—7凌晨
if(DayTemp等于等于2)PlayRespond(C_S02),//两
elsePlayRespond(DayTemp+C_T00),
}
elseif(DayTemp>,等于8&,&,DayTemp<,等于12)
{PlayRespond(C_NOON),//8--12上午
switch(DayTemp)
{case10:PlayRespond(C_T10),break,//十点
case11:PlayRespond(C_T11),break,//十一点
case12:PlayRespond(C_T12),break,//十二点
default:PlayRespond(DayTemp+C_T00),break,
}
}
elseif(DayTemp>,等于13&,&,DayTemp<,等于19)
{PlayRespond(C_AFTERNOON),//13--19下午1--7
if(DayTemp等于等于14)PlayRespond(C_S02),//两
elsePlayRespond(DayTemp-12+C_T00),
}
elseif(DayTemp>,等于20&,&,DayTemp<,等于24)
{PlayRespond(C_NIGHT),//20--24晚上8--12
switch(DayTemp)
{case22:PlayRespond(C_T10),break,//十点
case23:PlayRespond(C_T11),break,//十一点
case24:PlayRespond(C_T12),break,//十二点
default:PlayRespond(DayTemp-12+C_T00),break,
}
}
PlayRespond(C_DIAN),//点
}
//input:分------16进制
//*********************************************************//
PlaySpeakMinute(intMinTemp)//*************分
{
if(MinTemp等于等于0)PlayRespond(C_ZHENG),//正点
else
{if((MinTemp/10)>,1)PlayRespond(MinTemp/10+C_T00),//分的十位
if((MinTemp/10)>,0)PlayRespond(C_T10),//分的十位大于1报,为1不报1
if((MinTemp%10)!等于0)PlayRespond(MinTemp%10+C_T00),//分的个位不为0则报
PlayRespond(C_MIN),//分
}
}
//input:秒------16进制
//*********************************************************//
PlaySpeakSecond(intSecondTemp)//*************秒
{if(SecondTemp等于等于0)PlayRespond(SecondTemp+C_T00),//0秒
if((SecondTemp/10)>,1)PlayRespond(SecondTemp/10+C_T00),//秒的十位大于1报,为1只报十
if((SecondTemp/10)>,0)PlayRespond(C_T10),
if((SecondTemp%10)!等于0)PlayRespond(SecondTemp%10+C_T00),
PlayRespond(C_SECOND),
}
//********************报时*********************************//
//input:1-----报年,月,日
//0----
本文是一篇单片机论文范文,单片机类有关函授毕业论文,关于文初稿,本科毕业文相关在职研究生毕业论文范文。适合单片机及电子实习及计算机方面的的大学硕士和本科毕业论文以及单片机相关开题报告范文和职称论文写作参考文献资料下载。
45;报时,分,秒//*********************************************************//
voidSpeakTime(TimeType)
{
if(TimeType等于等于0x01)
{
PlayAdjustTime(CON_YEAR),//年
PlayAdjustTime(CON_MONTH),//月
PlayAdjustTime(CON_DAY),//日
}
elseif(TimeType等于等于0x00)
{
PlayRespond(C_BELL),//报时声
PlayRespond(C_NOW),//现在时刻
PlayAdjustTime(CON_HOUR),//时
PlayAdjustTime(CON_MINUTE),//分
}
}
//*********************************************************//
//函数:main()
//描述:主函数
//*********************************************************//
intmain()
{
System_Initial(),
while(1)
{
Key_Scan_ServiceLoop(),//键盘扫描
//**********************TRIG/TIME**************************************************//
if(Key等于等于1&,&,KeyStatus等于等于0)//keystate校时状态还是报时状态,1-----校时
{bou等于1,
KeyCount等于1,//按键计数单元
Key等于0,
}
if(bou等于等于1&,&,Key等于等于0x8001&,&,KeyStatus等于等于0)
{
KeyCount++,
Key等于0,
}
if(bou等于等于1&,&,KeyPressFlag等于等于0&,&,KeyCount>,0)
{
if(KeyCount<,20)
{//报时
YearOrTime等于YearOrTime^0x01,//报年月日或时分:报时1----year0----time
SpeakTime(0x01),
//YearOrTime等于1,
KeyCount等于0,
}
elseif(KeyCount>,等于20)//进入调整时间状态
{
KeyCount等于0,
KeyStatus等于1,
KeyAdjust等于0,
TimeCount等于0,
Start256HzRTC(),
PlayAdjustTime(KeyAdjust),
}
}
//*********************************************************************************//
if(bou等于等于1&,&,KeyStatus等于等于1)//keystate校时状态还是报时状态,1-----校时
{
switch(Key)
{
case1:
KeyAdjust++,
if(KeyAdjust等于等于3)//KeyAdjust:0-YY1-MM2-DD3-hh4-mm5-ss6-exit
{
KeyStatus等于0,KeyAdjust等于0,
PlayAdjustTime(CON_YEAR),//年
PlayAdjustTime(CON_MONTH),//月
PlayAdjustTime(CON_DAY),//日
Stop256HzRTC(),
}
else
PlayAdjustTime(KeyAdjust),
Key等于0,
TimeCount等于0,
TimeChangeKey等于0,
break,
case4:
Adjust_Time_Up(KeyAdjust),
TimeChangeCount等于0,//调校时间状态下,有键按下,计时器清0
TimeChangeKey等于1,//调校时间状态下,有加减键按下标志
TimeCount等于0,//两分钟计时单元
Key等于0,
break,
default:
break,
}
if(bou等于等于1&,&,TimeChangeKey等于等于1&,&,TimeChangeCount>,40)
{
TimeChangeKey等于0,
PlayAdjustTime(KeyAdjust),
}
if(TimeCount>,120)
{
KeyStatus等于0,
KeyAdjust等于0,
}
}
if(Key等于等于2&,&,KeyStatus等于等于0){
bou等于0,
KeyCount等于1,
Key等于0,
}
if(bou等于等于0&,&,Key等于等于0x8002&,&,KeyStatus等于等于0){
KeyCount++,
Key等于0,
}
if(bou等于等于0&,&,KeyPressFlag等于等于0&,&,KeyCount>,0){
if(KeyCount<,20){
YearOrTime等于YearOrTime^0x00,//报年月日或时分:报时1----year0----time
SpeakTime(0x00),
KeyCount等于0,
}
elseif(KeyCount>,等于20)//进入调整时间状态
{
KeyCount等于0,
KeyStatus等于1,
KeyAdjust等于3,
TimeCount等于0,
Start256HzRTC(),
PlayAdjustTime(KeyAdjust),
}
}
if(bou等于等于0&,&,KeyStatus等于等于1)//keystate校时状态还是报时状态,1-----校时
{
switch(Key)
{
case2:
KeyAdjust++,
if(KeyAdjust等于等于5)//KeyAdjust:0-YY1-MM2-DD3-hh4-mm5-ss6-exit
{
KeyStatus等于0,KeyAdjust等于3,
PlayAdjustTime(CON_HOUR),//时
PlayAdjustTime(CON_MINUTE),
Stop256HzRTC(),
}
else
PlayAdjustTime(KeyAdjust),
Key等于0,
TimeCount等于0,
TimeChangeKey等于0,
break,
case4:
Adjust_Time_Up(KeyAdjust),
TimeChangeCount等于0,//调校时间状态下,有键按下,计时器清0
TimeChangeKey等于1,//调校时间状态下,有加减键按下标志
TimeCount等于0,//两分钟计时单元
Key等于0,
break,
default:
break,
}
if(bou等于等于0&,&,TimeChangeKey等于等于1&,&,TimeChangeCount>,40)
{
TimeChangeKey等于0,
PlayAdjustTime(KeyAdjust),
}
if(TimeCount>,120)
{
KeyStatus等于0,
KeyAdjust等于0,
}
}//**************************************************************//
Calendar_Counter(),//调整万年历
if(SecondAddOne等于等于0xFFFF)//分加1时,与作息时间比较
{
SecondAddOne等于0,
HourMinTemp等于ReadRealHourMin(),
for(i等于0,i<,16,i++)//作息时间
if(HourMinTemp等于等于gTimeVSShem[i])
{
for(j等于0,j<,15,j++)
{
LightOn(),//LED闪烁15次
Delay3ms(),
LightOff(),
Delay3ms(),
}
break,
}
}
if(SleepFlag等于等于0x01&,&,KeyStatus等于等于0)
SP_GoSleep(),//进入睡眠模式
}
}
//*****************************主程序结束******************************************//
N
Y
Y
N
开始
系统初始化
KEY1键按下
KEY2键按下
调整万年历
进入睡眠状态
键唤醒
2Hz中断唤醒
按键处理
结束
KEY3
KEY3
KEY1
KEY3
KEY1
大于2秒
小于3秒
KEY1键按下
几秒
调整当前年
调整当前月
加一年
加一月
调整当前日
KEY1
播报当前年月日
加一日
返回主程序
KEY1/KEY3
KEY1/KEY3
KEY1/KEY3
KEY3
KEY2
KEY3
KEY2
大于2秒
小于3秒
KEY2键按下
几秒
调整当前时
调整当前分
加一小时
加一分
播报当前小时和分钟
返回主程序
KEY2/KEY3
KEY2/KEY3