单片机课程设计 交通灯.docx

上传人:b****1 文档编号:10995881 上传时间:2023-05-28 格式:DOCX 页数:27 大小:441.12KB
下载 相关 举报
单片机课程设计 交通灯.docx_第1页
第1页 / 共27页
单片机课程设计 交通灯.docx_第2页
第2页 / 共27页
单片机课程设计 交通灯.docx_第3页
第3页 / 共27页
单片机课程设计 交通灯.docx_第4页
第4页 / 共27页
单片机课程设计 交通灯.docx_第5页
第5页 / 共27页
单片机课程设计 交通灯.docx_第6页
第6页 / 共27页
单片机课程设计 交通灯.docx_第7页
第7页 / 共27页
单片机课程设计 交通灯.docx_第8页
第8页 / 共27页
单片机课程设计 交通灯.docx_第9页
第9页 / 共27页
单片机课程设计 交通灯.docx_第10页
第10页 / 共27页
单片机课程设计 交通灯.docx_第11页
第11页 / 共27页
单片机课程设计 交通灯.docx_第12页
第12页 / 共27页
单片机课程设计 交通灯.docx_第13页
第13页 / 共27页
单片机课程设计 交通灯.docx_第14页
第14页 / 共27页
单片机课程设计 交通灯.docx_第15页
第15页 / 共27页
单片机课程设计 交通灯.docx_第16页
第16页 / 共27页
单片机课程设计 交通灯.docx_第17页
第17页 / 共27页
单片机课程设计 交通灯.docx_第18页
第18页 / 共27页
单片机课程设计 交通灯.docx_第19页
第19页 / 共27页
单片机课程设计 交通灯.docx_第20页
第20页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

单片机课程设计 交通灯.docx

《单片机课程设计 交通灯.docx》由会员分享,可在线阅读,更多相关《单片机课程设计 交通灯.docx(27页珍藏版)》请在冰点文库上搜索。

单片机课程设计 交通灯.docx

单片机课程设计交通灯

 

第一章课程设计内容与要求分析

1.1课程设计内容

本题目以89C51单片机为核心器件组成交通灯控制系统,采用定时中断实现精确定时;利用提供的单元模块构成硬件系统。

交通灯控制系统的设计要求:

1)基本功能:

要求在一般工作方式下,十字路口为A、B道(A、B道交叉组成十字路口),每道设置红、绿、黄三盏灯,在灯的控制下各道轮流放行。

通行的流程是:

B道红灯亮40秒,同时A道绿灯亮30秒,闪烁5秒,A道黄灯亮5秒;然后切换A道红灯亮40秒,同时B道绿灯亮30秒,闪烁5秒;B道黄灯亮5秒。

如此循环。

在A、B道红、绿、黄灯依次点亮时,A、B道对应的两位数码管分别倒计时显示本道红、绿、黄灯点亮的时间。

2)扩展功能:

设置自动流量控制功能:

即当一道有车而另一道无车(用按键开关S1、S2模拟车辆检测功能)时,使有车车道放行。

设置优先控制功能:

当有紧急车辆通过时,用开关S0进行控制,将A、B道均设定为红灯,第二次按下开关S0后,回复正常运行状态。

1.2课程设计要求分析

1.2.1系统单元电路组成

 

图1交通灯外围电路

图2交通灯运行时电路

图3交通灯运行时电路

第二章控制系统程序设计

#include

unsignedcharcodedtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共阳极接法的数字0~9段码表

unsignedcharcodeselec[4]={0xFE,0xFD,0xFB,0xF7};//动态显示位选码表

unsignedchardisp[4];//定义4个显示缓冲单元

unsignedcharaa[25];

sbitKey1=P1^4;//定义四个独立按键

sbitKey2=P1^5;

sbitKey3=P1^6;

sbitKey4=P1^7;

sbitYL_ledR=P3^0;//定义Y轴方向左转的红绿黄灯

sbitYL_ledY=P3^1;

sbitYL_ledG=P3^2;

sbitYG_ledR=P3^3;//定义Y轴方向直行的红绿黄灯

sbitYG_ledY=P3^4;

sbitYG_ledG=P3^5;

sbitXL_ledR=P2^0;//定义X轴方向左转的红绿黄

sbitXL_ledY=P2^1;

sbitXL_ledG=P2^2;

sbitXG_ledR=P2^3;//定义X轴方向直行的红绿黄

sbitXG_ledY=P2^4;

sbitXG_ledG=P2^5;

unsignedcharflag=13,move_flag;//定义标志位

unsignedcharXGR,XGY,XGG;

unsignedcharXLR,XLY,XLG;

unsignedcharYGR,YGY,YGG;

unsignedcharYLR,YLY,YLG;

unsignedcharYYRR,XXRR;

unsignedcharnum;

voidDelayms(unsignedintx)//定义xms延时函数,x就是形式参数

{

unsignedinti;

unsignedcharj;

for(i=x;i>0;i--)

for(j=110;j>0;j--);

}

/**************************************************************

函数功能:

定时器0中断服务函数,显示矩阵按键值

**************************************************************/

voidTime0(void)interrupt1//"interrupt"声明函数为中断服务函数

{

unsignedcharcount;

TH0=(65536-50000)/256;//定时器T0的高8位赋初值

TL0=(65536-50000)%256;//定时器T0的低8位赋初值

if(++count>=20)

{

count=0;

YGG--;//Y轴绿灯时间减一

XXRR--;//X轴红灯时间减一

disp[2]=XXRR%10;//X轴数码管显示Y轴绿灯时间

disp[3]=XXRR/10;

disp[0]=YGG%10;//Y轴数码管显示X轴红灯时间

disp[1]=YGG/10;

if(YGG==0)//如果Y抽绿灯时间减为零,Y轴的黄灯开始亮,X轴的数码管显Y轴黄灯时间

{

disp[0]=YGY%10;

disp[1]=YGY/10;

YGG=1;

YGY--;

YG_ledG=1;//Y轴的绿灯熄灭

YG_ledY=0;

if(YGY==0XFF)//当Y轴黄灯闪烁时间变为零,Y轴红灯亮,黄灯灭,Y数码管显示X轴绿灯时间

{//同时X轴的绿灯亮,红灯灭,X轴数码管显示Y轴红灯时间

disp[0]=YLG%10;

disp[1]=YLG/10;

YGY=0;

YLG--;

YL_ledG=0;

YG_ledR=0;

YG_ledY=1;

YL_ledR=1;

if(YLG==0XFF)//当X轴绿灯时间为零,X轴的绿灯灭,黄灯开始闪烁。

{

disp[0]=YLY%10;

disp[1]=YLY/10;

YLG=0;

YLY--;

YL_ledG=1;

YL_ledY=0;

if(YLY==0XFF)

{

disp[2]=XGG%10;//X轴数码管显示Y轴绿灯时间

disp[3]=XGG/10;

disp[0]=YYRR%10;//Y轴数码管显示X轴红灯时间

disp[1]=YYRR/10;

YLY=0;

XGG--;

YYRR--;

XG_ledG=0;

XG_ledR=1;

YL_ledR=0;

YL_ledY=1;

if(XGG==0XFF)

{

disp[2]=XGY%10;//X轴数码管显示Y轴绿灯时间

disp[3]=XGY/10;

XGY--;

XGG=0;

XG_ledG=1;

XG_ledY=0;

if(XGY==0XFF)

{

disp[2]=XLG%10;//X轴数码管显示Y轴绿灯时间

disp[3]=XLG/10;

XLG--;

XGY=0;

XG_ledY=1;

XL_ledR=1;

XL_ledG=0;

XG_ledR=0;

if(XLG==0XFF)

{

disp[2]=XLY%10;//X轴数码管显示Y轴绿灯时间

disp[3]=XLY/10;

XLG=0;

XLY--;

XL_ledG=1;

XL_ledY=0;

if(XLY==0XFF)

{

TR0=0;

flag=13;

}

}

}

}

}

}

}

}

}

}

/**************************************************************

函数功能:

定时器1中断服务函数,显示矩阵按键值

**************************************************************/

voidTime1(void)interrupt3//"interrupt"声明函数为中断服务函数

{

staticunsignedchari;

TH1=(65536-2000)/256;//定时器T1的高8位赋初值

TL1=(65536-2000)%256;//定时器T1的低8位赋初值

P1=0xff;//全灭

P0=dtab[disp[i]];//查段码送P0口

P1=selec[i];//送位码

if(++i>3)i=0;

}

/********************************************************

K2键的扫描函数

********************************************************/

voidkey2_move()

{

if(Key2==0)

{

Delayms(1000);

if(Key2==0)

{

move_flag++;

if(move_flag>1)

{

move_flag=0;

}

}

}

}

/**************************************************************

函数功能:

初始化

**************************************************************/

voidinit(void)

{aa[1]=0;aa[2]=0;aa[3]=0;aa[4]=5;aa[5]=1;aa[6]=0;

aa[7]=0;aa[8]=0;aa[9]=0;aa[10]=5;aa[11]=1;aa[12]=0;

aa[13]=0;aa[14]=0;aa[15]=0;aa[16]=5;aa[17]=1;aa[18]=0;

aa[19]=0;aa[20]=0;aa[21]=0;aa[22]=5;aa[23]=1;aa[24]=0;

TMOD=0x11;//使用定时器T0的模式1

TH0=(65536-50000)/256;//定时器T0的高8位赋初值

TL0=(65536-50000)%256;//定时器T0的低8位赋初值

TH1=(65536-2000)/256;//定时器T1的高8位赋初值

TL1=(65536-2000)%256;//定时器T1的低8位赋初值

EA=1;//开总中断

ET0=1;//定时器T0中断允许

TR0=0;//启动定时器T0

ET1=1;

TR1=1;

}

voidkey(unsignedchark)

{

if(Key3==0)//加一键

{

Delayms(1000);

if(Key3==0)

{

num++;

if(num>9)

{

num=0;

}

aa[k]=num;

}

}

if(Key4==0)//减一键

{

Delayms(1000);

if(Key4==0)

{num--;

if(num==0xff)

{

num=9;

}

aa[k]=num;

}

}

}

voidupdat(unsignedcharn)

{

disp[1]=aa[n];

disp[0]=aa[n+1];

Delayms(1500);

disp[1]=10;

disp[0]=aa[n+1];

Delayms(1500);

}

voidupdat22(unsignedcharn)

{

disp[1]=aa[n-1];

disp[0]=aa[n];

Delayms(1500);

disp[1]=aa[n-1];

disp[0]=10;

Delayms(1500);

}

voidupdat33(unsignedchart)

{

disp[3]=aa[t];

disp[2]=aa[t+1];

Delayms(1500);

disp[3]=10;

disp[2]=aa[t+1];

Delayms(2500);

}

voidupdat44(unsignedchart)

{

disp[3]=aa[t-1];

disp[2]=aa[t];

Delayms(1500);

disp[3]=aa[t-1];

disp[2]=10;

Delayms(2500);

}

voidmain()

