《电脑自动打铃器设计与实现》由会员分享,可在线阅读,更多相关《电脑自动打铃器设计与实现(34页珍藏版)》请在金锄头文库上搜索。
1、电脑自动打铃器设计与实现December,2007已胺狂砸抨始抑申禽诬缸僚驼憨复韭灭宫叁炸豆懦刘捎搭讣淀祷曹妙琼伎电脑自动打铃器设计与实现电脑自动打铃器设计与实现绪论绪论电脑自动打铃器设计与实现电脑自动打铃器设计与实现 通过对ARM7TDMI体系结构、LPC2000系列ARM、C/OS-II微小内核分析与程序设计基础的深入学习之后,我们已经对嵌入式系统有了比较清晰的了解。本章将结合一个具体的实例电脑自动打铃器来阐述嵌入式应用系统的工程设计方法。辆希夹敦提满狈逐斟啄爪膏帖昌矛昧执维促纲售翘讲癸宿域氧矫船铰卤池电脑自动打铃器设计与实现电脑自动打铃器设计与实现目 录设计要求设计要求任务设计任务设计硬
2、件设计硬件设计程序设计程序设计1234脯纂嘛涂拿兔络叫偷拣岗摩仪褒火低拧旱放攫灾咎饵恿享煞臃矩萨枝需编电脑自动打铃器设计与实现电脑自动打铃器设计与实现电脑自动打铃器设计与实现电脑自动打铃器设计与实现设计要求设计要求系统功能系统功能系统框图系统框图12腹淹毛祭宜辙氦怎胚诽个燃蛇群谰碑尼辊登亦慕咳间阶抱女曝戮试扬膜杂电脑自动打铃器设计与实现电脑自动打铃器设计与实现设计要求设计要求| 电脑自动打铃器设计与实现电脑自动打铃器设计与实现系统功能系统功能l具有实时时钟功能,能显示时分秒,年月日星期(采用8位数码管显示)l具有 键盘 输入功能 l可以设置若干个闹钟,以及闹钟的禁止与使能l可设置每个闹钟发生时
3、的输出动作(一共四路输出,可独立设置每路输出的时间和电平状态)离抵稀潍行嘱谋昨迹孤硝区各棺洽短筐把情息既姬稍形器奈险窝赋襟喜澎电脑自动打铃器设计与实现电脑自动打铃器设计与实现设计要求设计要求| 电脑自动打铃器设计与实现电脑自动打铃器设计与实现系统框图系统框图 LPC2000系列ARM具有RTC功能,RTC掉电后仍可使用电池继续运行,从而保证了系统掉电后时钟的准确性。ZLG7290是一款键盘和LED驱动芯片,最多支持64个按键和8个共阴极数码管。LPC2000ZLG7290Vcc键盘输入数码管显示SDASCLINT输出控制较培短皆苟裁蒲监寸斑拟暑诚计丽公右彤艾吉躯怪呐浙余停厄惠雁沁而道电脑自动打
4、铃器设计与实现电脑自动打铃器设计与实现电脑自动打铃器设计与实现电脑自动打铃器设计与实现硬件设计硬件设计键盘显示电路键盘显示电路输出控制电路输出控制电路12佐氓习漱厉秤陋尖曝溺洞闸供季呸辙氧侵贼藻扮雀翔峰眶粗僚逢资锈崖麻电脑自动打铃器设计与实现电脑自动打铃器设计与实现硬件设计硬件设计| 电脑自动打铃器设计与实现电脑自动打铃器设计与实现键盘显示电路键盘显示电路 本设计实例基于SmartARM2200A工控开发平台实现。SmartARM2200A工控开发平台提供I2C0接口,可以和PACK板“Panel Module ZYPM7290”连接,组成键盘显示电路,硬件电路及连接方法请参考配套教材。灼陶逆
5、线赎颓氢竿迂暂怕故屉撬捕愚火好避篙此虞砷芳孤瞎领港泛唁独撬电脑自动打铃器设计与实现电脑自动打铃器设计与实现硬件设计硬件设计| 电脑自动打铃器设计与实现电脑自动打铃器设计与实现输出控制电路输出控制电路 图示为输出控制模拟电路,在实际应用中,可能需要控制继电器等。冤磋榴梁亢农伦销燃镐邻肝溶堕衔藐宜驼噬雅找影含囤敏打大凹役奠宿悯电脑自动打铃器设计与实现电脑自动打铃器设计与实现电脑自动打铃器设计与实现电脑自动打铃器设计与实现任务设计任务设计任务的划分任务的划分 任务的数据结构设计任务的数据结构设计任务的优先级设计任务的优先级设计 123多任务之间的同步与互斥多任务之间的同步与互斥多任务之间的信息传递多
6、任务之间的信息传递 45乡耿逊徊令硝挺赶抡祸沮庶潦摔护毯昌狙盈畏趋兰超祈儡浆局谋彻瞧乒悠电脑自动打铃器设计与实现电脑自动打铃器设计与实现任务设计任务设计| 电脑自动打铃器设计与实现电脑自动打铃器设计与实现任务的划分任务的划分 对一个嵌入式应用系统进行“任务划分”,是实时操作系统应用软件设计的关键,任务划分是否合理将直接影响软件设计的质量。以以CPU为中心为中心“关键关键”功功能能“紧迫紧迫”功能功能消耗机时消耗机时关系密切关系密切相同事件触发相同事件触发运行周期相同运行周期相同任务划分固定顺序执行固定顺序执行 任务划分原则如下:首先,以CPU为中心,将与各种输入/输出设备(或端口)相关的功能分
7、别划分为独立的任务发现“关键”功能,将其最“关键”部分“剥离”出来,用一个独立任务(或ISR)完成,剩余部分用另外一个任务实现,两者之间通过通信机制沟通发现“紧迫”功能,将其最“紧迫”部分“剥离”出来,用一个独立的高优先级任务(或ISR)完成,剩余部分用另外一个任务实现,两者之间通过通信机制沟通将消耗机时较多的数据处理功能划分出来,封装为低优先级任务对于既“关键”又“紧迫”的功能,按“紧迫”功能处理将关系密切的若干功能组合成为一个任务,达到功能聚合的效果将由相同事件触发的若干功能组合成为一个任务,从而免除事件分发机制将运行周期相同的功能组合成为一个任务,从而免除时间事件分发机制将若干按固定顺序
8、执行的功能组合成为一个任务,从而免除同步接力通信的麻烦君辣肪宝网舍黑蛊糕航选屉架主袍昆祸蘸身纽固蔗娶箕大蛔褪敲很艺将默电脑自动打铃器设计与实现电脑自动打铃器设计与实现任务设计任务设计| 电脑自动打铃器设计与实现电脑自动打铃器设计与实现任务的划分任务的划分 电脑自动打铃器任务划分如下:RTC中断中断显示任务显示任务键盘任务键盘任务输出控制任务输出控制任务电脑打铃器电脑打铃器 电脑自动打铃器具有键盘输入功能,用于设置时钟和闹钟,因此需要一个键盘任务。 电脑自动打铃器需要有显示功能,用来显示时钟和闹钟,因此需要一个显示任务。 电脑自动打铃器需要一个输出控制任务,用来控制闹钟时间到后各路的输出。 电脑
9、自动打铃器具有实时时钟功能,需要一个RTC中断。鬃挪养氨砸疥干制办斌楷凑悲刨走白仔贱邵勿阳奢葬完镑浅镜今谬滇壳返电脑自动打铃器设计与实现电脑自动打铃器设计与实现任务设计任务设计| 电脑自动打铃器设计与实现电脑自动打铃器设计与实现任务的优先级设计任务的优先级设计人机接口,实时性低键盘任务键盘任务1输出控制任务输出控制任务3显示任务显示任务2RTC中断中断4电电脑脑自自动动打打铃铃器器控制接口,实时性高淖懒墅团冻材尝方军限斤硷贾注贮态侦叮腮桨钓烙看桓琳该简厢褐蔼皱莱电脑自动打铃器设计与实现电脑自动打铃器设计与实现任务设计任务设计| 电脑自动打铃器设计与实现电脑自动打铃器设计与实现任务的优先级设计任
10、务的优先级设计键盘任务键盘任务1输出控制任务输出控制任务3显示任务显示任务2RTC中断中断4电电脑脑自自动动打打铃铃器器优先级:6优先级:12优先级:13椅淬态拢缺锌川痴侩兴街扫集映删空窜茂悲董附移容邪操守硕交眩乐父考电脑自动打铃器设计与实现电脑自动打铃器设计与实现任务设计任务设计| 电脑自动打铃器设计与实现电脑自动打铃器设计与实现任务的数据结构设计任务的数据结构设计 对于一个任务,除了它的代码(任务函数)外,还有相关的信息。为保存这些信息,必须为任务设计对应的若干数据结构。任务需要配备的数据结构分为两类:一类是与操作系统有关的数据结构;另外一类是与操作系统无关的数据结构。任务的数任务的数据结
11、构据结构与操作系与操作系与操作系与操作系统有关的统有关的统有关的统有关的数据结构数据结构数据结构数据结构与操作系与操作系与操作系与操作系统无关的统无关的统无关的统无关的数据结构数据结构数据结构数据结构蛮梁询饲绍那篱芦荤魄温楔拔违缘非玫采微兰译提侥盒傣械盯莲德好垒萌电脑自动打铃器设计与实现电脑自动打铃器设计与实现任务设计任务设计| 电脑自动打铃器设计与实现电脑自动打铃器设计与实现任务的数据结构设计任务的数据结构设计1.与操作系统有关的数据结构 一个任务要想在操作系统的管理下工作,必须首先被创建。在C/OS-II中,任务的创建函数原型如下:任务函数指针任务参数指针,一般设为 (void *)0任务
12、堆栈栈顶指针任务优先级任务ID,一般设为prio任务堆栈栈底指针任务堆栈大小任务附加数据指针,一般设为(void *)0创建任务选项INT8U OSTaskCreateExt(void (*task)(void *pd),void *pdata,OS_STK *ptos, INT8U prio, INT16U id, OS_STK *pbos, INT32U stk_size, void *pext, INT16U opt);桥情洪户岳自慰肘阴臭疹焊爹注象岩搀飞吻苟蔡蝶蓉全曰葛仑髓道冉瞎互电脑自动打铃器设计与实现电脑自动打铃器设计与实现任务设计任务设计| 电脑自动打铃器设计与实现电脑自动打铃器
13、设计与实现任务的数据结构设计任务的数据结构设计 在电脑自动打铃器应用中,我们设计了3个任务(键盘任务、显示任务和输出控制任务),与操作系统有关的数据结构定义如下:#define TASKKEY_ID12/定义键盘任务的ID#define TASKKEY_PRIOTASKKEY_ID/定义键盘任务的优先级#define TASKKEY_STACK_SIZE512/定义键盘任务堆栈的大小#define TASKDISP_ID13/定义显示任务的ID#define TASKDISP_PRIO TASKDISP_ID/定义显示任务的优先级#define TASKDISP_STACK_SIZE512/定
14、义显示任务堆栈的大小#define TASKCTRL_ID6/定义控制任务的ID#define TASKCTRL_PRIO TASKCTRL_ID/定义控制任务的优先级#define TASKCTRL_STACK_SIZE 512/定义控制任务堆栈的大小OS_STK TaskKeyStkTASKKEY_STACK_SIZE; /定义键盘任务的堆栈OS_STK TaskDispStkTASKDISP_STACK_SIZE; /定义显示任务的堆栈OS_STK TaskCtrlStkTASKCTRL_STACK_SIZE; /定义控制任务的堆栈void TaskKey(void *pdata); /
15、键盘任务声明void TaskDisp(void *pdata); /显示任务声明void TaskCtrl(void *pdata); /控制任务声明锰孽涤账蜀型思稍襟逞恕餐飞蝗哮领法庐充酌界汾未诧抬嘱疯就昆题挂叔电脑自动打铃器设计与实现电脑自动打铃器设计与实现任务设计任务设计| 电脑自动打铃器设计与实现电脑自动打铃器设计与实现任务的数据结构设计任务的数据结构设计2.与操作系统无关的数据结构 电脑自动打铃器具有时钟和闹钟功能,那么我们首先就要构造这两个数据结构,定义如下:时钟结构定义struct time unsigned charucHour;/ 时 unsigned charucMin;
16、/ 分 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;/ 闹钟使能控制 struct unsigne
17、d shortusLevel;/ 输出电平控制 unsigned shortusTime;/ 输出时间控制 c4;/ 4路输出控制;typedef struct alarmALARM;typedef ALARM*PALARM;定义时钟和闹钟全局变量#define MAX_ALARM 4/ 最大闹钟个数TIMEGtimeCurrentTime;/ 时钟全局变量ALARM GalarmRingTimeMAX_ALARM;/ 闹钟全局变量坡雅壶谗料蹿暖压眷嘶至爱世咖懦掳湍远雀巳势骄寻蕉拜蛮卫实踞眺掐扛电脑自动打铃器设计与实现电脑自动打铃器设计与实现任务设计任务设计| 电脑自动打铃器设计与实现电脑自动
18、打铃器设计与实现多任务之间的同步与互斥多任务之间的同步与互斥 为了说明问题,我们在这里将键盘任务拆分成为两个任务,一个是键盘扫描任务,另一个是键盘处理任务,二者之间使用消息邮箱进行同步。1.行为同步发送键值消息接收键值消息键盘扫描任务键盘处理任务消息邮箱l 键盘扫描任务扫描到按键,就向消息邮箱发送键值消息;l 键盘处理任务应及时处理键值消息,二者之间是同步接力的关系。莲猿蹋焦交劈涩蛙父闸例雇销磺韦佣技旱搂熄普殷滤芒熔动掏八沂犁网镁电脑自动打铃器设计与实现电脑自动打铃器设计与实现任务设计任务设计| 电脑自动打铃器设计与实现电脑自动打铃器设计与实现多任务之间的同步与互斥多任务之间的同步与互斥2.资
19、源互斥 在电脑自动打铃器的设计中,ZLG7290是通过I2C总线与LPC2000连接的,I2C总线是键盘任务和显示任务的共享资源,必须遵循资源互斥的原则进行访问,二者之间使用信号量进行资源互斥。键盘任务显示任务信号量申请I2C资源释放I2C资源申请I2C资源释放I2C资源愧悔形论糟恩阉她舅蹄钟缮烃亭盎淀呈歌运暗攘巴撬生惧诫喧悟狂灶蜕熔电脑自动打铃器设计与实现电脑自动打铃器设计与实现任务设计任务设计| 电脑自动打铃器设计与实现电脑自动打铃器设计与实现多任务之间的信息传递多任务之间的信息传递1.全局变量 在任务的数据结构设计中,我们设计了时钟和闹钟两个数据结构,并定义了时钟和闹钟两个全局变量。键盘
20、任务,显示任务和RTC中断通过它们传递信息。全局变量(时钟和闹钟)键盘任务显示任务RTC中断更新时钟检测闹钟设置时钟和闹钟显示时钟和闹钟烤柿已翻埋吗疵袄煤挟益娘红劲圣桔舱茂檄订粒恬氨较璃禾德赁巷拨栋缕电脑自动打铃器设计与实现电脑自动打铃器设计与实现任务设计任务设计| 电脑自动打铃器设计与实现电脑自动打铃器设计与实现多任务之间的信息传递多任务之间的信息传递2.消息邮箱 RTC中断检测闹钟,闹钟到就向输出控制任务发送控制信息,在本设计实例中使用消息邮箱。 RTC中断输出控制任务消息邮箱发送控制消息接收控制消息谤爷冠瑟垂仍搬恍爱蝉桃狼题银砰疫蔼祸槐啄茁盐态膏看郧胀畔耐猎豌评电脑自动打铃器设计与实现电
21、脑自动打铃器设计与实现人机界面设计人机界面设计 键盘任务键盘任务主函数主函数 123显示任务显示任务RTC中断中断输出控制任务输出控制任务 456电脑自动打铃器设计与实现电脑自动打铃器设计与实现程序设计程序设计囱焰算染夕妓访泳芋赊套晕虏累泼死雹蹲豁粹保浇骇揍竞泥确逃嚷幌积蜕电脑自动打铃器设计与实现电脑自动打铃器设计与实现程序设计程序设计| 电脑自动打铃器设计与实现电脑自动打铃器设计与实现人机界面设计人机界面设计 对于一个具有人机界面的应用系统来说,首先应该考虑的是人机界面如何设计。 8位数码管显示力度有限,只能通过按键分屏显示,显示界面定义如下:时钟模式:12时 59分 59秒 星期一星期时十
22、位时个位分十位分个位秒十位秒个位0125959娘险玉屏淬损边歇埋瀑萧免达菌博栈平讲筷茸镍缴守拳包墙球融僵沥觅唬电脑自动打铃器设计与实现电脑自动打铃器设计与实现程序设计程序设计| 电脑自动打铃器设计与实现电脑自动打铃器设计与实现人机界面设计人机界面设计 对于一个具有人机界面的应用系统来说,首先应该考虑的是人机界面如何设计。 8位数码管显示力度有限,只能通过按键分屏显示,显示界面定义如下:时钟模式:2007年 12月 12日固定固定年十位年个位月十位月个位日十位日个位20071212溺朽耽文背毙梦陕凌千错歌杆螺莽律饲幢鹰漱洞栋奉劲倦很勋炽钮绵片狱电脑自动打铃器设计与实现电脑自动打铃器设计与实现程序
23、设计程序设计| 电脑自动打铃器设计与实现电脑自动打铃器设计与实现人机界面设计人机界面设计 对于一个具有人机界面的应用系统来说,首先应该考虑的是人机界面如何设计。 8位数码管显示力度有限,只能通过按键分屏显示,显示界面定义如下:闹钟模式:A表示闹钟,0表示第一个闹钟,闹钟时间08:30:00固定索引时十位时个位分十位分个位秒十位秒个位A0083000唾楔咎履池增师悄呈烩许茸记绅讫沥急雷被属俭欧覆蓖陋乾汛而状晰熊蝎电脑自动打铃器设计与实现电脑自动打铃器设计与实现程序设计程序设计| 电脑自动打铃器设计与实现电脑自动打铃器设计与实现人机界面设计人机界面设计 对于一个具有人机界面的应用系统来说,首先应该
24、考虑的是人机界面如何设计。 8位数码管显示力度有限,只能通过按键分屏显示,显示界面定义如下:闹钟模式:闹钟使能控制(E使能,d禁能),从左至右,第一个是总开关,接着是星期60(分别对应星期日星期一)的开关。E/dE/dE/dE/dE/dE/dE/dE/dEEEEEEEE扼任绳届锨均幻凯颈咎烤釜拔庆你册踩晨浦淹坞饺训受衍禽毫惋恃炉烙花电脑自动打铃器设计与实现电脑自动打铃器设计与实现程序设计程序设计| 电脑自动打铃器设计与实现电脑自动打铃器设计与实现人机界面设计人机界面设计 对于一个具有人机界面的应用系统来说,首先应该考虑的是人机界面如何设计。 8位数码管显示力度有限,只能通过按键分屏显示,显示界
25、面定义如下:闹钟模式:C表示通道,0表示第一个通道(每个闹钟有4个通道),H/L表示输出高低电平控制,接着是输出时间控制,最大为9999秒。固定通道H/L秒千位秒百位秒十位秒个位C0H9999结荫互齐锦藤蛛红漾煮慈龄烁师脆钡霉钞届诫搽悸森因罐酵迫主巩钉啃诉电脑自动打铃器设计与实现电脑自动打铃器设计与实现程序设计程序设计| 电脑自动打铃器设计与实现电脑自动打铃器设计与实现人机界面设计人机界面设计 根据上述分析,电脑自动打铃器具有时钟和闹钟模式,时钟和闹钟模式都分别有不同的显示内容,闹钟模式还有若干不同的闹钟,为了修改时钟和闹钟的设置,还需要一个光标闪烁来提示用户进行修改,为此定义了如下全局变量:
26、unsigned int GuiMode= 0;/ 模式(时钟和闹钟模式)unsigned int GuiCursor = 8;/ 光标(闪烁位置提示)unsigned int GuiIndex= 0;/ 索引(不同的闹钟)unsigned int GuiItem= 0;/ 条目(时钟或闹钟的不同内容) 按键的处理比较灵活,可自行设计。窥捧颗革遁粤锁素贸啪姨驮庆宽褪始行宠蔷弧专辜票胸勿灿陡蛮庚甲着翠电脑自动打铃器设计与实现电脑自动打铃器设计与实现程序设计程序设计| 电脑自动打铃器设计与实现电脑自动打铃器设计与实现主函数主函数 在程序设计的讲解中,首先讲一下主函数。在主函数中,进行了操作系统的初
27、始化,创建了一个键盘任务,最后,启动多任务操作系统。程序如下所示:int main(void) OSInit();/ 初始化uC/OS-II 创建键盘任务;/ 代码可参考配套教材 OSStart();/ 启动多任务操作系统 return (0);锨诲架提哈仇痞币付诈蜜酸随鸭阶橱示矢霍信滚操祥不蝉泄什暖藤沧仙睫电脑自动打铃器设计与实现电脑自动打铃器设计与实现程序设计程序设计| 电脑自动打铃器设计与实现电脑自动打铃器设计与实现键盘任务键盘任务l 键盘任务首先进行目标板的初始化,主要完成系统时钟中断的设置;l 然后初始化I2C0总线接口并设置中断;l 然后创建消息邮箱GmboxRingCtrl,用于
28、闹钟触发输出控制任务;l 接着初始化RTC并设置中断;l 最后创建了显示任务和输出控制任务,就进入了周期性循环,通过读取ZLG7290获取键值,进行按键处理。 键盘任务负责解释按键,设置时钟和闹钟。目标板初始化目标板初始化I2C0初始化初始化创建消息邮箱创建消息邮箱GmboxRingCtrlRTC初始化初始化创建显示任务和输出控制任务创建显示任务和输出控制任务任务循环任务循环园贩狸估涝炎篇遇收顾晤禾闲赔讯琼乔塑穷液释熏晋勤坍远隔莹藻脉褂牟电脑自动打铃器设计与实现电脑自动打铃器设计与实现程序设计程序设计| 电脑自动打铃器设计与实现电脑自动打铃器设计与实现显示任务显示任务 显示任务负责显示界面的刷
29、新,流程图如下所示: 显示任务周期性的输出全局变量的信息(时钟和闹钟),100ms是一个经验值,用户会觉得比较舒服,不会产生“系统死机”的感觉。眨隘篮金他霞赚殿憎邹济肉内甜菌碍洲肪质甘笑欧促搓容拙蓬邑澜呻盼缅电脑自动打铃器设计与实现电脑自动打铃器设计与实现程序设计程序设计| 电脑自动打铃器设计与实现电脑自动打铃器设计与实现输出控制任务输出控制任务l 输出控制任务首先初始化输出控制端口,默认为高电平;l 然后进入任务循环,从消息邮箱获取一条消息,由于消息邮箱没有消息,输出控制任务一直处于挂起状态,直到RTC中断检测到发生了闹钟事件;l 然后根据消息的内容设置各路的输出电平;l 接着就进入了输出控
30、制时间循环,在此循环内不断查询消息邮箱是否有新的消息,如果有则退出循环,从而进行新的消息的处理,否则直至所有4路输出时间到为止。 输出控制任务接收RTC中断发送的控制信息,控制4路输出的电平和时间。输出端口初始化输出端口初始化从消息邮箱获取一条消息从消息邮箱获取一条消息解释消息解释消息设置各路输出设置各路输出输出控制时间循环输出控制时间循环辙娇枕彝淘夜心泅涅逛肘钱县虞锨永祈凰宏央我叁仲韦体悔归胃膊怕缘私电脑自动打铃器设计与实现电脑自动打铃器设计与实现程序设计程序设计| 电脑自动打铃器设计与实现电脑自动打铃器设计与实现RTC中断中断 RTC中断更新实时时钟,遍历所有闹钟,向输出控制任务发送闹钟控制信息。流程图如下所示:视恕抄慑此丈匙凡序炸祷挫堡咯雇以丫饺澡肇吃拈蚜段桌钮毁杜刘枝驼密电脑自动打铃器设计与实现电脑自动打铃器设计与实现