您好,欢迎来到榕意旅游网。
搜索
您的当前位置:首页LPC2106交通灯和ucos ii移植温控系统

LPC2106交通灯和ucos ii移植温控系统

来源:榕意旅游网
班级:电科1101 学号:11411400105 嵌入式系统 课程设计报告

姓名:袁识 指导教师:周玉 成绩:

设计任务一 十字路口交通灯控制

一、设计目的:

1.了解基于ARM7核的LPC2106的管脚功能和特点,掌握I/O控制寄存器的设置方法; 2.掌握ARM7应用系统编程开发方法,能用C语言编写应用程序; 3.熟练掌握ADS1.2软件的使用以及PROTEUS仿真调试的方法;

二、具体任务:

1.采用PROTEUS完成十字路口交通灯控制的硬件电路设计,要求单片机选型为飞利浦公司的LPC2106,东西南北方向分别设置红黄绿3个指示灯,东西方向和南北方向各用1个数码管显示通行时间;

2.用ADS1.2编写C语言应用程序,完成十字路口交通灯控制;

3.采用PROTEUS将应用程序装载在LPC2106中,进行仿真验证。要求东西方向和南北方向的数码管显示通行时间并倒计时,可以设置成一样,例如都是9秒倒计时;每当倒计时时间到,完成红黄绿指示灯的状态切换,模拟实现十字路口的交通灯管理控制。

1

三、硬件电路设计。(参考下图完成硬件电路设计,用屏幕抓图的方式将自己设计的

PROTEUS电路图粘贴在下面,并用文字对所设计的电路功能、原理进一步说明)

附图:

硬件电路说明:

设置LPC2106的芯片引脚为第一功能,即I/O功能。第P0.0~P0.7接到数码管的8位段码引脚,P0.8和P0.9接到数码管的两个位选引脚。P0.10~P0.12分别接到南北方向的红、黄、绿灯,P0.13~P0.15分别接到东西方向的红、黄、绿灯。

2

四、源程序。(只将C语言应用程序附在后面,其它项目文档不要提供,C语言应用程

序要有一定的注释说明)

源程序:

#include \"config.h\"

uint32 led1=0x00008400; //状态1,南北方向红灯,东西方向绿灯 uint32 led2=0x00004400; //状态2,南北方向红灯,东西方向黄灯 uint32 led3=0x00003000; //状态3,南北方向绿灯,东西方向红灯 uint32 led4=0x00002800; //状态4,南北方向黄灯,东西方向红灯

uint32 ss[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极数码管段码0-9

int main(void) //主程序

{ int a; //定义延时时间变量 uint32 i,j;

int a0,a1; //a0位时间的个位,a1位十位

PINSEL0=0x00000000; //把I/O口都选用第一功能 PINSEL1=0x00000000;

IODIR=0x0000ffff; //P0.0~P0.15设置为输出引脚 while(1) {

for(a=15;a>=0;a--) //延时时间为15秒 {

if(a<5) //如果时间为最后5s东西通道为绿灯转黄灯提示,即状态2 {

for(i=10;i>0;i--) //两个for循环延时1s for(j=2000;j>0;j--) {

a0=a%10; //个位 a1=a/10; //十位

if(a%2==0) //黄灯要闪烁,时间为偶数时黄灯亮 {

IOSET=led2|0x00000200|ss[a1]; //显示时间十位 IOCLR=~led2; //清零

IOSET=led2|0x00000100|ss[a0]; //显示时间个位 IOCLR=~led2; }

Else //黄灯要闪烁,时间为奇数时黄灯灭 {

IOSET=0x00000600|ss[a1]; //显示时间十位和状态 IOCLR=0x000002ff; //清零

3

IOSET=0x00000500|ss[a0]; //显示时间个位和状态 IOCLR=0x000001ff; } }

IOCLR=0x0000ffff; //清零 }

else //如果时间不是最后5s东西通道为绿,即状态1 { for(i=10;i>0;i--) for(j=2000;j>0;j--) {

a0=a%10; //个位

a1=a/10; //十位

IOSET=led1|0x00000200|ss[a1]; //显示时间和 IOCLR=~led1; IOSET=led1|0x00000100|ss[a0]; IOCLR=~led1; } } }

/*下面这部分和上面结构相同,上部分是状态1和状态2,下面是状态3和状态4*/

for(a=15;a>=0;a--) {

if(a<5) {

for(i=10;i>0;i--) for(j=2000;j>0;j--) {

a0=a%10; a1=a/10; if(a%2==0) {

IOSET=led4|0x00000200|ss[a1]; //显示个位 IOCLR=~led4;

IOSET=led4|0x00000100|ss[a0]; IOCLR=~led4; } else {

IOSET=0x00002200|ss[a1]; IOCLR=0x000002ff;

IOSET=0x00002100|ss[a0]; IOCLR=0x000001ff;

4

} }

IOCLR=0x0000ffff; }

else {

for(i=10;i>0;i--) for(j=2000;j>0;j--) {

a0=a%10;

a1=a/10;

IOSET=led3|0x00000200|ss[a1]; IOCLR=~led3;

IOSET=led3|0x00000100|ss[a0]; IOCLR=~led3; } } } }

return(0); }