{

init();

disp[0]=0;

disp[1]=0;

disp[2]=0;

disp[3]=0;

while

(1)

{

if(Key1==0)//K1键功能程序

{

Delayms(1000);

if(Key1==0)

{

TR0=0;//关闭定时器

flag++;//两个方向时间设置标致

move_flag=0;

YG_ledR=YG_ledY=YG_ledG=1;

YL_ledR=YL_ledY=YL_ledG=1;

XG_ledR=XG_ledY=XG_ledG=1;

XL_ledR=XL_ledY=XL_ledG=1;

if(flag>13)

{

flag=1;

}

}

}

if(flag==1)//Y轴方向红灯时间设定程序

{

key2_move();

YG_ledR=0;

Delayms(1500);

YG_ledR=1;

if(move_flag==0)//数码管十位闪烁标致

{num=aa[1];

key

(1);

updat

(1);

}

if(move_flag==1)//数码管个位闪烁标致

{num=aa[2];

key

(2);

updat22

(2);

}

}

elseif(flag==2)//Y轴方向黄灯时间设定程序

{

key2_move();

YG_ledY=0;

Delayms(1500);

YG_ledY=1;

if(move_flag==0)

{num=aa[3];

key(3);

updat(3);

}

if(move_flag==1)

{num=aa[4];

key(4);

updat22(4);

}

}

elseif(flag==3)//Y轴方向绿灯时间设定程序

{

key2_move();

YG_ledG=0;

Delayms(1500);

YG_ledG=1;

if(move_flag==0)

{num=aa[5];

key(5);

updat(5);

}

if(move_flag==1)

{num=aa[6];

key(6);

updat22(6);

}

}

elseif(flag==4)//Y轴方向绿灯时间设定程序

{

key2_move();

YL_ledR=0;

Delayms(1500);

YL_ledR=1;

if(move_flag==0)

{num=aa[7];

key(7);

updat(7);

}

if(move_flag==1)

{num=aa[8];

key(8);

updat22(8);

}

}

elseif(flag==5)//Y轴方向绿灯时间设定程序

{

key2_move();

YL_ledY=0;

Delayms(1500);

YL_ledY=1;

if(move_flag==0)

{num=aa[9];

key(9);

updat(9);

}

if(move_flag==1)

{num=aa[10];

key(10);

updat22(10);

}

}

elseif(flag==6)//Y轴方向绿灯时间设定程序

{

key2_move();

YL_ledG=0;

Delayms(1500);

YL_ledG=1;

if(move_flag==0)

{num=aa[11];

key(11);

updat(11);

}

if(move_flag==1)

{num=aa[12];

key(12);

updat22(12);

}

}

elseif(flag==7)//X轴方向红灯时间设定程序

{

key2_move();

XG_ledR=0;

Delayms(1500);

XG_ledR=1;

if(move_flag==0)

{num=aa[13];

key(13);

updat33(13);

}

if(move_flag==1)

{num=aa[14];

key(14);

updat44(14);

}

}

elseif(flag==8)//X轴方向黄灯时间设定程序

{

key2_move();

XG_ledY=0;

Delayms(1500);

XG_ledY=1;

if(move_flag==0)

{num=aa[15];

key(15);

updat33(15);

}

if(move_flag==1)

{num=aa[16];

key(16);

updat44(16);

}

}

elseif(flag==9)//X轴方向绿灯时间设定程序

{

key2_move();

XG_ledG=0;

Delayms(1500);

XG_ledG=1;

if(move_flag==0)

{num=aa[17];

key(17);

updat33(17);

}

if(move_flag==1)

{num=aa[18];

key(18);

updat44(18);

}

}

elseif(flag==10)//X轴方向绿灯时间设定程序

{

key2_move();

XL_ledR=0;

Delayms(1500);

XL_ledR=1;

if(move_flag==0)

{num=aa[19];

key(19);

updat33(19);

}

if(move_flag==1)

{num=aa[20];

key(20);

updat44(20);

}

}

elseif(flag==11)//X轴方向绿灯时间设定程序

{

key2_move();

XL_ledY=0;

Delayms(1500);

XL_ledY=1;

if(move_flag==0)

{num=aa[21];

key(21);

updat33(21);

}

if(move_flag==1)

{num=aa[22];

key(22);

updat44(22);

}

}

elseif(flag==12)//X轴方向绿灯时间设定程序

{

key2_move();

XL_ledG=0;

Delayms(1500);

XL_ledG=1;

if(move_flag==0)

{num=aa[23];

key(23);

updat33(23);

}

if(move_flag==1)

{num=aa[24];

key(24);

updat44(24);

}

}

elseif(flag==13)//确定标致

{

flag=0;

TR0=1;//启动定时器

YGR=aa[1]*10+aa[2];

YGY=aa[3]*10+aa[4];

YGG=aa[5]*10+aa[6];

YLR=aa[7]*10+aa[8];

YLY=aa[9]*10+aa[10];

YLG=aa[11]*10+aa[12];

XGR=aa[13]*10+aa[14];//把各灯的设置的时间转成两位数

XGY=aa[15]*10+aa[16];

XGG=aa[17]*10+aa[18];

XLR=aa[19]*10+aa[20];//把各灯的设置的时间转成两位数

XLY=aa[21]*10+aa[22];

XLG=aa[23]*10+aa[24];

YYRR=XGG+XGY+XLG+XLY;

XXRR=YGG+YGY+YLG+YLY;

disp[2]=XXRR%10;//Y轴方向绿灯时间

disp[3]=XXRR/10;

disp[0]=YGG%10;//X轴方向红灯时间

disp[1]=YGG/10;

YG_ledG=0;//Y轴方向绿灯亮

YL_ledR=0;

XG_ledR=0;

XL_ledR=0;

YG_ledY=1;

YG_ledR=1;

YL_ledY=YL_ledG=1;

XG_ledY=XG_ledG=1;

XL_ledY=XL_ledG=1;

}

}

}

第三章单片机原理及应用课程设计总结

通过本次的单片机课程设计我收获很大,虽然时间

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2