资源描述
目 录
第一部分 设计任务与调研…………………………………………………………
第二部分 设计说明………………………………………………………………………
第三部分 设计成果……………………………………………………
第四部分 结束语…………………………………………………………………………
第五部分 致谢…………………………………………………………………………
第六部分 参考文献…………………………………………………………………
第一部分 设计任务与调研
1主要任务
本设计以单片机为控制核心采用模块化设计共分以下几个功能模块单片机控制系统、实时时钟模块、环境温度检测模块、电压检测模块、人机接口模块、语音报警模块等。
2. 设计的思路及方法
按照系统的设计功能要求,本时钟,铃声,温度系统的设计必须采用单片机软件系统实现,用单片机的自动控制能力配合按键控制,来控制时钟,温度的调整你,闹钟及显示。获得时钟温度数据信息,单片机对其进行一系列的处理,最后通过液晶显示出来。
分析工艺与控制流程。分析控制要求与方式,分析系统设计的原则和方法,确定输入输出设备和I/O点数及选机型,硬件系统设计,软件程序设计,绘制控制系统接线图,电器元件的选择,程序调试。
3. 相关的资料
4. 调研的目的和总结
是为了验证LCD语音时钟的功能及作品的展示 ,通过这些做的报告跟实验,充分的掌握了LCD语音时钟的性能特点,同是也发现了我在实验中的一些操作不足的地方,我会尽量避免这些缺点的
第二部分 设计说明
1. 理论分析
根据设计要求,语音电子钟要具备的功能:
1.可以语音播报日期和时间。
2.可以在SPLC501液晶模组上面显示时间、日期、农历、星期、闹钟。
3.整点报时功能。
4.具备闹钟功能。
5.闹钟的铃声可以选择。
6.具备秒表功能。
2. 设计方案
通过对设计要求和设计原理的仔细分析,本次设计采用模块结构实现。语音电子钟主要由系统初始化模块、输入按键信息模块、语音输入与A/D(模/数)转换模块、压缩编码模块和D/A(数/模)转换模块、SPLC501液晶模组组成。实现单独播报年、月、日和时、分,实现定时功能,并且能够对它们分别进行调整。设计复位键对设定值进行清零操作。
组成电路板各模块应具有如下功能:
1.系统初始化模块: 输入一些变量与子小模块,进行赋初值等处理,输出变量和模块的初始状态。
2.输入按键信息模块:输入键值,等待系统中断并进行相应的中断处理,输出为调用相应的键处理程序。
3.语音输入与A/D(模/数)转换模块:输入语音信号,进行A/D(模/数)转换,输出语音的数字信号。
4.压缩编码模块:输入语音的数字信号,经过语音压缩函数的处理,输出语音的压缩编码。
5.D/A(数/模)转换模块:输入语音的数字信号,进行D/A(数/模)转换输出语音的模拟信号。
6.SPLC501液晶显示器:显示当前的时间、日期、农历、星期、闹钟。
3.硬件设计
语音电子钟的系统结构如图2-1,61板作为整个系统的控制中心,负责控制键盘扫描;年、月、日、星期以及时间的计算; SPLC501A 液晶显示的驱动;并根据按键值播报当前的日期或者时间。SPLC501A 液晶显示模组主要用来显示当前的时间,日期,以及显示功能选择菜单和时间日期调整菜单。
图2-1 语音电子钟的系统结构图
硬件功能模块连接:用61板控制语音电子钟系统,使用IOA 口的高八位、IOB 的4、5、6 共11 个I/O 口连接SPLC501A液晶模组,另外使用了61板的语音输出模块;以及61 板上的三个按键。
硬件连接如图2-2 所示:
图2-2 语音电子钟的电路连接图
语音电子钟的连接示意图见图2-2,IOA 的高八位接到液晶模组的八个数据端,同时也连接了液晶模组的电源,即直接用一根10pin 的排线连接61 板“+”、IOA8-15、“-”与SPLC501A 液晶显示模组的“+”、DB0-7、“-”,主要用来向液晶模组传送命令和数据;IOB6 接EP,IOB5 接R/W,IOB4接AO,用来控制液晶的显示和工作方式。
4. 按键的功能描述
语音电子钟的各个按键功能如图2-3所示,按KEY1键:进入功能选择界面。按KEY2 键:播报当前的时间。按KEY3键:播报当前的日期。KEY2、KEY3 键同时按下:控制闹钟的开与关。
在时间显示界面上按KEY1键会进入功能选择菜单,功能菜单界面上有4个选项。分别是时间日期调整、闹钟设置、秒表功能、返回。功能选择菜单界面里KEY1为确定键,KEY2为下翻键,KEY3为上翻键。可以随意选择所要实现的操作。
时间日期调整界面里KEY1为确定键,KEY2为加一键,KEY3为减一键,SPLC501液晶显示器上闪烁的部分表示当前正在调整的选项,当设置完成后,按KEY1会自动退出设置界面。
闹钟设置界面里KEY1为确定键,KEY2为下翻键,KEY3为上翻键。闹钟设置界面里有闹钟时间设置和闹钟铃声选择两个选项。闹钟时间设置界面KEY1为确定键,KEY2为加一键,KEY3为减一键,SPLC501液晶显示器上闪烁的部分表示当前正在调整的选项,当设置完成后,按KEY1会自动退出设置界面。.闹钟铃声设置界面里KEY1为确定键,KEY2为选择键,KEY3为播放当前选择的铃声键。当闹钟响时,按下三个键中的任何一个都可以关闭闹钟。
秒表功能界面里KEY1为退出键,KEY2为开始/暂停键,KEY3为清零键,只
有当秒表停止运行时KEY3 才有效。
返回功能里KEY1为确认键,按下后,系统会回到显示界面。
图2-3 语音电子钟的按键功能结构图
硬件设计按照SPCE061A、程序下载区、音频输出、语音输入、数模转换、电源分模块设计。利用Protel 99来绘制各个部分的电路原理图。
4. 软件设计
主程序流程如图3-1所示,在主程序中初始化了整个工程中用到的变量,初始化了液晶显示模块。开2Hz 中断实现计时。在主程序中调用了键盘扫描程序,对IOA 口的低三位进行扫描,如果有键按下,就把相应的键值存入到一个变量中,通过主程序来判断是哪个键按下,并执行相应的功能:若是KEY1键按下,则会进入功能选择菜单,此时KEY1 就会为确定键,KEY2 为下翻键,KEY3 为上翻键;若是KEY2 键按下,播报时间;若是KEY3 键按下,播报当前的日期;KEY2、KEY3 键同时按下控制闹钟的开/关。
图3-1 主程序流程图
时间日期程序模块的流程图如图3-2所示,该模块用到了2Hz 的时基中断,用来实现计时,同时实现了日期的更新,其中农历是使用查表的方法来实现的。
图3-2 时间日期模块流程图
l 5.作品特点:一、种类多,型号全
很多单片机厂家逐年扩大适应各种需要,有针对性地推出一系列型号产品,使系统开发工程师有很大的选择余地。大部分产品有较好的兼容性,保证了已开发产品能顺利移植,较容易地使产品进行升级换代。
l 二、提高性能,扩大容量,性能价格比高
集成度已经达到300万个晶体管以上,总线速度达到数十微妙到几百纳秒,指令执行周期已经达到几微妙到数十纳秒,以往片外XRAM现已在物理上存入片内,ROM容量已经扩充达32K,64K,128K以致更大的空间。价格从几百到几元不等。
l 三、增加控制功能,向真正意义上的“单片”机发展
把原本是外围接口芯片的功能集成到一块芯片内,在一片芯片中构造了一个完整的功能强大的微处理应用系统。
l 四、低功耗
现在新型单片机的功耗越来越小,供电电压从5V降低到了3.2V,甚至1V,工作电流从mA降到µA级,gz2频率从十几兆可编程到几十千赫兹。特别是很多单片机都设置了多种工作方式,这些工作方式包括等待、暂停、睡眠、空闲、节电等。
第三部分 设计成果
1.作品展示
LCD语音时钟
2. 技术指标:
1。分辨率:LCD的分辨率与CRT显示器不同,一般不能任意调整,它是制造商所设置和规定的。分辨率是指屏幕上每行有多少像素点、每列有多少像素点,一般用矩阵行列式来表示,其中每个像素点都能被计算机单独访问。
2。刷新率:LCD刷新频率是指显示帧频,亦即每个像素为该频率所刷新的时间,与屏幕扫描速度及避免屏幕闪烁的能力相关。也就是说刷新频率过低,可能出现屏幕图像闪烁或抖动。
3。响应时间:响应时间愈小愈好,它反应了液晶显示器各象素点对输入信号反应的速度,即pixel由暗转亮或由亮转暗的速度。响应时间越小则使用者在看运动画面时不会出现尾影拖拽的感觉。一般会将反应速率分为两个部份:Rising 和Falling;而表示时以两者之和为准。
4。可视角度 一般而言,LCD的可视角度都是左右对称的,但上下可就不一定了。而且,常常是上下角度小于左右角度。当然了,可视角是愈大愈好。然而,大家必须要了解的是可视角的定义。当我们说可视角是左右80度时,表示站在始于屏幕法线80度的位置时仍可清晰看见屏幕图像,但每个人的视力不同;因此我们以对比度为准。在最大可视角时所量到的对比度愈大愈好。
5。对比度
对比度是指图像最亮的白色区域与次暗的黑色区域之间的比值。在CRT 显示器中,对比度对其信能的影响并不引起人们的重视。而在液晶显示器中,对比度却是衡量其好坏的主要参数之一。
3.程序代码:
// 工程名称: clock.spj
// 功能描述: 具备播报日期、时间、整点报时、秒表、闹钟、万年历、农历和电子钟等功能。
// IDE环境: SUNPLUS u'nSPTM IDE 2.0.0
// 涉及的库: CMacro1016.lib
// sacmv26e.lib
// 组成文件: main.c/system./Key.c/speak.c/IRQ.asm/miaobiao/asm
// 硬件连接:
// IOA8-15接液晶显示模块DB0-DB7
// IOB4接液晶显示模块AO
// IOB5接液晶显示模块的R/W
// IOB6接液晶显示模块的EP
//======================================================================
// 文件名称: main.c
// 功能描述: 系统初始化,显示时间日期界面
// 按KEY1,进入时间调整和功能选择菜单。
// 按KEY2, 拨报当前的时间。
// 按KEY3, 拨报当前的日期。
// KEY2、KEY3同时按下控制闹钟的开关
//======================================================================
#include "SPCE061A.h"
#include "SPLC501User.h"
#include "model.h"
#define ring1 17 //播放第一个铃声的序号
#define ring2 18 //播放第二个铃声的序号
//======================================================================
//对主函数调用的函数声明
//======================================================================
extern void display();
extern void PlayRespond(unsigned int Result);
extern void speaktime();
extern void keyscan();
extern void nextdisplay();
extern void setday();
extern void set_ring();
extern void setsecond();
extern void speaktime();
extern void speakday();
extern void keyinitial();
//=======================================================================
//定义文件中用到的变量以及常数数组
//=======================================================================
unsigned int keyflag1=0; //键按下标志1,控制进入功能选择菜单
unsigned int keyflag2=0; //键按下标志2,
unsigned int keyflag3=0; //键按下标志3,控制进入时间日期调整界面
unsigned int keyflag4=0; //键按下标志4,控制进入闹钟时间设置界面
unsigned int keyflag5=0; //键按下标志5,控制进入秒表设置界面
unsigned int keyflag6=0; //键按下标志6,控制进入闹钟设置界面
unsigned int keyflag7=0; //键按下标志7,控制进入闹钟铃声选择界面
unsigned int ringflag=0; //播放铃声标志位1播放第一首2播放第二首
unsigned int keyvalue=0; //存放按下的键值
unsigned int runflag=0; //当年闰月标志位
unsigned int num=0; //2HZ计数单元
unsigned int hour=0; //存放当前的小时
unsigned int min=0; //存放当前的分钟
unsigned int sec=0; //存放当前的秒
unsigned int year=2006; //存放当前的年
unsigned int gmonth=8; //存放当前的公历的月
unsigned int gday=1; //存放当前的公历的日
unsigned int xqvalue=0; //存放当前的星期
unsigned int nmonth=7; //存放农历的月
unsigned int nday=8; //存放农历的日
unsigned int runxq[]={3,6,0,3,5,1,3,6,2,4,0,2}; //润年星期偏差表
unsigned int pingxq[]={4,0,0,3,5,1,3,6,2,4,0,2}; //平年星期偏差表
unsigned int mouse[]={1,17,32,48}; //箭头坐标数组
unsigned int nhour=12; //存放闹钟的小时
unsigned int nmin=0; //存放闹钟的分钟
unsigned int mbmin=0; //存放秒表的分
unsigned int mbsec=0; //存放秒表的秒
unsigned int mmsec=0; //存放秒表的毫秒
unsigned int mbnum=0; //1KHZ中断标志位
unsigned int onoff=0; //闹钟开关标志
unsigned int int2hz; //设置一个2HZ中断标志
unsigned int ringonoff; //闹钟响时关闭标志
char number[]={'0','1','2','3','4','5','6','7','8','9'}; //设置待显示的数字。
unsigned int clockset[]={11,31,51}; //设置闹钟铃声时的光标
unsigned int counter=0; //设置显示SUNPLUS计数器
unsigned int mapcounter1=0;
unsigned int mapcounter2=0;
const int glunarmonthday[]= //存放2001-2100的阴历月天数表b15-b14表征1-12月的天数特征
{ //为1则当月为30天,为0则为29天。低四位为当年闰月的月份
0xd954,0xd4a0,0xda50,0x7552,0x56a0,0xabb7,0x25d0,0x92d0,0xcab5,0xa950,
0xb4a0,0xbaa4,0xad50,0x55d9,0x4ba0,0xa5b0,0x5176,0x52bf,0xa930,0x7954,
0x6aa0,0xad50,0x5b52,0x4b60,0xa6e6,0xa4e0,0xd260,0xea65,0xd530,0x5aa0,
0x76a3,0x96d0,0x4afb,0x4ad0,0xa4d0,0xd0b6,0xd25f,0xd520,0xdd45,0xb5a0,
0x56d0,0x55b2,0x49b0,0xa577,0xa4b0,0xaa50,0xb255,0x6d2f,0xada0,0x4b63,
0x937f,0x49f8,0x4970,0x64b0,0x68a6,0xea5f,0x6b20,0xa6c4,0xaaef,0x92e0,
0xd2e3,0xc960,0xd557,0xd4a0,0xda50,0x5dd5,0x56a0,0xa6d0,0x55d4,0x52d0,
0xa9b8,0xa950,0xb4a0,0xb6a6,0xad50,0x55a0,0xaba4,0xa5b0,0x52b0,0xb273,
0x6930,0x7337,0x6aa0,0xad50,0x4b55,0x4b6f,0xa570,0x54e4,0xd260,0xe968,
0xd520,0xdaa0,0x6aa6,0x56df,0x4ae0,0xa9d4,0xa4d0,0xd150,0xf252,0xd520
};
const unsigned int* BMP_Cartoon[] = //动画帧数据链表(sunplus标志)
{ (unsigned int*)encoding_00,(unsigned int*)encoding_01,(unsigned int*)encoding_02,
(unsigned int*)encoding_03,(unsigned int*)encoding_04,(unsigned int*)encoding_05,
(unsigned int*)encoding_06,(unsigned int*)encoding_07,(unsigned int*)encoding_08,
(unsigned int*)encoding_sunplus,
(unsigned int*)encoding_08,(unsigned int*)encoding_07,(unsigned int*)encoding_06,
(unsigned int*)encoding_05,(unsigned int*)encoding_04,(unsigned int*)encoding_03,
(unsigned int*)encoding_02,(unsigned int*)encoding_01,(unsigned int*)encoding_00,
(unsigned int*)encoding_sunplus,
(unsigned int*)encoding_00,(unsigned int*)encoding_01,(unsigned int*)encoding_02,
(unsigned int*)encoding_03,(unsigned int*)encoding_04,(unsigned int*)encoding_05,
(unsigned int*)encoding_06,(unsigned int*)encoding_07,(unsigned int*)encoding_08,
(unsigned int*)encoding_sunplus,
(unsigned int*)encoding_08,(unsigned int*)encoding_07,(unsigned int*)encoding_06,
(unsigned int*)encoding_05,(unsigned int*)encoding_04,(unsigned int*)encoding_03,
(unsigned int*)encoding_02,(unsigned int*)encoding_01,(unsigned int*)encoding_00,
(unsigned int*)encoding_sunplus
};
//=======================================================================// 语法格式: int main(void)
// 实现功能: 键盘控制语音播报日期时间及功能选择
// 参数: 无
// 返回值: 无
//=======================================================================
int main(void)
{ keyinitial(); //键盘初始化
LCD501_Init(0); //液晶显示初始化
LCD501_Circle(64,32,15,1);
LCD501_ClrScreen(0);
LCD501_FontSet(0);
*P_INT_Ctrl_New = *P_INT_Ctrl_New | 0x0004; //置2HZ中断标志
__asm("INT IRQ"); //开放2HZ中断
while(1)
{ int i=0; //定义一个循环变量,用来对数组寻址.
display(); //用显示日期时间界面
while(hour==nhour && min==nmin && onoff==0) //当闹钟开时,判断闹钟时间是否到了
{ keyscan(); //当闹钟响时如果有任何键按下,则关闭闹钟。
if(keyvalue!=0)
onoff=1;
else if(ringflag==0)
PlayRespond(ring1); //播放乐曲1
else
PlayRespond(ring2); } //播放乐曲2 if(min==0 && sec==0) //正点报时功能
{ speaktime();}
keyscan(); //键盘扫描
*P_Watchdog_Clear=0x0001;
if(keyvalue==0x0001) //如果KEY1键按下
{ keyflag1=1; //置位键按下标志
LCD501_ClrScreen(0); //调用清屏函数;
while(keyflag1==1)
{ nextdisplay(); //显示调整界面
LCD501_Bitmap(15,mouse[i],(unsigned int*)encoding_mouse);
//显示鼠标位置
keyscan();
*P_Watchdog_Clear=0x0001;
switch(keyvalue)
{ case 0x0001: //如果是KEY1按下则进入相应的调整
{ switch(i) //判断此时的鼠标指向
{ case 0:
{ setday() }
break; //指向的时间日期调整
case 1:
{ set_ring(); } //设置闹钟的铃声和时间
break;
case 2:
{ setsecond(); } //设置秒表
break;
case 3: //指向的返回,则执行返回程序
{ LCD501_ClrScreen(0);keyflag1=0; }
break; } }
break;
case 0x0002: // 如果是KEY2则箭头下翻//
{ LCD501_Bitmap(15,mouse[i],(unsignedint*)encoding_empty);
if(i==3)
i=0;
else
i=++i; //修改箭头的坐标
LCD501_Bitmap(15,mouse[i],(unsigned int*)encoding_mouse); }
break;
case 0x0004: //如果是KEY3则箭头上翻
{ LCD501_Bitmap(15,mouse[i],(unsigned int*)encoding_empty);
if(i==0)
i=3;
else
i=--i; //修改箭头的坐标
LCD501_Bitmap(15,mouse[i],(unsigned int*)encoding_mouse); }
break; } } }
else if(keyvalue==0x0002) //如果KEY2按下报时间
{ speaktime(); } //调用时间拨报函数
else if(keyvalue==0x0004) // 如果KEY3按下报日期
{ speakday() ; } //调用日期拨报函数
else if(keyvalue==0x0006) //如果KEKY2\KEY3同时按下则切换闹钟
{ switch(onoff) //的开关
{ case 0:
onoff=1;
break; //切换闹钟的开关
case 1:
onoff=0;
break; } }
else
*P_Watchdog_Clear=0x0001; } } //清看门狗
//=======================================================================
//main.c end
第四部分 结束语
想到课题以后讨论整个过程如何实施以及选择哪个课题进行设计。在初步方案确定好后开始研究所需的器材在列出初稿后买好器材便进入了设计阶段。 经过长期的设计反复地讨论各个环节反复调试终于完成LCD语音时钟设计。虽然达到设计要求并完成了一定发挥部分但单片机的资源并没完全得到应用。这是不用单片机学习板自己动手制作出来的作品。
在本次设计是液晶单片机语音键盘控制的综合应用其间遇到许多困难。我真真正正的意识到在写程序时逻辑思维要清晰要有好的写程序的层次感模块化清晰要有耐心。这样出错啦才能及时知道问题出在哪。在以后的学习中要理论联系实际把我们所学的理论知识用到实际当中学习单机片机更是如此程序只有在经常的写与读的过程中才能提高这就是我在这次设计中的最大收获。
第五部分 致谢
在设计结束之际我要衷心感谢所有关心、支持和帮助过我的老师和朋友。
首先要向我的导师老师致以深切的谢意。感谢他在课题工作中给予我的指导、鼓励和关心。老师在我做设计的过程中给了我很大的指导不断激励我完成设计研究使我受益非浅。
在这里也要感谢老师他在单片机方面给了我很大的帮助。他渊博的知识丰富的经验令我钦佩。同时也要感谢我的室友们,感谢他为我提供了一个做毕业设计的良好环境。
其次要感谢我的朋友们和实验室的同学感谢他们提出的很好建议和真诚的帮助使我得以顺利完成设计研究。
向所有关心和支持我的师长、亲友、同学致以最诚挚的谢意。
第六部分 参考文献
【1】李健忠. 单片机原理及应用.西安电子科技大学出版社. 2002.2
【2】张鹏.王雪梅. 单片机原理及应用实用教程.海洋出版社. 2008.2
【3】于海生. 微型计算机控制技术.清华大学出版社. 2008.2
【4】彭树生. MCS-51单片机原理与应用实例电子工业出版社. 2008.1
【5】王琼. 单片机原理及应用实验教程.合肥工业大学出版社. 2004.10
【6】欧阳文. ATMEL89系列单片机的原理与开发实践.
中国电力出版社. 2007.6
【7】韩志军.沈晋源.王振波. 单片机应用系统设计----入门向导与设计实例.
机械工业出版社. 2006.6
【8】张洪润.张亚凡. 单片机原理及应用.清华大学出版社. 2005.10
展开阅读全文