五、仿真效果。(用屏幕抓图的方式将

PROTEUS运行仿真效果图粘贴在下

5

设计任务二 uC/OS-Ⅱ的移植与应用 一、设计目的:

1.了解嵌入式实时操作系统uC/OS-Ⅱ可移植、可裁剪等性能特点,正确理解实时操作系统中任务、信号、消息、中断等基本概念以及uC/OS-Ⅱ多任务管理的调度算法;

2.掌握uC/OS-Ⅱ在ARM7上移植的方法;

3.能将uC/OS-Ⅱ移植在LPC2106中,并根据具体要求创建用户任务,解决实际问题;

二、具体任务:

1.uC/OS-Ⅱ移植在LPC2106中。

2.编写用户任务程序,完成实时温度的采集控制。硬件电路见参考硬件电路图,图中用滑动变阻器代替温度传感器转换后的电压,用ADC0809完成A/D转换,并用数码管显示出来。

三、参考硬件电路。(用文字对所设计的电路功能、原理做详细说明)

附图:

6

硬件电路说明:

先设置LPC2106芯片的P0.0~P0.11、P0.13和P0.23位为输出,其余为输入功能。P0.0~P0.7接到数码管的段码的8个引脚,P0.8~P0.10和P0.23分别接到数码管的4位位选引脚,数码管为共阴极数码管,当某一位置一时通过反相器取反使该为显示。P0.11接到ADC0808的OE端;P0.12和按钮电路连接,当按键没按下是P0.12上拉为高电平,按键按下时下拉为低电平;P0.13接到ADC0808的start和ale端,P0.14接到EOC端。P0.15~P0.22与ADC0808的8位输出端连接,接收ADC0808输出的二进制数。ADC0808的IN0接一个滑动变阻器模拟温度改变。

四、源程序。(只将C语言应用程序附在后面,其它项目文档不要提供,C语言应用程

序要有一定的注释说明)

源程序:

#include \"config.h\"

#define TASK_STK_SIZE

#define key 0x00001000 //第P0.12位为1 #define adstart 0x00002000 //第P0.13位为1 #define adend 0x00004000 //第P0.14位为1 uint32 i; //定义温度变量

7

uint32 table1[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段码0~9,无小数点 uint32 table2[10]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF}; /*段码0~9,带小数点*/

OS_STK Task0Stk[TASK_STK_SIZE]; //这3个都是定义堆栈大小 OS_STK Task1Stk[TASK_STK_SIZE]; OS_STK Task2Stk[TASK_STK_SIZE];

void Task0(void *data); //声明任务0,任务1,任务2 void Task1(void *data); void Task2(void *data);

int main (void) {

OSInit(); //操作系统初始化

OSTaskCreate(Task0, (void *)0, &Task0Stk[TASK_STK_SIZE - 1],0); //任务0优先级为0 OSTaskCreate(Task1, (void *)0, &Task1Stk[TASK_STK_SIZE - 1],1); //任务1优先级为1 OSTaskCreate(Task2, (void *)0, &Task2Stk[TASK_STK_SIZE - 1],2); //任务2优先级为2 OSStart(); //启动操作系统 return 0; }

void delay(uint32 j) //延时函数 {

for(;j>0;j--); }

void IO_Init(void) //IO端口初始化 {

PINSEL0 = 0x00000000; /* 32个IO口全初始化为通用IO口*/ PINSEL1 = 0x00000000;

IODIR=0x00802fff; //P0.0~P0.11、P0.13和P0.23位为输出,其余为输入 }

void Task0(void *p_arg) //任务0,启动 {

p_arg = p_arg; //避免编译警告 TargetInit(); //初始化 IO_Init(); while(1) { while((IOPIN & key)!=0); /*假如按键没有按下,即P0.12为1时,一直循环在这里*/

8

while((IOPIN & key)==0); /*按键被按下又弹起,即P0.12由0变1时,程序顺序执行*/

OSTaskSuspend(OS_PRIO_SELF); //挂起本任务 } }

void Task1(void *p_arg) //任务1,模数转换 {

p_arg = p_arg; //避免编译警告 TargetInit(); //初始化 IO_Init(); //初始化 while(1) {

IOCLR=adstart; //P0.13清零 delay(20);

IOSET=adstart; //P0.13置1 delay(20);

IOCLR=adstart; //P0.13清零 delay(20); /*上面清零,置1,清零实现单次脉冲送到ADC0808的start端口,开启模数转换*/

while((IOPIN&adend)==0); /*当P0.14位为1,即ADC0808的EOC端口为1时模数转换完成*/

IOSET = 1<<11; /*OE使能端置1,即P0.11引脚置1,允许ADC0808的out1~out8输出*/

i = IOPIN; //读取P0.22~P0.15位,赋值给i;

i = 4*(i>>15); //把i右移15位,即移到低8位,并乘4,即255乘4

OSTaskSuspend(OS_PRIO_SELF); //挂起本次任务

OSTaskResume(2); //把任务2切换到就绪状态 } }

void Task2(void *p_arg) //任务2,显示 {

9

uint32 i0,i1,i2,i3;

p_arg = p_arg; //避免编译警告 TargetInit(); //初始化 IO_Init(); while(1) {

i0 = i%100%10; //取小数点位数据 i1 = i%100/10; // 取个位数据 i2 = i%1000/100; // 取十位数据 i3 = i/1000; //取百位 IOCLR=0xffffffff; //清零

IOSET=table1[i0]|(1<<10); /*(1<<10)表示1左移10位,即P0.10位置一,显示小数点位。table1[]为数码管段码。*/

delay(8000); //延时 IOCLR=0xffffffff; //清零

IOSET=table2[i1]|(1<<9); /*(1<<9)表示1左移9位,即P0.9位置一,显示个位。table2[]为数码管段码,带小数点。*/ delay(8000);

IOCLR=0xffffffff;

IOSET=table1[i2]|(1<<8); /*(1<<8)表示1左移8位,即P0.8位置一,显示十位。table1[]为数码管段码。*/ delay(8000);

IOCLR=0xffffffff;

IOSET=table1[i3]|(1<<23); /*(1<<23)表示1左移23位,即P0.23位置一,显示百位。table1[]为数码管段码。*/ delay(8000);

IOCLR=0xffffffff;

OSTaskResume(1); //切换至任务1 } }

10

五、仿真效果。(用屏幕抓图的方式将PROTEUS运行仿真效果图粘贴在下面)

11

六、课程设计心得

为期一个星期的嵌入式课程设计,在这两个星期内我们学到了很多东西,

刚开始有一定的难度。我在听了老师的部分讲解之后,自己地写出了程序并进行了仿真,并且学会了使用ADS1.2软件和Proteus软件进行设计的调试和仿真,让我受益匪浅,并为我做下一个课程设计奠定了基础。

设计刚开始时,对各指令理解不深刻,尤其是嵌入式C语言的不理解(课堂上只学了汇编语言),给我们带来了很大的困难,我们不得不自己查阅相关资料,加深理解。嵌入式设计是软、硬件协同设计,不仅要熟悉汇编语言和C语言进行软件设计,还要熟悉设计所用芯片的各性能指标及格引脚功能。这次课程设计采用的是计算机仿真设计,其中用于硬件设计的软件,我们以还用过,但用于软件设计的软件,我们还是第一次使用,这也给我们带来了不小的麻烦。

像这次的课程设计中的交通灯,但并没有实际中交通灯那么复杂。当然,我虽然地完成了这次课程设计,但是,未来的路还很长,有更多更具挑战的事情在等着我们。所以我一定要争取学习更多的嵌入式知识,以赶上时代的步伐。 在做了第一个课程设计以后再做第二个课程设计就变得不是那么难了,但是对μC/OS-II操作系统还是很陌生,我和搭档在分析设计目的以后,坚持思考,根据老师的指导,完成了程序的编写。在编写程序的过程中,我们遇到失败总是没有放弃,而是换一种思维,再进行思考,在反复的编写和调试中,才完成了程序,并仿真通过。

这次课程设计让我学到了很多东西,感谢老师的指导,感谢学校能给我们这么好的学习机会来培养我们的动手能力。

12

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- nryq.cn 版权所有 赣ICP备2024042798号-6

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务