电脑打铃器设计_第1页
电脑打铃器设计_第2页
电脑打铃器设计_第3页
电脑打铃器设计_第4页
电脑打铃器设计_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、目录一设计要求1二系统框图1三硬件电路设计11.输出控制电路12.键盘显示部分1四任务设计1五任务优先级的设计1六任务的数据结构设计11.与操作系统有关的数据结构设计12.与操作系统无关的数据结构设计1七多个任务之间的互斥与协调11.行为同步12.资源互斥1八多个任务之间的信息传递11.全局变量12.消息邮箱1九程序设计11.人机界面设计12.主函数13.键盘任务14.显示任务15.输出控制任务16.RTC中断1十附录1附录1 键盘任务代码1附录2 显示任务1附录3 输出控制任务代码1附录4 RTC中断代码清单1电脑打铃器设计一 设计要求l 具有实时时钟功能,能显示时分秒,年月日星期(采用8位

2、数码管显示)l 具有 键盘 输入功能 l 可以设置若干个闹钟,以及闹钟的禁止与使能l 可设置每个闹钟发生时的输出动作(一共四路输出,可独立设置每路输出的时间和 电平状态二 系统框图图 1 系统框图如图1,LPC2000系列ARM具有RTC功能,RTC掉电后仍可使用电池继续运行,从而保证了系统掉电后时钟的准确性。ZLG7290是一款键盘和LED驱动芯片,最多支持64个按键和8个共阴极数码管。三 硬件电路设计电脑自动打铃器的硬件电路包括键盘显示部分和输出控制电路,键盘显示部分用于完成人机交互,输出控制电路用于控制电子打铃器的触发。1. 输出控制电路图 2 输出控制电路如图2,为输出控制电路,在应用

3、中可能需要继电器等用于对打铃器的控制2. 键盘显示部分键盘和数码管显示按照ZLG7290的相关数据手册设计,详细可以查看技术手册,基本构成为4*4矩阵键盘和两个4位数码管组成。四 任务设计按照嵌入式系统任务划分的原则来看,电脑自动打铃器具有键盘输入功能,用于设置时钟和闹钟,因此需要一个键盘任务;同时需要有显示功能,用来显示时钟和闹钟,因此需要一个显示任务;还需要一个输出控制任务,用于控制闹钟时间到达后的各路的输出;另外,具有实时时钟功能,需要一个RTC中断。ZLG7290是键盘任务和显示任务的共享资源,需要信号量保护。RTC实时时钟中断,负责实时时钟计时,1s产生一次中断,检测闹钟。输出控制任

4、务由RTC中断触发。显示任务通过刷新机制来显示信息,每隔100ms刷新一次。他们之间的通信采用相应的消息邮箱,信号量等来实现,具体将在后面讨论。五 任务优先级的设计在电脑自动打铃器的设计中,安排有键盘任务,显示任务,输出控制任务和RTC中断。在这些任务中,键盘任务和显示任务是人机交互接口任务,实时性要求很低,输出控制任务相对于实时性要求较高,综合考虑,我们选择优先级:输出控制任务优先级为6;键盘任务优先级为12;显示任务优先级为13。六 任务的数据结构设计对于一个任务,除了它的代码(任务函数)外,还有相关的信息。为保存这些信息,必须为任务设计对应的若干数据结构。任务需要配备的数据结构分为两类:

5、一类是与操作系统有关的数据结构;另外一类是与操作系统无关的数据结构。1. 与操作系统有关的数据结构设计在电脑自动打铃器应用中,我们设计了3个任务(键盘任务、显示任务和输出控制任务),与操作系统有关的数据结构定义如下:#define TASKKEY_ID12/定义键盘任务的ID#define TASKKEY_PRIOTASKKEY_ID/定义键盘任务的优先级#define TASKKEY_STACK_SIZE512/定义键盘任务堆栈的大小#define TASKDISP_ID13/定义显示任务的ID#define TASKDISP_PRIOTASKDISP_ID/定义显示任务的优先级#defin

6、e TASKDISP_STACK_SIZE512/定义显示任务堆栈的大小#define TASKCTRL_ID6/定义控制任务的ID#define TASKCTRL_PRIOTASKCTRL_ID/定义控制任务的优先级#define TASKCTRL_STACK_SIZE512/定义控制任务堆栈的大小OS_STK TaskKeyStkTASKKEY_STACK_SIZE; /定义键盘任务的堆栈OS_STK TaskDispStkTASKDISP_STACK_SIZE; /定义显示任务的堆栈OS_STK TaskCtrlStkTASKCTRL_STACK_SIZE; /定义控制任务的堆栈void

7、 TaskKey(void *pdata); /键盘任务声明void TaskDisp(void *pdata); /显示任务声明void TaskCtrl(void *pdata); /控制任务声明2. 与操作系统无关的数据结构设计电脑自动打铃器具有时钟和闹钟功能,那么我们首先就要构造这两个数据结构,定义如下:定义时钟和闹钟全局变量#define MAX_ALARM 4/ 最大闹钟个数TIMEGtimeCurrentTime;/ 时钟全局变量ALARMGalarmRingTimeMAX_ALARM;/ 闹钟全局变量时钟结构定义struct time unsigned charucHour;/

8、 时 unsigned charucMin;/ 分 unsigned charucSec;/ 秒 unsigned charucWeek;/ 星期 unsigned shortusYear;/ 年 unsigned charucMon;/ 月 unsigned charucDay;/ 日;typedef struct timeTIME;typedef TIME*PTIME;闹钟结构定义struct alarm unsigned charucHour;/ 时 unsigned charucMin;/ 分 unsigned charucSec;/ 秒 unsigned charucEnable;/

9、 闹钟使能控制 struct unsigned shortusLevel;/ 输出电平控制 unsigned shortusTime;/ 输出时间控制 c4;/ 4路输出控制;typedef struct alarmALARM;typedef ALARM*PALARM;七 多个任务之间的互斥与协调1. 行为同步为了说明问题,我们在这里将键盘任务拆分成为两个任务,一个是键盘扫描任务,另一个是键盘处理任务。当键盘扫描到键值的时候,键盘处理任务就应该及时的处理该键值,二者之间是一种同步接力的关系,用于行为同步的手段有计数器信号量,事件标志组,消息邮箱,消息队列,由于要求处理键值,同步的痛死需要伴随着

10、通信,可以采用消息邮箱。基本代码如下:void TaskKeyScan(void * pdata) /键盘扫描任务uint32 keytmp;/初始化代码if(扫描到按键)OSMboxPost(Mbox,(void *) keytmp); /向消息邮箱发送按键消息/其他相关代码void TaskKeyDeal(void *pdata) /按键处理函数uint32 keytmp;/初始化代码keytmp=(uint32)OSMboxPend(Mbox,0,&err); /从消息邮箱中获取键值信息处理按键/其他相关代码2. 资源互斥在电脑自动打铃器的设计中,ZLG7290是通过I2C总线与LPC2

11、000连接的,I2C总线是键盘任务和显示任务的共享资源,必须遵循资源互斥的原则进行访问,二者之间使用信号量进行资源互斥。操作ZLG7290采用到了I2C软件包,该软件包是uc/os-II系列中间件之一,所以提供的接口函数在多任务环境下是安全的。在本次设计中需要为ZLG7290封装两个函数(1) 获取键值,i2cRead()这个函数的功能是指定总线接口,指定器件从机地址,指定子地址,读取指定字节数量的数据到接受数据缓冲区。代码如下:uint16 ZLG7290GetKey(void)uint temp2;i2cRead(0, /I2C0x70, /机器从机地址temp, /接受数据缓冲区1, /

12、器件子地址1, /器件子地址类型为单字节型2); /读取数据长度while(i2cGetFlag(0)=I2C_BUSY);/等待总线操作完毕return(uint16)(temp0+(temp1*256);(2) 显示数据,i2cWrite()函数的功能是指定总线接口,指定从机地址,指定子地址,写入指定字节数量的写入数据缓冲区中的数据。代码如下:uint16 ZLG7290ShowChar(void)uint buf2;buf0=(uint8)(0x60|(index & 0x0f);buf1=data;i2cWrite(0, /I2C0x70, /机器从机地址buf, /接受数据缓冲区0x

13、07, /器件子地址1, /器件子地址类型为单字节型2); /读取数据长度while(i2cGetFlag(0)=I2C_BUSY);/等待总线操作完毕八 多个任务之间的信息传递1. 全局变量在任务的数据结构设计中,我们设计了时钟和闹钟两个数据结构,并定义了时钟和闹钟两个全局变量。键盘任务,显示任务和RTC中断通过它们传递信息。RTC中断每隔1s中断一次,更新当前时钟信息,并检测闹钟。如果闹钟时间到,就向输出控制任务发送控制信息。显示任务每隔100ms刷新一次,更具当前显示模式进行时钟或者闹钟的显示。键盘任务负责时钟和闹钟的设置。这两个全局变量就是这三个任务的共享资源,必须保证访问互斥。全局变

14、量虽然可以实现数据的传输,但是不能够实现行为的同步:新的数据产生之后并不能够自定的通知相关使用者,使用者也不知道当前数据是何时产生的,因此,全局变量只能用于没有行为同步要求的任务之间,即每次产生的新数据不要求立即使用,甚至可以不被使用。其中RTC中断代码如下:void RTC_Exception(void)/相关代码GtimeCurrentTime.ucHour=(uint8) HOUR;GtimeCurrentTime.ucMin=(uint8) MIN;GtimeCurrentTime.ucSec=(uint) SEC;/相关代码显示任务:void TaskDisp(void * pdat

15、a)while(1)OSTimeDly(20); /延时100msOS_ENTER_CRITICAL(); /关中断dispbuf0=GtimeCurrentTime.ucHour;/更新显示缓冲区dispbuf1=GtimeCurrentTime.ucMin;dispbuf2=GtimeCurrentTime.ucSec;OS_EXIT_CRITICAL();/开中断/显示时间2. 消息邮箱 RTC中断检测闹钟,闹钟到就向输出控制任务发送控制信息,在本设计实例中使用消息邮箱。具体实现是在RTC代码中加入发送消息邮箱函数,在输出控制任务中加入从消息邮箱中接受信息函数。九 程序设计1. 人机界面

16、设计对于一个具有人机界面的应用系统来说,首先应该考虑的是人机界面如何设计。8位数码管显示力度有限,只能通过按键分屏显示,显示界面定义如下:(1) 时钟模式:12时 59分 59秒 星期一(2) 日历模式:2007年 12月 12日(3) 闹钟模式:A表示闹钟,0表示第一个闹钟,闹钟时间08:30:00(4) 闹钟模式:闹钟使能控制(E使能,d禁能),从左至右,第一个是总开关,接着是星期60(分别对应星期日星期一)的开关。(5) 闹钟模式:C表示通道,0表示第一个通道(每个闹钟有4个通道),H/L表示输出高低电平控制,接着是输出时间控制,最大为9999秒。根据上述分析,电脑自动打铃器具有时钟和闹

17、钟模式,时钟和闹钟模式都分别有不同的显示内容,闹钟模式还有若干不同的闹钟,为了修改时钟和闹钟的设置,还需要一个光标闪烁来提示用户进行修改,为此定义了如下全局变量:unsigned int GuiMode= 0;/ 模式(时钟和闹钟模式)unsigned int GuiCursor = 8;/ 光标(闪烁位置提示)unsigned int GuiIndex= 0;/ 索引(不同的闹钟)unsigned int GuiItem= 0;/ 条目(时钟或闹钟的不同内容)按键的处理比较灵活,可自行设计,这里定义如下表1:表格 1 按键设计按键上的标识按键功能定义按键上的标示按键功能定义“S1”S9”键数

18、字1-9键“S13”上移动键“S10”数字”0”键“S14”下移动键“S11”左移动键“S15”状态切换键“S12”右移动键“S16”确定键2. 主函数在主函数中,进行了操作系统的初始化,创建了一个键盘任务,最后,启动多任务操作系统,其中键盘任务TaskKey()的优先级为12,负责初始化目标板和创建一些其他任务。其主要代码如下:int main(void)OSInit(); /初始化操作系统OSTaskCreateExt(TaskKey, (void *)0, & TaskKeyStkTASKKEY_STACK_SIZE-1, TASKKEY_PRIO, TASKKEY_ID, &TaskK

19、eyStk0, TASKKEY_STACK_SIZE, (void *)0, OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR /创建键盘任务);OSStart(); /启动多任务操作系统return (0);3. 键盘任务键盘任务首先进行目标板的初始化,主要完成系统时钟中断的设置;然后初始化I2C0总线接口并设置中断;然后创建消息邮箱GmboxRingCtrl,用于闹钟触发输出控制任务;接着初始化RTC并设置中断;最后创建了显示任务和输出控制任务,就进入了周期性循环,通过读取ZLG7290获取键值,进行按键处理,其基本的流程图如图3所示:图 3 键盘任务流程

20、图键盘任务代码由于相对较长,见附录1。4. 显示任务显示任务是个周期性的任务,负责显示界面的刷新,显示任务的具流程图见下图*:图 4 显示任务流程图显示任务周期性的输出全局变量的信息,100ms是个经验值,可以根据适当情况调节,显示任务主要根据当前状态,光标位置,索引,条目进行相应的显示。其具体任务代码见附录2.5. 输出控制任务输出控制任务接受RTC中断发送的控制信息,控制4路输出的电平和时间,其主要流程图如图*所示:图 5 输出控制任务流程图输出控制任务首先初始化输出控制端口,默认为高电平,然后进入任务循环,从消息邮箱中等待一条信息。由于消息邮箱没有消息。输出控制任务一直处于挂起状态,直到

21、RTC中断检测到发送了闹钟事件,然后根据消息的内容设置各路的输出电平,接着就进入了输出时间控制循环。在此循环中不断查询消息邮箱是否有新的消息,如果有怎退出循环,从而处理新的消息,否则知道所有4路输出时间到为止。其具体代码见附录3.6. RTC中断RTC中断更新实时时钟,遍历所有闹钟,向输出控制任务发送闹钟控制信息。流程图*如下所示:图 6 RTC中断流程图RTC中断具体代码见附录4.十 附录附录1 键盘任务代码void TaskKey(void * pdata)unsigned char ucKey;unsigned char ucKey0;unsigned char ucFlag=0; /修

22、改状态标志pdata=pdata; /防止编译器报错TargetInit(); /目标板初始化OSTimeDly(OS_TICKS_PER_SEC/10);PINSEL0=(PINSEL0 &0xffffff0f)|0x50; /设置I2C引脚功能i2cInit(0,Speed=30000,NULL); /设置I2CSetVICIRQFunction(9,2,(int)i2c0IRQ);GmboxRingCtrl=OSMboxCreate(void *)0); /创建消息邮箱rtcInit(); /RTC初始化SetVICIRQFunction(13,3,(int)RTC_Exception)

23、;OSTaskCreateExt(TaskDisp,(void *)0,&TaskDispStkTASKDISP_STACK_SIZE-1,TASKDISP_PRIO,TASKDISP_ID,&TaskDispStk0,TASKDISP_STACK_SIZE,(void *) 0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR); /创建显示任务OSTaskCreateExt(TaskCtrl,(void *) 0,& TaskCtrlStkTASKCTRL_STACK_SIZE-1,TASKCTRL_PRIO,TASKCTRL_ID,&TaskCtrlStk0

24、,TASKCTRL_STACK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);while(1)OSTimeDly(4);ucKey=(uint8)ZLG7290GetKey(); /获取按键if(ucKey=0)|(ucKey16)continue;/按键处理代码省略while(1) /等待按键释放OSTimeDly(4);ucKey=(uint8)ZLG7290GetKey();if(ucKey=0)|(ucKey16)break;void rtcInit(void) /RTC初始化if(ALYEAR !=2007)/初始

25、化一次CCR=0x00; /禁止时间计数器PREINT=Fpclk/32768-1;/设置基准时钟分频器PREFRAC=Fpclk%32768; AMR=0xFF; /禁止报警中断CIIR=0x01; /使能秒增量中断ILR=0x03;/清除RTC中断标志ALYEAR=2007; /初始化标志YEAR=2007; /初始化时间寄存器MONTH=11;DOM=6;DOW=0;HOUR=12;MIN=0;SEC=0;CCR=0x11; /启动RTC ,32.768独立晶振附录2 显示任务void TaskDisp(void *pdata)uint8 i;pdata=pdata; /防止编译器警告w

26、hile(1)OSTimeDly(20);OS_ENTER_CRTICAL();ToDispBug();OS_EXIT_CRTICAL();switch(GuiMode)case 0:for(i=0;i8;i+) /时钟模式ZLG7290SHowCHar(i,(uint8)(i=BuiCursor)?0x40:0x00)|GucTimeDispBufGuiItemi);OSTimeDly(20);break;case 1: /闹钟模式for(i=0;i8;i+)ZLG7290SHowCHar(i,(uint8)(i=GuiCursor)?0x40:0x00)|GucAlarmDispBufGu

27、iIndexGuiItemi);OSTimeDly(1);break;default:break;附录3 输出控制任务代码void TaskCtrl(void *pdata)INT8U ucErr;unsigned char usLevel4;unsigned char usTime4;unsigned short *pusMsg;OS_MBOX_DATA mboxdataMsg;int i;pdata=pdata;IO0DIR |=(LED0 |LED1 |LED2 |LED3);IO0SET=(LED0 | LED1 | LED2 | LED3);while(1)pusMsg=(unsigned short *)OSMboxPend(GmboxRingCtrl,0,&ucErr);for(i=0;i4;i+)usLeveli=pusMsg2*i;usTimei=pusMsg2*i+1;if(usLevel0=0)IO0CLR=LED0;if(usLevel1=0)IO0CLR=LED1;if(usLevel2=0)IO0CLR=LED2;if(usLevel3=0)IO0CLR=LED3;

温馨提示

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

评论

0/150

提交评论