基于51单片机的交通灯设计

目 录

................................................................................................................... 1 . ................................................................................................................... 1 . ................................................................................................................... 1 . 设计相关知识 ........................................................................................................... 1 硬件设计 ............................................................................................................................ 1 软件应用 ............................................................................................................................ 2 . ............................................................................................................... 3 . ................................................................................................................. 14 . ................................................................................................................. 14 . ................................................................................................................. 16 . ................................................................................................................. 16

1.设计题目: 基于51单片机的交通灯设计

2.设计环境

1.装有 Windows 系统、keil C 51 v6.12中文完全版和proteus7.5仿真环境的PC 机一台。

2.AT89C51单片机最小实现电路及配套发光二极管电路。

3.设计要求

1.编程要求:主程序利用 C 语言编写。

2.实现功能:使用AT89C51单片机控制 4个方向的交通灯(红﹑黄﹑绿)并用数码管显示其时间。

3. 实验现象:

状态一:主干道、支干道均亮红灯5秒;

状态二:主干道亮绿灯30秒、支干道亮红灯;

状态三:主干道绿灯闪3次转亮黄灯、支干道亮红灯3秒;

状态四:主干道亮红灯、支干道亮绿灯25秒;

状态五:主干道亮红灯、支干道绿灯闪3次转亮黄灯3秒;

返回到第二个状态。

4.设计相关知识

4.1 硬件设计

1. AT89C51简介:

AT89C51是一种带4K字节闪存可编程可擦除只读存储器的低电压、高性能CMOS 8位微处理器。它是一种带2K字节闪存可编程可擦除只读存储器的单片机。AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

2. 2位8段数码管工作原理:

2位8段数码管电路采用“共阴”连接,阴极公共端(COM)

由晶体管推动。如图4-3所示:

段码和位码,段码即段选信号 SEG,它负责数码管显示

的内容,图中 a~g、dp组成的数据(a 为最低位,dp 为最

高位)就是段码。位码即位选信号 DIG,它决定哪个数码管

工作,哪个数码管不工作。当需要某一位数码管显示数字时,只需要先选中这位数码管的位信号,再给显示数字的段码。

4.2 软件应用

1. Proteus7.5简介:

Proteus软件不仅具有EDA工具软件的仿真功能,还能仿真单片机及外围器件Proteus从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等。在编译方面,它支持IAR、Keil和MPLAB等多种编译器。

2. Keil C51开发系统简介:

Keil C51是51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。 Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面,生成的目标代码效率非常之高,多数语句生成的汇编代码紧凑,容易理解。在开发大型软件时更能体现其高级语言的优势。

基于51单片机的交通灯设计

5.主程序设计

/*********11.0952M晶振***********************************/ #include<reg51.h>//头文件

#include<intrins.h>//头文件

#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

table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; /*子函数声明*/

void delay(uint z);

void delay0(uint z);

//void init(uint a);

void display(uint ge,uint shi);

void xtimer0();

void init1();

void init2();

void init3();

code

void init4();

void init5();

void xint1();

void xint0();

void LED_ON();

void LED_OFF();

/**********************主函数************************/ void main()

{

P0=0XFF; P1=0xFF;

P2=0xFF;

EA=1;//打开外部中断 EX1=1;//允许外部中断1中断 IT1=0;//INT0为沿触发方式

init1();

while(1)

{

init2();//第2个状态 init3(); //第3个状态 init4(); //第4个状态 init5();//第5个状态

}

}

void init1()//第一个状态:主干道、支干道均亮红灯5S

{

uint temp; temp=6;//变量赋初值 TMOD=0x01;//定时器0工作于方式1 TH0=0x4c; TL0=0x00;//定时器赋初值 EA=1;//开外部中断 ET0=1;//开定时中断 TR0=1;//开定时器0 while(1) { RED_ZHU=0; //第一个状态主干道、支干道均亮红灯5S

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--;//变量自增 //delay(10); if(temp>250)//定时100S { temp=6;//变量清0

} } } } break; shi=temp%100/10;//显示十位 ge=temp%10;//显示个位 display(ge,shi);

void init2()//第二个状态:主干道亮绿灯30S、支干道亮红灯 {

uint temp; temp=31;//变量赋初值 TMOD=0x01;//定时器0工作于方式1 TH0=0x4c; TL0=0x00;//定时器赋初值 EA=1;//开外部中断 ET0=1;//开定时中断 TR0=1;//开定时器0 while(1) { RED_ZHU=1; RED_ZHI=0; GREEN_ZHU=0; GREEN_ZHI=1; YELLOW_ZHU=1;//第二个状态:主干道亮绿灯30S、支干道亮红灯 YELLOW_ZHI=1;

}

} if(aa==20)//定时20*50MS=1S { } display(ge,shi); aa=0;//定时完成一次后清0 temp--;//变量自增 if(temp==3)//定时100S { } shi=temp%100/10;//显示十位 ge=temp%10;//显示个位 temp=30;//变量清0 break;

