班级:自动化1004 学号:10401701305 嵌入式系统 课程设计报告
姓名:甘显豪 指导教师: 成绩:
设计任务一 十字路口交通灯控制
一、设计目的:
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电路图粘贴在下面,并用文字对所设计的电路功能、原理进一步说明)
附图:
2
硬件电路说明:
复位电路,
时钟电路(仿真可略), ARM7微处理器LPC2106,
南北、东西道路交通灯,东西南北左转弯灯 交通计时共阴显示数码管。
交通规则:(1)首先是东西方向绿灯亮10s(从15s减到5s),然后东西黄灯闪烁5次,接着是东西左转弯绿灯亮10s,然后是东西左转弯绿灯闪烁5s;(2)南北方向方向绿灯亮10s,然后南北黄灯闪烁5次,接着是南北左转弯绿灯亮10s,然后是南北左转弯绿灯闪烁5s(没提到的方向都是红灯亮)。
四、源程序。(只将C语言应用程序附在后面,其它项目文档不要提供,C语言应用程序要有一定的注释说明) 源程序:
#include \#include\
void delay(unsigned int x) //延迟0.xMS {
while(x--) {
unsigned char j; for(j=0;j<125;j++) { ; } } }
uint8 led[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管段选值 void display() //数码管显示 { uint8 i=15; while(i-5) { IOSET = (led[ i / 10 ] << 13) | (led[ i % 10 ] << 6); delay(5000); IOCLR = (led[ i / 10 ] << 13) | (led[ i % 10 ] << 6); i--; } }
int main(void) {
3
uint8 k; int8 type=1; PINSEL0=0x00000000; //将管脚设置为通用IO端口GPIO PINSEL1=0x00000000; IODIR=0xFFFFFFFF; //将方向寄存器IODIR全设为输出=1 while(1) { switch(type) { case 1: //东西绿灯亮,南北红灯亮 IOSET=0x00600021; display(); k=5; //东西黄灯闪烁 while(k) { IOSET=0x00000010; IOSET = (led[ k / 10 ] << 13) | (led[ k % 10 ] << 6); delay(3000); IOCLR=0x00000010; IOCLR = (led[ k / 10 ] << 13) | (led[ k % 10 ] << 6); delay(3000); k--; } /*东西左转弯绿灯亮*/ IOCLR=0x00600021; IOSET=0X00500009; display(); type=2; break; case 2: //东西左转弯绿灯闪烁 k=5; while(k) { IOSET=0x00100000; IOSET = (led[ k / 10 ] << 13) | (led[ k % 10 ] << 6); delay(3000); IOCLR=0x00100000; IOCLR = (led[ k / 10 ] << 13) | (led[ k % 10 ] << 6); delay(3000); k--; }
4
type=3; break; case 3: //南北绿灯亮,东西红灯亮 IOCLR=0x00000001; IOSET=0x0060000C; display(); k=5;//南北黄灯闪烁 while(k) { IOSET=0x00000002; IOSET = (led[ k / 10 ] << 13) | (led[ k % 10 ] << 6); delay(3000); IOCLR=0x00000002; IOCLR = (led[ k / 10 ] << 13) | (led[ k % 10 ] << 6); delay(3000); k--; } /*南北左转弯绿灯亮*/ IOCLR=0X0060000C; IOSET=0x00A00009; display(); type=4; break; case 4: //南北左转弯绿灯闪烁 k=5; while(k) { IOSET=0x00800000; IOSET = (led[ k / 10 ] << 13) | (led[ k % 10 ] << 6); delay(3000); IOCLR=0x00800000; IOCLR = (led[ k / 10 ] << 13) | (led[ k % 10 ] << 6); delay(3000); k--; } type=1; IOCLR=0xFFFFFFFF; //全部清零 } } }
5