单片机交通灯程序
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/12 13:56:21 初中作文
篇一:单片机 交通灯(含程序)
单片机课程设计报告
题 目 现代交通灯的设计
专 业 电气工程及其自动化
班 级 电气081
学 号 3080421029
学生姓名 郭琪
指导老师 王水鱼老师
2010年
起止日期:2011年1月10日至2011年1月14日
目录
一、引言 3
二、概要设计 4 2.1 设计思路 4 2.2 设计的主要内容和要求 4
2.3 总体设计框图 5
三、硬件设计 5 3.1 LED循环电路设计 6 3.1.1 89c51单片机概述 6
3.1.2 LED循环说明 9
3.2 倒计时显示电路 11
3.2.1 74LS164芯片 11
3.2.2 共阴极数码显示管 12
3.2.3 倒计时电路 13
3.2.4 急通车电路 13
四、软件设计 14
4.1 程序流程图 14
4.2 LED红绿灯显示 14
4.3 到计时显示 16
4.4 急通车控制 16
4.5程序代码 16
五、总结 16 参考文献 17 附录一: 18 附录二: 19
基于51单片机的交通灯控制系统设计
摘要:在日常生活中,交通信号灯的使用,市交通得以有效管理,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。交通灯控制系统由80C51单片机、键盘、LED显示、交通灯延时组成。系统除具有基本交通灯功能外,还具有时间设置、LED信息显示功能,市交通实现有效控制。
关键词:交通灯,单片机,自动控制
一、引言
当今,红绿灯安装在个个道口上,已经成为疏导交通车辆最常见和最有效的手段。但这个技术在19世纪就已经出现了。
1858年,在英国伦敦主要街头安装了以燃煤气为光源的红、蓝两色的机械般手势信号灯,用以指挥马车通行。这是世界上最早的交通信号灯。1868年,英国机械工程师纳伊特在伦敦威斯敏斯特区的会议大厦前的广场上,安装了世界上最早的煤气红绿灯。它由红绿两以旋转方式玻璃提灯组成,红色表示“停止”,绿色表示“注意”。1869年1月2日,煤气灯爆炸,是警察受伤,遂被取消!
电气启动的红绿灯出现在美国,这种红绿灯由红黄绿三色圆形的投光器组成,1914年始装于纽约市5号大街的一座高塔上。红灯亮表示“停止”,绿灯亮表示“通行”。
信号灯的出现,使得交通得以有效的管理,对于疏导交通流量、提高道路通行能力、减少交通事故有明显效果。1968年,联合国《道路交通和道路标志信号协定》对各种信号灯的含义作了规定。绿灯时通行信号灯,面对绿灯的车辆可以直行,左转弯和右转弯,除非两一种标志禁止某一种转向。左右转弯车
辆必需让合法的正在路口内行驶的车辆和过人行横线的行人优先通行。红灯是禁行信号灯,面对红灯的车辆必需在交叉路口的停车线后停车。黄灯是警告信号,面对黄灯的车辆不能越过停车线,但车辆已经十分接近停车线而不能安全停车的可以进入交叉路口!
二、概要设计
2.1 设计思路
利用单片机实现交通灯的控制,该任务分以下几个方面:
a 实现红、绿、黄灯的循环控制。要实现此功能需要表示三种不同颜色的LED灯分别接在P1个管脚,用软件实现。
b 用数码管显示倒计时。可以利用动态显示或静态显示,串行并出或者并行并出实现。
C 实现急通车。这需要人工实现,编程时利用到中断才能带到目的,只要有按钮按下,那么四个方向全部显示红灯,禁止以诶车辆通行。当情况解除,让时间回到只能隔断处继续进行。
2.2设计的主要内容和要求
1、设计一款带左转、直行、右转三种通行交通灯
2、带紧急按钮功能,当紧急按钮按下时,所有方向均亮起红灯
3、可在线修改红绿灯等待间隔时间
4、实现显示到计时功能
5、其他功能(创新部分)
2.3总体设计框图
见图一:
篇二:单片机交通灯程序
/*******************************************************************************
* 实验名 : 动态显示数码管实验
* 使用的IO :
* 实验效果 : 数码管显示76543210。
* 注意 :当位选用P1口的时候注意可能会有一位不亮,那么调整J21
*******************************************************************************/
#include
//--定义使用的IO口--//
#define GPIO_DIG P0
#define GPIO_PLACE P1
#define GPIO_TRAFFIC P2
sbit RED10 = P2^0; //上人行道红灯
sbit GREEN10 = P2^1; //上人行道绿灯
sbit RED11 = P2^2;
sbit YELLOW11= P2^3;
sbit GREEN11 = P2^4;
sbit RED00 = P3^0; //右人行道红灯
sbit GREEN00 = P3^1; //右人行道绿灯
sbit RED01 = P2^5;
sbit YELLOW01= P2^6;
sbit GREEN01 = P2^7;
//--定义全局变量--//
unsigned char code DIG_PLACE[8] = {
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制 查表的方法控制
unsigned char code DIG_CODE[17] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsigned char DisplayData[8];
//用来存放要显示的8位数的值
unsigned char Time, Second;
//用来存放定时时间
//--声明全局函数--//
void DigDisplay(); //动态显示函数
void Timer0Cofig(void);
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main(void)
{
Second = 1; Timer0Cofig(); while(1) { if(Second == 70) { } //--宝田路通行,30秒--// if(Second < 31) { DisplayData[0] = 0x00; DisplayData[1] = 0x00; DisplayData[2] = DIG_CODE[(30 - Second) % 100 / 10]; DisplayData[3] = DIG_CODE[(30 - Second) %10]; DisplayData[4] = 0x00; DisplayData[5] = 0x00; DisplayData[6] = DisplayData[2]; DisplayData[7] = DisplayData[3]; DigDisplay(); //--宝田路通行--// GPIO_TRAFFIC = 0xFF; //将所有的灯熄灭 RED00 = 1; GREEN00 = 1; GREEN11 = 0; //宝田路绿灯亮 GREEN10 = 0; //宝田路人行道绿灯亮 Second = 1;
} RED01 = 0; //前进路红灯亮 RED00 = 0; //前进路人行道红灯亮 //--黄灯等待切换状态,5秒--// else if(Second < 36) { } DisplayData[0] = 0x00; DisplayData[1] = 0x00; DisplayData[2] = DIG_CODE[(35 - Second) % 100 / 10]; DisplayData[3] = DIG_CODE[(35 - Second) %10]; DisplayData[4] = 0x00; DisplayData[5] = 0x00; DisplayData[6] = DisplayData[2]; DisplayData[7] = DisplayData[3]; DigDisplay(); //--黄灯阶段--// GPIO_TRAFFIC = 0xFF; //将所有的灯熄灭 RED00 = 1; GREEN00 = 1; YELLOW11 = 0; //宝田路黄灯亮 RED10 = 0; //宝田路人行道红灯亮 YELLOW01 = 0; //前进路红灯亮 RED00 = 0; //前进路人行道红灯亮 //--前进路通行--// else if(Second < 66) { DisplayData[0] = 0x00; DisplayData[1] = 0x00; DisplayData[2] = DIG_CODE[(65 - Second) % 100 / 10]; DisplayData[3] = DIG_CODE[(65 - Second) %10]; DisplayData[4] = 0x00; DisplayData[5] = 0x00; DisplayData[6] = DisplayData[2]; DisplayData[7] = DisplayData[3]; DigDisplay();
}
} } GPIO_TRAFFIC = 0xFF; //将所有的灯熄灭 RED00 = 1; GREEN00 = 1; RED11 = 0; //宝田路红灯亮 RED10 = 0; //宝田路人行道红灯亮 GREEN01 = 0; //前进路绿灯亮 GREEN00 = 0; //前进路人行道绿灯亮 //--黄灯等待切换状态,5秒--// else { } DisplayData[0] = 0x00; DisplayData[1] = 0x00; DisplayData[2] = DIG_CODE[(70 - Second) % 100 / 10]; DisplayData[3] = DIG_CODE[(70 - Second) %10]; DisplayData[4] = 0x00; DisplayData[5] = 0x00; DisplayData[6] = DisplayData[2]; DisplayData[7] = DisplayData[3]; DigDisplay(); //--黄灯阶段--// GPIO_TRAFFIC = 0xFF; //将所有的灯熄灭 RED00 = 1; GREEN00 = 1; YELLOW11 = 0; //宝田路黄灯亮 RED10 = 0; //宝田路人行道红灯亮 YELLOW01 = 0; //前进路红灯亮 RED00 = 0; //前进路人行道红灯亮
/*******************************************************************************
* 函 数 名 : DigDisplay
* 函数功能 : 使用数码管显示
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void DigDisplay()
{
} for(i=0; i<8; i++) { } GPIO_PLACE = DIG_PLACE[i]; //发送位选 GPIO_DIG = DisplayData[i]; //发送段码 j = 10; //扫描间隔时间设定 while(j--); GPIO_DIG = 0x00; //消隐 unsigned char i; unsigned int j;
/*******************************************************************************
* 函 数 名 : Timer0Cofig
* 函数功能 : 配置定时器
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer0Cofig(void)
{
TMOD = 0x01; //定时器0选择工作方式1
TH0 = 0x3C; //设置初始值,定时50MS
TL0 = 0xB0;
EA = 1;
ET0 = 1;
TR0 = 1;
}
/*******************************************************************************
* 函 数 名 : Timer0 //打开总中断 //打开定时器0中断 //启动定时器0
篇三:单片机交通灯程序(汇编语言)
单片机交通灯程序 用p0口德八个引脚控制交通灯闪烁
P1.0——1.2分别代表东西路口的红黄绿灯 P1.3——1.5分别代表南北路口的红黄绿灯
1. 开始时东西红灯亮 南北绿灯亮 (延时10s)
2. 然后东西红灯亮 南北黄灯闪烁3次(亮一秒,灭一秒)
3. 然后东西绿灯亮 南北红灯亮(延时10s)
4. 然后东西黄灯闪烁3次(亮一秒,灭一秒)
5. 返回的第一步继续循环
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:MOV P1,#00H
STATE1:MOV P1,#00100001B
LCALL DELAY10s
MOV R1,#3
CLR P1.5
STATE2:SETB P1.4
LCALL DELAY1s
CLR P1.4
LCALL DELAY1s
DJNZ R1,STATE2
STATE3:MOV P1,#00001100B
LCALL DELAY10s
MOV R2,#3
CLR P1.2
STATE4:SETB P1.1
LCALL DELAY1s
CLR P1.1
LCALL DELAY1s
DJNZ R2,STATE4
LJMP STATE1
DELAY1s:MOV R3,#10
MOV TMOD,#01H
LOOP:MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
LOOP1:JBC TF0,LOOP2
SJMP LOOP1
LOOP2:CLR TR0
DJNZ R3,LOOP
RET
DELAY10s:MOV R4,#100
MOV TMOD,#01H LOOP3:MOV TH0,#3CH MOV TL0,#0B0H SETB TR0
LOOP4:JBC TF0,LOOP5 SJMP LOOP4 LOOP5:CLR TR0
DJNZ R4,LOOP3 RET
END
篇四:51单片机的交通灯c程序
#include
#define uint unsigned int
#define uchar unsigned char
char TAB[11]={0x5f,0x44,0x9d,0xd5,0xc6,0xd3,0xdb,0x45,0xdf,0xd7,0x00}; //数码管状态表
void delay_100ms(uint );
void delay(uint );
void display(uint );
void yejian(void);
int i,k,t,flag=0;
sbit A1=P1^0;
sbit A2=P1^1;
sbit A3=P1^2;
sbit A4=P1^3;
sbit SB=P3^7;
void main () //主程序
{
EA=1;//初始化,开所有中断
ET1=1;//开定时器T1中断
TMOD=0x10;//设置定时器工作方式2
TH1=(65536-50000)/256;//设置定时器初值
TL1=(65536-50000)%256;
while(1)
{
if(SB==0) flag=1;
if(flag==1) yejian();
P2=0x69;
k=8;
while(k>0)//状态1南北红灯,东西绿灯
{
if(SB==0) flag=1;
if(flag==1) yejian();
TR1=1;//开启T1
while(t!=10) display(k); //显示倒计时
if(t==10) t=0;
k--;
TR1=0;//关闭T1
}
if(k==0) k=3;
while(k>=0)//状态2南北红灯,东西绿灯闪烁三次
{
if(SB==0) flag=1;
if(flag==1) yejian();
P2=0x69;
delay_100ms(5); P2=0x41; delay_100ms(5); k--; } k=2;flag=1; while(k>=0)//状态3南北红灯,东西黄灯 { if(SB==0) flag=1; if(flag==1) yejian(); P2=0x7d; delay_100ms(10); k--; } P2=0x96; k=8; while(k>0)//状态4南北绿灯,东西红灯 { if(SB==0) flag=1; if(flag==1) yejian(); TR1=1;//开启T1 while(t!=10) display(k);// 显示倒计时 if(t==10) t=0; k--; TR1=0;//关闭T1 } k=3; while(k>=0)//状态5东西红灯,南北绿灯闪烁三次 { if(SB==0) flag=1; if(flag==1) yejian(); P2=0x96; delay_100ms(5); P2=0x14; delay_100ms(5); k--; } k=2; while(k>=0)//状态6东西红灯,南北黄灯 { if(SB==0) flag=1; if(flag==1) yejian(); P2=0xd7; delay_100ms(10);
k--;
}
}
}
void yejian(void)
{
uint m=k;
while(flag==1)
{
if(SB==1) flag=0;
k=11;
P2=0xff;
delay_100ms(5);
P2=0x00;
delay_100ms(5);
}
k=m;
}
void delay_100ms(uint z)//显示数码管延时100ms {
TR1=1;//开启T1
while(t!=z) display(k);
if(t==z)
{
t=0;
TR1=0;//关闭T1
}
}
void exter0() interrupt 3//定时器中断程序 {
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
t++;
}
void display(uint i)//倒计时显示
{
A1=A2=A3=A4=0;
A4=1;
P0=TAB[i];//显示第一位数值
delay(4);
A4=0;
A3=1;
P0=TAB[i];//显示第二位数值 delay(4);
A3=0;
A2=1;
P0=TAB[i];//显示第三位数值 delay(4);
A2=0;
A1=1;
P0=TAB[i];//显示第四位数值 delay(4);
A1=0;
}
void delay(uint z)//软件延时 {
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--); }
篇五:基于51单片机交通灯程序
/**************************************************************
*初始化、开机自检 * *第一个状态:主干道、支干道均亮红灯5S * *第二个状态:主干道亮绿灯27S、支干道亮红灯 * *第三个状态:主干道黄灯闪烁、支干道红灯闪烁 *
*第四个状态:主干道亮红灯、支干道亮绿灯22S * *第五个状态:主干道红灯闪烁、支干道黄灯闪烁
*返回到第二个状态
*其中外部中断INTO、INT1分别控制主、支干道亮绿灯
**************************************************************/
/* 11.0592MHz晶振*/
#include
#include
#define uchar unsigned char//宏定义
#define uint unsigned int//宏定义
sbit RED_ZHU = P1^0;
sbit YELLOW_ZHU = P1^1;
sbit GREEN_ZHU = P1^2;
sbit RED_ZHI = P1^3;
sbit YELLOW_ZHI = P1^4;
sbit GREEN_ZHI = P1^5;
uint aa, bai,shi,ge,bb;
/*数码管显示0-9*/
uint code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*子函数声明*/
void delay(uint z);
void delay0(uint z);
void display(uint ge,uint shi);
void xtimer0();
void check();
void init1();
void init2();
void init3();
void init4();
void init5();
void xint0();
void xint1();
void GREEN_ZHU_ON(); * * *
void GREEN_ZHI_ON();
/********************************************************* 主函数
*********************************************************/ void main()
{
EA=1;//开中断 EX0=1;//允许外部中断INT0中断 IT0=0;//定义INT0触发方式 PX0=1;//中断优先级高 EX1=1;//允许外部中断INT1中断 IT1=0;//定义INT1触发方式 PX1=1;//中断优先级高 check();//开机自检 while(1) { init2();//第2个状态 init3();//第3个状态 init4();//第4个状态 init5();//第5个状态 init1();//第1个状态
}
}
void init1()//第一个状态:主干道、支干道均亮红灯5S {
int temp; temp=6;//变量赋初值 TMOD=0x01;//定时器T0工作于方式1 TH0=0x4c; TL0=0x00;//定时器赋初值 EA=1;//开中断 ET0=1;//开定时中断 TR0=1;//开定时器T0 while(1) { RED_ZHU=0; RED_ZHI=0; GREEN_ZHU=1; GREEN_ZHI=1; YELLOW_ZHU=1; YELLOW_ZHI=1;
} } if(aa==20)//定时20*50MS=1S { aa=0;//定时完成一次后清0 temp--;//变量自减 if(temp<0) { break; } shi=temp%100/10;//显示十位 ge=temp%10;//显示个位 } display(ge,shi);
void init2()//第二个状态:主干道亮绿灯27S、支干道亮红灯 {
int temp; temp=31;//变量赋初值 TMOD=0x01;//定时器T0工作于方式1 TH0=0x4c; TL0=0x00;//定时器赋初值 EA=1;//开中断 ET0=1;//开定时中断 TR0=1;//开定时器T0 while(1) { RED_ZHU=1; RED_ZHI=0; GREEN_ZHU=0; GREEN_ZHI=1; YELLOW_ZHU=1; YELLOW_ZHI=1; if(aa==20)//定时20*50MS=1S { } aa=0;//定时完成一次后清0 temp--;//变量自减 if(temp==3) { break; } shi=temp%100/10;//显示十位 ge=temp%10;//显示个位
display(ge,shi);
}
}
void init3()//第三个状态:主干道黄灯闪烁、支干道红灯闪烁 {
int temp; temp=4;//变量赋初值 TMOD=0x01;//定时器T0工作于方式1 TH0=0x4c; TL0=0x00;//定时器赋初值 EA=1;//开中断 ET0=1;//开定时中断 TR0=1;//开定时器T0 while(1) { } GREEN_ZHU=1; if(aa==20)//定时20*50MS=1S { } display(ge,shi);; aa=0;//定时完成一次后清0 temp--;//变量自减 YELLOW_ZHU=~YELLOW_ZHU; RED_ZHI=~RED_ZHI; if(temp<0) { break; } shi=temp%100/10;//显示十位 ge=temp%10;//显示个位
}
void init4()//第四个状态:主干道亮红灯、支干道亮绿灯22S {
int temp; temp=26;//变量赋初值 TMOD=0x01;//定时器T0工作于方式1 TH0=0x4c; TL0=0x00;//定时器赋初值 EA=1;//开中断 ET0=1;//开定时中断 TR0=1;//开定时器T0
while(1) { RED_ZHU=0; RED_ZHI=1; YELLOW_ZHU=1;
GREEN_ZHI=0;
if(aa==20)//定时20*50MS=1S
{
aa=0;//定时完成一次后清0 temp--;//变量自减 if(temp==3) { break; } shi=temp%100/10;//显示十位 ge=temp%10;//显示个位
} } } display(ge,shi);
void init5()//第五个状态:主干道红灯闪烁、支干道黄灯闪烁 {
int temp; temp=4;//变量赋初值 TMOD=0x01;//定时器T0工作于方式1 TH0=0x4c; TL0=0x00;//定时器赋初值 EA=1;//开中断 ET0=1;//开定时中断 TR0=1;//开定时器T0 while(1) { RED_ZHI=1; GREEN_ZHU=1; GREEN_ZHI=1; if(aa==20)//定时20*50MS=1S { aa=0;//定时完成一次后清0 temp--;//变量自减 YELLOW_ZHI=~YELLOW_ZHI; RED_ZHU=~RED_ZHU; if(temp<0) {
初中作文