void init3() //第三个状态:主干道绿灯闪3次转亮黄灯、支干道亮红灯3S {

uint temp; temp=4;//变量赋初值 TMOD=0x01;//定时器0工作于方式1 TH0=0x4c; TL0=0x00;//定时器赋初值 EA=1;//开外部中断 ET0=1;//开定时中断 TR0=1;//开定时器0

}

while(1) { } RED_ZHI=0; GREEN_ZHU=1; //YELLOW_ZHU=~YELLOW_ZHU; if(aa==20)//定时20*50MS=1S { } display(ge,shi);; aa=0;//定时完成一次后清0 temp--;//变量自增 YELLOW_ZHU=~YELLOW_ZHU; if(temp>200)//定时100S { } shi=temp%100/10;//显示十位 ge=temp%10;//显示个位 temp=4;//变量清0 break;

void init4()//第四个状态:主干道亮红灯、支干道亮绿灯25S {

uint temp; temp=26;//变量赋初值

TMOD=0x01;//定时器0工作于方式1 TH0=0x4c; TL0=0x00;//定时器赋初值 EA=1;//开外部中断 ET0=1;//开定时中断 TR0=1;//开定时器0 while(1) { RED_ZHU=0; RED_ZHI=1; YELLOW_ZHU=1;//第一个状态主干道、支干道均亮红灯5S

GREEN_ZHI=0;

if(aa==20)//定时20*50MS=1S

{

}

display(ge,shi); aa=0;//定时完成一次后清0 temp--;//变量自增 if(temp==3)//定时100S { } shi=temp%100/10;//显示十位 ge=temp%10;//显示个位 temp=25;//变量清0 break;

}

}

void init5()//第五个状态:主干道亮红灯、支干道绿灯闪3次转亮黄灯3S {

uint temp; temp=4;//变量赋初值 TMOD=0x01;//定时器0工作于方式1 TH0=0x4c; TL0=0x00;//定时器赋初值 EA=1;//开外部中断 ET0=1;//开定时中断 TR0=1;//开定时器0 while(1) { RED_ZHI=1; RED_ZHU=0; GREEN_ZHU=1; GREEN_ZHI=1; //YELLOW_ZHI=~YELLOW_ZHI; if(aa==20)//定时20*50MS=1S { aa=0;//定时完成一次后清0 temp--;//变量自增 YELLOW_ZHI=~YELLOW_ZHI; if(temp>200)//定时100S {

} } } temp=4;//变量清0 break; shi=temp%100/10;//显示十位 ge=temp%10;//显示个位 display(ge,shi);

}

/*显示子函数*/

void display(uint ge,uint shi)

{

}

void xint0() interrupt 2 //外部中断1,这里用2是INT1的优先级为0 {

}

void LED_ON()//外部中断0显示子程序

{

P0=0xfd; P2=table[shi];//显示十位 delay0(5); P0=0xfe; P2=table[ge];//显示个位 delay0(5); LED_ON();

RED_ZHI=0; RED_ZHU=0; GREEN_ZHI=1; GREEN_ZHU=1;

YELLOW_ZHI=1;

YELLOW_ZHU=1;

delay0(1000);

return ;

}

/*定时中断子函数*/

void xtimer0() interrupt 1 {

}

/*延时子函数*/

void delay0(uint z) {

}

TH0=0x4c; TL0=0x00; aa++; uint i,j; for(i=0;i<z;i++) for(j=0;j<110;j++);

/******** 500ms延时函数 晶振:11.0592MHz *******/ void delay(unsigned char j)

{

unsigned char k;

unsigned int i;

for(;j>0;j--)

{

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

{

for(k=180;k>0;k--);

}

}

}

6.系统实现

1. 使用keil C 51编写程序;

2. 将编好的程序“.C”文件用Keil C 51转换成“.hex”文件;

3. 画出设计系统仿真图;

3. 打开proteus7.5,将画好的仿真图载入,鼠标右击图中的51单片机选择“编辑属性”,在Program File中载入之前的“.hex”文件,再点击“调试”中的“开始”或点击软件左下角的“”,即仿真开始运行;

4. 观察运行现象是否与设计结果相符;

5. 确定设计后,按图焊接硬件电路;

6. 测试硬件电路。

7.仿真运行

基于51单片机的交通灯设计

基于51单片机的交通灯设计

基于51单片机的交通灯设计

8.设计心得

用单片机实现交通灯控制,可以使我们的生活方便快捷。这项看起来不需要多少技术的工作却是非常需要耐心和精力,几天的设计对我们来说的意义,不仅仅是让我们把所学的理论知识与实践相结合起来,还提高了我们的实际动手能力和独立思考的能力,更重要的是团队合作,虽然我们这次设计仓促,制作有些简单,但我们得到了很多远大于设计的东西!

9.参考文献

单片机原理及应用

51单片机原理及应用--基于Keil C与Proteus

Proteus 7.5 Professional 51单片机入门教程

百度文库:AT89C51中文资料

Proteus仿真论坛 /bbs.php

相关推荐