实验名称:蜂鸣器控制实验和基于μC/OS-II的LED流水灯控制实验
摘要:
熟悉uc/os-II操作系统和LPC2200专用工程模板,在该操作系统上完成流水灯循环控制任务和检测KEY1键控制蜂鸣器任务。
一、实验目的
(1)掌握LPC2200专用工程模板(for μC/OS-II)的使用
(2)能够在SmartARM2200教学实验开发平台上运行基于μC/OS-II操作系统的程序。
(3)掌握基于μC/OS-II操作系统的用户程序的编写风格
二、实验内容
建立三个μC/OS-II的任务,1个任务用于分别控制两个LED(P2.30,P2.31)流水灯循环点亮,这里称之为流水灯循环控制任务,一个任务用于检测按键输入(P0.14口的输入),这里就称之为按键检测任务,另一个任务用于控制蜂鸣器,这里就称之为蜂鸣器控制任务。蜂鸣器控制任务平时处于等待状态,当按键检测任务检测到有效按键输入时,立即唤醒蜂鸣器控制任务。
程序清单:
蜂鸣器控制
#include "config.h"
#define TASK_STK_SIZE 64
OS_STK TaskStartStk[TASK_STK_SIZE];
OS_STK TaskStk[TASK_STK_SIZE];
#define KEY1 (1 << 14) /* P0.14为key1 */
#define BEE (1 << 7) /* P0.07为蜂鸣器 */
void TaskStart(void *data);
void Task(void *data);
int main (void)
{ OSInit();
OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
OSStart();
return 0;
}
/*蜂鸣器控制任务*/
void TaskStart(void *pdata)
{ pdata = pdata; /* 避免编译警告 */
TargetInit(); /* 目标板初始化 */
IO0DIR &= ~KEY1; /* 设置KEY1为输入*/
IO0SET = BEE;
IO0DIR |= BEE; /* 设置蜂鸣器为输出*/
PINSEL0 = (PINSEL0 & 0xcffff3ff); /* 管教选择模块初始化 */
OSTaskCreate(Task, (void *)0, &TaskStk[TASK_STK_SIZE - 1], 10); /* 创建任务 */
for (;;)
{ OSTaskSuspend(OS_PRIO_SELF);
IO0CLR = BEE;
OSTimeDly(OS_TICKS_PER_SEC / 8);
IO0SET = BEE;
OSTimeDly(OS_TICKS_PER_SEC / 4);
IO0CLR = BEE
OSTimeDly(OS_TICKS_PER_SEC / 8);
IO0SET = BEE;
OSTimeDly(OS_TICKS_PER_SEC / 4);
}
}
/*按键测试任务*/
void Task(void *pdata)
{ pdata = pdata; /* 避免编译警告 */
for ( ; ; )
{ OSTimeDly(OS_TICKS_PER_SEC / 50); /* 延时20毫秒 */
if ((IO0PIN & KEY1) != 0)
{ continue;
}
OSTimeDly(OS_TICKS_PER_SEC / 50); /* 延时20毫秒 */
if ((IO0PIN & KEY1) != 0)
{ continue;
}
OSTaskResume(0);
while ((IO0PIN & KEY1) == 0)
{ OSTimeDly(OS_TICKS_PER_SEC / 50); /* 延时20毫秒 */
}
}
/*流水灯控制*/
#include "config.h"
#include "stdlib.h"
#define BEEP (1 << 7) /* P0.07为蜂鸣器 */
#define LED_ADJ 28
#define LED_IOCON (0xFF<
#define LED_OFF() IO2SET=LED_IOCON
#define LED_DISP(dat) LED_OFF();IO2CLR=((dat)<
#define TaskStkLengh 64 //Define the Task0 stack length
OS_STK TaskStk0[TaskStkLengh]; //Define the Task0 stack 定义用户任务0的堆栈
OS_STK TaskStk1[TaskStkLengh]; //Define the Task1 stack 定义用户任务1的堆栈
void Task0(void *pdata); //Task0 任务0
void Task1(void *pdata); //Task0 任务1
int main(void)
{
OSInit ();
OSTaskCreate (Task0,(void *)0, &TaskStk0[TaskStkLengh - 1], 2);
OSStart ();
return 0;
}
void Task0(void *pdata)
{
const uint8 DISP_TAB[24]={0x0F,0x00,0x0F,0x00,0x0F,0x00,0x0F,0x00,
0x01,0x02,0x04,0x08,0x04,0x02,0x01,0x00,
0x05,0x0A,0x05,0x0A,0x05,0x0A,0x05,0x00};
uint8 i;
pdata = pdata;
TargetInit ();
PINSEL0 = PINSEL0 & 0xffff3fff; // 管教选择模块初始化
IO0DIR = BEEP; // 设置蜂鸣器为输出
IO0SET = BEEP;
IO2DIR=LED_IOCON;
LED_OFF();
OSTaskCreate (Task1,(void *)0, &TaskStk1[TaskStkLengh - 1], 3);
while(1)
{ for(i=0;i<24;i++)
{ LED_DISP(DISP_TAB[i]);
OSTimeDly(OS_TICKS_PER_SEC/2);
}
}
}
void Task1(void *pdata)
{ pdata = pdata; /* 避免编译警告 */
while(1){
OSTimeDly(OS_TICKS_PER_SEC*10);
IO0CLR=BEEP;
OSTimeDly(OS_TICKS_PER_SEC/2);
IO0SET=BEEP;
}
}
}
三、实验前准备工作
熟悉LPC2000管脚连接模块与EasyARM2000开发板的硬件结构,注意蜂鸣器的控制电路与JP1跳线的接法。了解系统的配置、初始化,学会任务的建立与系统启动等。
四、实验结果及分析
这次实验同样运用到EasyJTAG驱动程序,达到了软硬件的有效通信功能,使得KEY1可以控制蜂鸣器和led流水灯循环点亮。按键是通过高低电平来控制流水灯和蜂鸣器的,在置为和清零两种状态中使蜂鸣器鸣叫和关闭。
思考:
能否将实验参考程序的两个任务组合成一个任务?这样做有什么利弊?
答:可以。合并的话,优点是免除了不少通信交流工作,减少共享资源的数量,减轻操作系统的负担,但缺点是任务的功能变繁杂,任务设计变得复杂,不利于整体程序的编写。
简单描述μC/OS-II应用程序的基本结构。
答:每一个uC/OS-II应用程序至少要有一个任务,而且每一个任务必须被写成无限循环的形式。
在实验参考程序中,如何设置任务的优先等级?若在例程中设置按键检测任务的优先级高于蜂鸣器控制任务的优先级,程序应如何运行?
答:可以用OSTaskCreate函数设置任务的优先等级。当同时发生时,程序会先运行按键检测任务,然后再运行蜂鸣器控制任务。
¥29.8
¥9.9
¥59.8