资源描述:
《嵌入式课程设计论文》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、多任务下的密码锁程序设计一.设计思路根据嵌入式操作系统μC/OS-Ⅱ下的开发方式,设计一个由两个任务组成的密码锁程序。其中任务一为用键盘输入密码的任务,led灯作为提示,任务二中用开关控制led灯。两个任务都使用了led灯,对led灯的控制权通过互斥信号量实现。任务一需要键盘输入的数据,故对驱动程序进行了适当修改,把键盘按键值存入一个缓冲变量keybuf(具体代码见二中key.c文件)。以下介绍具体代码和运行结果。二.源代码分析/*以下为main.c主程序文件*/#include"string.h"/*包含与字符串输出相关的头文件*/#include"IN
2、CLUDES.H"/*包含与uC/OS-II相关的系统调用的头文件*/#include"mx1_aitc.h"/*包含与中断控制器相关的头文件*/#include"IRQ.h"/*包含与中断管理相关的头文件*/#include"led.h"/*包含与led相关的头文件*/#include"mx1_gpio.h"/*包含与IO接口功能选择相关的头文件*/#include"switch.h"/*包含与开关相关的头文件*/#include"key.h"/*包含与键盘相关的头文件*/#include"misc.h"/*包含几个实用函数的头文件*//*用于时钟中断*
3、/externvoidOSStartTimeTick(void);externvoidOSTickISR(void);externcharkeybuf;/*键盘缓冲变量*/charstr[7]={0};/*保存输入的密码*/charstrpre[7]="456789";/*保存正确的密码*/inti=0;/*计数变量*/#defineSTK_SIZE_TASK1256/*分配给任务的堆栈大小*/#defineSTK_SIZE_TASK2256#definePRIO_TASK13/*任务的优先级*/#definePRIO_TASK24OS_STKStkTas
4、k1[STK_SIZE_TASK1];/*为任务分配堆栈空间*/OS_STKStkTask2[STK_SIZE_TASK2];OS_EVENT*pLedSem;/*用于LED的信号量*//*自检函数,密码正确,进入任务二后,点亮所有led灯,然后逐个熄灭*/voidCheck(){LED_On(LED3);LED_On(LED4);LED_On(LED5);LED_On(LED6);LED_On(LED7);LED_On(LED8);LED_On(LED9);LED_On(LED10);OSTimeDlyHMSM(0,0,0,400);LED_Off(LE
5、D3);OSTimeDlyHMSM(0,0,0,400);LED_Off(LED4);OSTimeDlyHMSM(0,0,0,400);LED_Off(LED5);OSTimeDlyHMSM(0,0,0,400);LED_Off(LED6);OSTimeDlyHMSM(0,0,0,400);LED_Off(LED7);OSTimeDlyHMSM(0,0,0,400);LED_Off(LED8);OSTimeDlyHMSM(0,0,0,400);LED_Off(LED9);OSTimeDlyHMSM(0,0,0,400);LED_Off(LED10);}/*
6、第一个任务:用键盘输入密码,led上显示相关内容*/voidYourTask1(void*pdata){INT8Uerr;IRQ_Register(OSTickISR,TIMER1_INT);/*开启uC/OS-II的时钟中断(必须在第一个运行的任务里进行)*/OSStartTimeTick();LED_Init(LED3);/*初始化led*/LED_Init(LED4);LED_Init(LED5);LED_Init(LED6);LED_Init(LED7);LED_Init(LED8);LED_Init(LED9);LED_Init(LED10);S
7、WITCH_Init(SW2);/*初始化开关*/SWITCH_Init(SW3);SWITCH_Init(SW4);SWITCH_Init(SW5);SWITCH_Init(SW6);SWITCH_Init(SW7);SWITCH_Init(SW8);SWITCH_Init(SW9);KEY_Init();/*初始化键盘*/OSSemPend(pLedSem,0,&err);/*等待信号量*/while(1){/*熄灭所有led灯,功能有3个:1.让初始化后点亮的led灯熄灭;2.键盘按下导致点亮的led灯统一在这里熄灭;3.从任务二返回后将还亮着的le
8、d灯熄灭*/LED_Off(LED3);LED_Off(LED4)