基于单片机的交通灯系统设计

发布者:平和的心态最新更新时间:2022-04-02 来源: eefocus关键字:单片机  交通灯系统 手机看文章 扫描二维码
随时随地手机看文章

#include

#define uchar unsigned char

#define uint unsigned int

 

sbit FMQ=P3^4;

sbit QR=P2^7;

sbit QY=P2^6;

sbit QG=P2^5;

sbit HR=P2^7;

sbit HY=P2^6;

sbit HG=P2^5;

sbit ZR=P2^4;

sbit ZY=P2^3;

sbit ZG=P2^2;

sbit YR=P2^4;

sbit YY=P2^3;

sbit YG=P2^2;

sbit SWITCH1=P1^0;

sbit SWITCH2=P1^1;

sbit SWITCH3=P1^2;

sbit SWITCH4=P1^3;

sbit P3_2=P3^2;

sbit P3_3=P3^3;

uchar DAT1,DAT2;    //显示时间变量

uchar DISP1[2]={0,0};    //显示缓冲区1,南北

uchar DISP2[2]={0,0};    //显示缓冲区2,东西

uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};

 

void DISPCLK1(uchar i);

void DISPCLK2(uchar i);

 

void DEL1MS(uint z)

{

    uint x,y;

for(x=0;x    for(y=0;y<123;y++);

}

 

void main()

{

     uchar i,j;

TCON=0x5;

PX1=1;

EX0=1;

EX1=1;

EA=1;

 

P0=0xFF;

P1=0xFF;

P2=0xFF;

P3=0xFF;

while(1)

{

    P1=0xFF;

P2=0xFF;

DAT1=25;

DAT2=25;

QG=0;

HG=0;

ZR=0;

YR=0;

 

for(i=0;i<20;i++)

{

   for(j=0;j<200;j++)

   {

        DISPCLK1(DAT1);

DISPCLK2(DAT2);

DEL1MS(25); //延时5毫秒

   }

   FMQ=1;

   DAT1=DAT1-1;

   DAT2=DAT2-1;

}

P1=0xFF;

P2=0xFF;

ZY=0;

YY=0;

QY=0;

HY=0;

 

for(i = 0; i < 5; i++)

{

for(j = 0; j < 200; j++)

{

DISPCLK1(DAT1);//显示

DISPCLK2(DAT2);//显示

DEL1MS(25); //延时3毫秒

}

QY = ~QY; //南北向黄灯亮

HY = ~HY;

ZY = ~ZY; //东西方向黄灯亮

YY = ~YY;  

FMQ = ~FMQ; //黄灯时蜂鸣器叫一声

DAT1 = DAT1 - 1;//完成数字的减1操作,调整好的数字送显存  

DAT2 = DAT2 - 1;//完成数字的减1操作,调整好的数字送显存  

P1 = 0xff;

P2 = 0xff;  

DAT1 = 15; //汇编0x20

DAT2 = 15; //汇编0x20

ZG = 0; //东西方向绿灯亮

YG = 0;

QR = 0; //南北方向红灯亮

HR = 0;

 

for(i = 0; i < 10; i++)//执行15秒

{

for(j = 0; j < 200; j++)

{

DISPCLK1(DAT1);//显示

DISPCLK2(DAT2);//显示

DEL1MS(25); //延时3毫秒  

}

FMQ = 1; //蜂鸣器响

DAT1 = DAT1 - 1;//完成数字的减1操作,调整好的数字送显存 

DAT2 = DAT2 - 1;//完成数字的减1操作,调整好的数字送显存 

}

 

//最后5秒黄灯闪

P1 = 0xff;

P2 = 0xff; //关所有的灯

ZY = 0; //黄灯亮

YY = 0;

QY = 0;

HY = 0;

 

for(i = 0; i < 5; i++)

{

for(j = 0; j < 200; j++)

{

DISPCLK1(DAT1);//显示

DISPCLK2(DAT2);//显示

DEL1MS(25); //延时3毫秒    

}

QY = ~QY; //南北向黄灯亮

HY = ~HY;

ZY = ~ZY; //东西方向黄灯亮

YY = ~YY;  

FMQ = ~FMQ; //黄灯时蜂鸣器叫一声

DAT1 = DAT1 - 1;//完成数字的减1操作 ,调整好的数字送显存  

DAT2 = DAT2 - 1;//完成数字的减1操作 ,调整好的数字送显存  

}

}

 

void D_X() interrupt 0 using 0

{

    uchar i,j,temp0,temp1,temp2,temp3;

EA=0;

P3_2=1;

while(!P3_2);

temp0=DAT1;

temp1=DAT2;

temp2=P1;

temp3=P2;

 

DAT1=60;

DAT2=60;

P1=0xff;

P2=0xff;

ZG=0;

YG=0;

QR=0;

HR=0;

 

for(i=0;i<60;i++)

{

    for(j=0;j<200;j++)

{

    DISPCLK1(DAT1);

DISPCLK2(DAT2);

DEL1MS(25);

}

DAT1=DAT1-1;

DAT2=DAT2-1;

}

DAT1=temp0;

DAT2=temp1;

P1=temp2;

P2=temp3;

 

EA=1;

}

 

void N_B() interrupt 2 using 0

{

    uchar i,j,temp0,temp1,temp2,temp3;

EA=0;

P3_3=1;

while(!P3_3);

temp0=DAT1;

temp1=DAT2;

temp2=P1;

temp3=P2;

 

DAT1=60;

DAT2=60;

P1=0xff;

P2=0xff;

ZR=0;

YR=0;

QG=0;

HG=0;

for(i=0;i<60;i++)

{

    for(j=0;j<200;j++)

{

    DISPCLK1(DAT1);

DISPCLK2(DAT2);

DEL1MS(25);

}

DAT1=DAT1-1;

DAT2=DAT2-1;

}

DAT1=temp0;

DAT2=temp1;

P1=temp2;

P2=temp3;

 

EA=1;

}

 

void DISPCLK1(uchar i)

{

    DISP1[0]=i%10;

DISP1[1]=i/10;

P0=table[DISP1[0]];

SWITCH2=0;

DEL1MS(2);

SWITCH2=1;

 

P0=table[DISP1[1]];

SWITCH1=0;

DEL1MS(2);

SWITCH1=1;

}

 

void DISPCLK2(uchar i)

{

    DISP2[0]=i%10;

DISP2[1]=i/10;

P0=table[DISP2[0]];

SWITCH4=0;

DEL1MS(2);

SWITCH4=1;

 

P0=table[DISP2[1]];

SWITCH3=0;

DEL1MS(2);

SWITCH3=1;

}

关键字:单片机  交通灯系统 引用地址:基于单片机的交通灯系统设计

上一篇:基于单片机的温湿度检测系统
下一篇:基于单片机的智能照明控制系统设计

推荐阅读最新更新时间:2024-10-13 10:15

单片机控制12864液晶显示屏静态显示
显示屏幕说明图: 仿真电路图: 仿真结果展示: 汉字取模软件设置: (取模软件下载链接在文章结尾) C语言程序代码: #include reg51.h #define LCDLCDDisp_Off 0x3e// 程序中 的 LCD_OFF (LCD 断开/不亮) 的值 是 16进制 0x3E #define LCDLCDDisp_On 0x3f// 程序中 的 LCD_ON (LCD 合上/亮) 的值 是 16进制 0x3F #define Page_Add 0xb8// 页地址 #define LCDCol_Add 0x40// 列地址 #define Start_Line 0
[单片机]
<font color='red'>单片机</font>控制12864液晶显示屏静态显示
凌阳16位单片机之定时器中断
首先先计算好想要的时间,基本上就是 *P_TIMEA_Data = 0xffff-你想要的时间频率。然后*P_INT_Ctrl = 允许相应的中断允许接受中断,然后__asm(); 然后等到溢出的时候进入相应的中断, 说一下*P_INT_Ctrl的意义,他有两个操作,一个是读操作一个写操作,刚开始可能只是看书理解有点难,其实读操作和写操作就是两码事,就像你命令一个人拿东西一样,第一次规定了怎么拿但是下一次拿的时候就不用再告诉怎么拿了,之所以叫做读操作是因为不用写(/这句话看似是废话但是想想还是可以的)即每次清除的不是写操作而读操作, *P_TimerA_Ctrl代表开启什么频率的中断,*P_TimerA_Data 是初始到溢出的
[单片机]
基于51单片机的TLC5615电压发生器
//本程序是基于51单片机的,可由矩阵键盘设置TLC5615 ad芯片要输出的电压值, //并由1602液晶屏显示输入的电压值. //完整代码下载: http://www.51hei.com/f/TLC56151602.rar //此程序测试成功,51hei版权所有,如果需要应用到你的项目中只需更改端口即可 #include reg51.h #include intrins.h //_nop_();延时函数用 #define uchar unsigned char #define uint unsigned int sbit CLK=P2^5; //三线控制 sbit DIN=P2^4; sbit CS=P2
[单片机]
基于单片机的OLED显示器的应用
1 前言 有机发光显示器(Organic Light Emitting Display,OLED)是一种新型发光和显示器件。OLED实质上是一个薄膜器件,它的发光层是有机材料层,当有电流通过时,这些有机材料就会发光。与传统的液晶显示器(LCD)相比,除了无需背光源外,OLED显示屏可实现低于1mm的厚度,这为实现软体显示提供了可能,此外可视角度更大,亮度更高,色彩更加丰富。OLED可广泛应用于手持设备、通信终端、仪器仪表等领域。 2 模块结构 下面以维信诺VGG12864E-S001模块为例,介绍OLED的模块结构。 2.1 模块框图 VGG12864E-S001 模块的OLED 显示屏为128
[单片机]
基于<font color='red'>单片机</font>的OLED显示器的应用
功耗测量辅助微控制器的选择
  当设计工程师为低功耗应用选择 微控制器 时,芯片厂商的数据手册所提供的帮助是有限的。手册不能提供业界标准的功耗评价方法,也不能说明像高速缓存( Cache )和集成浮点运算单元等功能部件是怎样影响能量消耗和性能的。   当工程师尝试比较包含了片上系统(System-on-chip)的处理器内核时,如何解释这些部件或单元带来的好处成了一个难题。供应商也用芯片的典型消耗电流数值来衡量他们的微控制器,但这种测量几乎不能说明应用运行不同程序的能量消耗。为了解决这个问题,嵌入式处理器基准协会(Embedded Processor Benchmark Consortium——EEMBC)提出了一种在特定载荷下测量能量消耗的方法。本文中
[测试测量]
功耗测量辅助<font color='red'>微控制器</font>的选择
单片机与TA8435的步进电机细分控制方法
1 步进电机 步进电动机是纯粹的数字控制电动机,它将电脉冲信号转变成角位移,即给一个脉冲,步进电机就转一个角度,因此非常适合单片机控制。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,电机则转过一个步距角,同时步进电机只有周期性的误差而无累积误差,精度高。 步进电动机有如下特点: ①步进电动机的角位移与输入脉冲数严格成正比。因此,当它转一圈后,没有累计误差,具有良好的跟随性。 ②由步进电动机与驱动电路组成的开环数控系统,既简单、廉价,叉非常可靠。同时,它也可以与角度反馈环节组成高性能的闭环数控系统。 ③步进电动机的动态响应快,易于启停、正反
[单片机]
<font color='red'>单片机</font>与TA8435的步进电机细分控制方法
微控制器控制模拟移相器
移相器广泛应用于各种电路,但由于在 放大器 中的偏差以及电容公差,通常很难实现电路精确控制所需的精确移相。图1中的电路利用AD5227 64步递增/递减数字电位器IC3可以控制输入到输出的移相,并替换电阻值。计算输出中心频率的公式为:FCENTER=1/(2×π×R×C)。AD5227可以取各种不同范围的电阻值。该例子中的电阻为10kΩ。通过步进64个点,720kHz输入正弦波可以从0度到360度循环若干次。AD5227作为一个电位器,A和B为两端,W为擦拭器。   该例子中应用了具有20MHz晶振频率的PIC16F84微控制器IC2。该微控制器在理论上的潜在性能为5MIPS,可在锁相环(PLL)电路中用于多种用途。也可用
[单片机]
<font color='red'>微控制器</font>控制模拟移相器
用AVR单片机模拟的串口程序
在一些应用中 , 经常要用到双串口,但是一般单片机只提供一个串口,其实完全可以用普通I/O口模拟一个串口。以下的程序是我编写的模拟串口程序,程序中使用了单片机的定时器0,和INT0中断。数据的发送和接收由中断程序自动进行。程序已经过AVR仿真器仿真和实际烧片使用,证明可靠。有一点需要说明的是,此模拟的串口为半双工方式。 主程序中,单片机将标准串口设置为115200bps,将模拟串口设置为19200bps。单片机将标准串口收到的数据从模拟串口发送出去,将模拟串口接收到的数据从标准串口发送回来。 ;*****************************************************************
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved