嵌入式课程设计报告(交通灯控制、uC-OS-Ⅱ的移植)(共10页).doc
精选优质文档-倾情为你奉上任务一 十字路口交通灯控制一、设计目的: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秒倒计时;每当倒计时时间到,完成红黄绿指示灯的状态切换,模拟实现十字路口的交通灯管理控制。三、硬件电路设计。(参考下图完成硬件电路设计,用屏幕抓图的方式将自己设计的PROTEUS电路图粘贴在下面,并用文字对所设计的电路功能、原理进一步说明)附图:硬件电路说明:硬件说明: 飞利浦公司的LPC2106,双位共阴数码管,交通等模型。管脚说明:P0.0P0.6接数码管的段选ag;P0.7、P0.8接数码管的位选1、2;P0.10P0.12接交通灯,分别对应南北方向的红、黄、绿和东西方向的绿、黄、红四、源程序。(只将C语言应用程序附在后面,其它项目文档不要提供,C语言应用程序要有一定的注释说明)源程序:#include"config.h"#include"LPC2106.h"int8 j=0; /定义全局变量juint8 led=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/数码管段选值/*延迟子函数*/void delay(int t) int i;for(i=0;i<t;i+);/*显示子函数*/void display(int k)int i,l,m;/l=k/10;/把数码管十位的值求出并赋给li=k%10;/把数码管个位的值求出并赋给iif(j=0) m=10;/判断数码管显示的时间所对应的是红灯、绿灯、还是黄灯else if(j=1|j=3) m=11;/else if(j=2) m=12;/IOCLR=0xffffffff;/io口清零IOSET=(1<<m|1<<8);/显示灯的颜色,并对数码管位选十位IOSET+=ledl;/数码管段选delay(100);IOCLR=0xffffffff;/io清零IOSET=(1<<m|1<<7);/显示灯的颜色,并对数码管位选个位IOSET+=ledi;/数码管段选delay(100);/*主函数*/int main(void)PINSEL0=0x;/配置pinsel0寄存器,io低15位作普通输入输出口IODIR=0xffffffff;/配置io口为输出IOCLR=0xffffffff;/io口清零while(1)/死循环if(j=0)/南北方向红灯,东西方向绿灯int i,l;for(i=;i>0;i=i-2)/持续时间设置l=i/10000;display(l);j+;if(j=1)/东西南北都为黄灯int i,l;for(i=60000;i>0;i=i-2)/持续时间设置l=i/10000;display(l);j+;if(j=2)/南北方向绿灯,东西方向红灯int i,l;for(i=;i>0;i=i-2)/持续时间设置l=i/10000;display(l);j+;if(j=3)/东西南北都为黄灯int i,l;for(i=60000;i>0;i=i-2)/持续时间设置l=i/10000;display(l);j=0;五、仿真效果。(用屏幕抓图的方式将PROTEUS运行仿真效果图粘贴在下面)任务二 uC/OS-的移植与应用一、设计目的:1了解嵌入式实时操作系统uC/OS-可移植、可裁剪等性能特点,正确理解实时操作系统中任务、信号、消息、中断等基本概念以及uC/OS-多任务管理的调度算法;2掌握uC/OS-在ARM7上移植的方法;3能将uC/OS-移植在LPC2106中,并根据具体要求创建用户任务,解决实际问题;二、具体任务:1uC/OS-移植在LPC2106中。2编写用户任务程序,完成实时温度的采集控制。硬件电路见参考硬件电路图,图中用滑动变阻器代替温度传感器转换后的电压,用ADC0809完成A/D转换,并用数码管显示出来。三、参考硬件电路。(用文字对所设计的电路功能、原理做详细说明)附图:硬件电路说明:硬件电路: 飞利浦公司的LPC2106、ADC0808模数转换芯片、四位共阴数码管、按键、74LS04反向器、模拟温度传感器的滑动变阻器。管脚说明:LPC2106低16位作输出端:P0.0P0.6接数码管段选ag;P0.8P0.10接数码管位选24;P0.11接adc0808的转换启动端start,P0.12接adc0808的输出使能端oe;LPC2106高16位作输入端:P0.16P0.23接adc的输出端out8out1:;P0.24接adc转换结束信号端eoc,P0.25接按键;Adc管脚:in0接温度采集信号;adc aadc c都接地选中in0;clock接20kHz的时钟信号;四、源程序。(只将C语言应用程序附在后面,其它项目文档不要提供,C语言应用程序要有一定的注释说明)源程序:#include"config.h"#defineTASK_STK_SIZE64#defineKEY0x/定义key#define START0x/定义start#define EOC0x/定义eoc#define OE0x/定义oeuint32 led10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/共阴极数码管字形码uint32i; /ADC转换值 OS_STKMain_Task_key_StkTASK_STK_SIZE;/定义任务堆栈大小OS_STKMain_Task_adc_StkTASK_STK_SIZE;OS_STKMain_Task_display_StkTASK_STK_SIZE;/*延时子函数*/void delay(uint32 t)while(t-);/*io端口初始化子函数*/void IO_init(void)PINSEL0=0x;/32个IO口全初始化为通用IO口PINSEL1=0x;IODIR=0x0000ffff;/低16位为输出口,高16位为输入口/*key任务子函数*/void Task_key(void *p_arg)p_arg=p_arg;/避免编译警告TargetInit();/目标初始化IO_init();while(TRUE)while(IOPIN&KEY)!=0);/判断按键按下delay(2000);while(IOPIN&KEY)=0);/判断按键松开IOCLR=0x0000ffff;OSTaskSuspend(OS_PRIO_SELF);/挂起任务/*adc转换任务子函数*/void Task_adc(void*p_arg)p_arg=p_arg;/避免编译警告TargetInit();/目标初始化IO_init();while(TRUE)IOCLR=START;/产生一个正脉冲,启动adc转换delay(20);IOSET=START;delay(50);IOCLR=START;while(IOPIN&EOC)=0);/判断ad转换结束IOSET=OE;/输出使能i=IOPIN&0x00ff0000;/数据处理i=i>>16;OSTaskSuspend(OS_PRIO_SELF);/挂起任务/*display任务子函数*/void Task_display(void *p_arg)int32 g,s,b;/定义个、十、百p_arg=p_arg;/避免编译警告IO_init();/io端口初始化while(TRUE)b=i/100;/百位s=(i%100)/10;/十位g=i%10;/个位IOSET=(1<<8)|ledb;/显示百位delay(2000);IOCLR=0x0000ffff;IOSET=(1<<9)|leds;/显示十位delay(2000);IOCLR=0x0000ffff;IOSET=(1<<10)|ledg;/显示个位delay(2000);IOCLR=0x0000ffff;OSTaskResume(1);/恢复adc任务/*主函数*/int main(void)OSInit();/操作系统初始化OSTaskCreate(Task_key,(void*)0,&Main_Task_key_StkTASK_STK_SIZE-1,0);OSTaskCreate(Task_adc,(void*)0,&Main_Task_adc_StkTASK_STK_SIZE-1,1);OSTaskCreate(Task_display,(void*)0,&Main_Task_display_StkTASK_STK_SIZE-1,2);OSStart();/启动操作系统return 0;五、仿真效果。(用屏幕抓图的方式将PROTEUS运行仿真效果图粘贴在下面)专心-专注-专业