嵌入式系统课程设计报告Word文档格式.docx
《嵌入式系统课程设计报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《嵌入式系统课程设计报告Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
1.设置所有I/O口为第一功能,将硬件电路图按上图所示连接。
2.东西南北四个方向分别装有红、黄、绿三灯,通过放置标号的方式连接到LPC2106。
3.数码管为交通灯一位十进制倒计时显示,两个数码管显示同样的数字。
四、源程序。
(只将C语言应用程序附在后面,其它项目文档不要提供,C语言应用程序要有一定的注释说明)
源程序:
#include"
config.h"
#defineucharunsignedchar
charLED[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*0-9数字段码表*/
voiddelay(uint32n)/*延时子程序*/
{
uint32i;
for(i=0;
i<
500000;
i++)
n--;
}
voidlight(intm)/*显示数码管子程序*/
inti;
if(m==0)
{
for(i=9;
i>
=0;
i--)/*东西亮绿灯,南北亮红灯延时9秒*/
{
IOSET=LED[i];
/*查段码表送显示*/
delay(500000000);
IOCLR=0x000001ff;
/*将IO低九位清零*/
}
}
else
if(m==1)
for(i=6;
i--)/*东西亮黄灯,南北亮黄灯延时6秒*/
{
IOSET=LED[i];
delay(500000000);
IOCLR=0x000001ff;
}
else
for(i=8;
i--)/*东西亮红灯,南北亮绿灯延时8秒*/
intmain(void)/*主程序*/
uint32j;
while
(1)
PINSEL0=0x00000000;
IODIR=0x00007fff;
IOCLR=0x00007fff;
IOSET=0x00004200;
/*东西方向亮红灯,南北方向亮绿灯*/
j=0;
light(j);
IOSET=0x00002400;
/*东西方向亮黄灯,南北方向亮黄灯*/
j=1;
IOSET=0x00001800;
/*东西方向亮绿灯,南北方向亮红灯*/
j=2;
}
return(0);
五、仿真效果。
(用屏幕抓图的方式将PROTEUS运行仿真效果图粘贴在下面)
1.东西方向绿灯,南北方向红灯
2.东西南北都是黄灯
3.南北方向绿灯,东西方向红灯
设计任务二uC/OS-Ⅱ的移植与应用
1.了解嵌入式实时操作系统uC/OS-Ⅱ可移植、可裁剪等性能特点,正确理解实时操作系统中任务、信号、消息、中断等基本概念以及uC/OS-Ⅱ多任务管理的调度算法;
2.掌握uC/OS-Ⅱ在ARM7上移植的方法;
3.能将uC/OS-Ⅱ移植在LPC2106中,并根据具体要求创建用户任务,解决实际问题;
1.uC/OS-Ⅱ移植在LPC2106中。
2.编写用户任务程序,完成实时温度的采集控制。
硬件电路见参考硬件电路图,图中用滑动变阻器代替温度传感器转换后的电压,用ADC0809完成A/D转换,并用数码管显示出来。
三、参考硬件电路。
(用文字对所设计的电路功能、原理做详细说明)
1.用仿真可调滑动变阻器控制输入电压变化代替温度传感器的输入电压变化,间接仿真环境温度变化。
2.ADC0808芯片用作A/D转换主芯片,12脚为参考电压,10脚接脉冲控制A/D转换速度。
23、24、25引脚为通道选择。
000为IN0通道。
数码管显示模拟数值。
3.图中有按钮两个,按钮KEY为开关,按一下启动A/D转换并显示电压数值,再按一下停止显示;
按钮RST为复位按键。
4.设置LPC2106引脚连接ADC0808的P0.14-P0.22和P0.12为输入,其他的引脚为输出。
/****************************************************************************
*利用μC/OS-II操作系统移植,编写的实时温度采集嵌入式课程设计的C语言主程序*
程序功能:
按下按钮KEY,LPC2106控制ADC0808的温度采集的电压的模拟量转
换成数字量传送给LPC2106,LPC2106将二进制数转换成十进制数送给数码管显示,
当再次按下按钮时关闭系统,按钮Key作为温度采集转化并通过数码管显示的开关
****************************************************************************/
#defineTASK_STK_SIZE64//定义任务堆栈长度
#definekey(1<
<
12)//定义开关按钮KEY
#definedisinp0x000007ff//定义控制数码管引脚
#definediswei1(1<
8)//定义数码管位1
#definediswei2(1<
9)//定义数码管位2
#definediswei3(1<
10)//定义数码管位3
#defineadstart(1<
13)//定义A/D转换开关
#defineadend(1<
14)//定义A/D转换结束
#defineadread(1<
11)//定义读A/D转换结果
#defineadoutp0x007f8000//定义A/D转换输出位
OS_STKTask0Stk[TASK_STK_SIZE];
//定义任务0堆栈
OS_STKTask1Stk[TASK_STK_SIZE];
//定义任务1堆栈
OS_STKTask2Stk[TASK_STK_SIZE];
//定义任务2堆栈
uint32readad=0,a=0,b=0,c=0;
//定义全局变量
uint32tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//数码管显示数值表
voidTask0(void*data);
//声明任务0
voidTask1(void*data);
//声明任务1
voidTask2(void*data);
//声明任务2
voiddelay(uint32n)//延时函数,当n为1时大致延时1毫秒
uint32i,j;
for(i=n;
0;
i--)
for(j=2000;
j>
j--);
voidIO_Init(void)//端口初始化函数
PINSEL0=0x00000000;
//设置P0.0-P0.15工作模式为输入输出口
PINSEL1=0x00000000;
//设置P0.16-P0.31工作模式为输入输出口
IODIR=0x00002fff;
//设置P0.0-P0.11、P0.13为输出端口
intmain(void)
{
OSInit();
//操作系统初始化
OSTaskCreate(Task0,(void*)0,&
Task0Stk[TASK_STK_SIZE-1],2);
//创建任务0,优先级2
OSTaskCreate(Task1,(void*)0,&
Task1Stk[TASK_STK_SIZE-1],3);
//创建任务1,优先级3
OSTaskCreate(Task2,(void*)0,&
Task2Stk[TASK_STK_SIZE-1],4);
//创建任务2,优先级4
OSStart();
//启动操作系统
return0;
voidTask0(void*p_arg)//任务0,开关任务
p_arg=p_arg;
//避免编译警告
TargetInit();
//目标板初始化
IO_Init();
//引脚初始化
while((IOPIN&
key)!
=0);
//等待按键按下
key)==0);
//等待按键松开
IOCLR=0x007fffff;
//输出全置零
OSTaskResume(4);
//恢复优先级为4的任务,即任务2
OSTaskSuspend
(2);
//挂起优先级为2的任务,即本任务
voidTask1(void*p_arg)//任务1,A/D转换任务
IOCLR=adstart;
//清零A/D开关
delay(10);
//延时10毫秒
IOSET=adstart;
//开A/D转换
//关A/D转换
adend)==0);
//等待转换结束
IOSET=adread;
//读A/D转换结果
readad=IOPIN&
adoutp;
//屏蔽与A/D转换结果无关位
readad>
>
=15;
//A/D转换结果右移到低8位
a=readad/100;
//温度显示百位
b=readad%100/10;
//温度显示十位
c=readad%10;
//温度显示个位
OSTaskSuspend(3);
//挂起优先级为4的任务,即本任务
voidTask2(void*p_arg)//任务2,数码管温度显示任务
//避免编译警告
//目标板初始化
{
while
(1)//循环动态显示温度
IOCLR=disinp;
//关闭数码管
IOSET=diswei1|tab[a];
//数码管显示温度百位
delay(5);
//延时5毫秒
IOSET=diswei2|tab[b];
//数码管显示温度十位
//延时5毫秒
//关闭数码管
IOSET=diswei3|tab[c];
//数码管显示温度个位
if((IOPIN&
key)==0){//等待关显示按键按下
break;
}//跳出数码管显示循环
OSTaskResume
(2);
//恢复优先级为2的任务,即任务0
OSTaskResume(3);
//恢复优先级为3的任务,即任务1
OSTaskSuspend(4);
/*说明*本程序中用到的任务恢复函数OSTaskResume好像没有起作用,没有找出原因*/
/********************************程序结束*******************************/
1.C程序编译通过,并成功生成HEX文件,编译结果如图2.3所示。
图2.3
2.按下KEY,如图2.4所示。
图2.4
3.再次按下KEY时,如图2.5所示。
图2.6
4.更多仿真图,如截图2.7所示。
图2.7