单片机控制交通灯-C语言实现

博客分类: code

单片机控制交通灯-C语言实现

单片机--交通灯

 

一、实验目的

1、学习在单片机系统中扩展简单1/0接口的方法;

2、学习数据输出程序的设计方法;

 

二、实验内容

1、以741S276做为输出口,控制十二个发光二极管的亮灭,模拟交通灯控制;

2、观察发光二极管的状态是否满足实验要求。

实验说明:

本实验是模拟交通灯控制,故实验前首先应该了解交通灯的亮灭规律。

设某十字路口24为南、北方向,13为东、西方向。初始状态为四个路口的红灯全亮。然后,东、西路口绿灯亮,南、北路口红灯亮,东、西路口通车。延迟一段时间后,东、西路口绿灯灭,黄灯开始闪烁。黄灯闪烁若干次后,东、西路口红灯亮,南、北路口绿灯亮,南、北方向通车。延迟一段时间后,南、北路口绿灯灭,黄灯闪烁。黄灯闪烁若干次后,再切换到东、西路口方向。······

本实验所用发光二极管为共阳极,由于阴极处接有与非门,故输出高电平亮。

三、实验参考电路图

 

四、实验程序框图

 

五、实验步骤

1.        连接好复位电路,并与单片机U0RST端相连;

 

2.        连接好晶振电路,并与单片机U0XTAL1XTAL2端相连;

 

3.        U1(74LS273),U2(74LS273)D0~D7与单片机U0P1.0~P1.7相连;

 

4.        将或非门U4:A(74LS02)的输入端一端接地, 另一端与单片机U0P2.6/A14相连,输出端与U1MRCLK端相连;

 

5.        将或非门U6:A(74LS02)的输入端一端接地, 另一端与单片机U0P2.7/A15相连,输出端与U2MRCLK端相连;

 

6.        将非门U374LS04,U774LS04)的输入端与U1,U2Q0~Q7相连, 输出端与对应的发光二极管的阴极相连

 

7.        将发光二极管的阳极与限流电阻相连, 再与高电平相连。

 

六、程序清单


#include "reg51.h"

#include <intrins.h>

 

#define UCH unsigned char

 

// delay for (time) s

void delay(UCH time);

 

// send data to the first 74LS273

void senddata_1();

 

// send data to the second 74LS273

void senddata_2();

 

// all red on, others off

// time : this stage lasts for (time) seconds

void allred(UCH time);

 

// west and east are passable

// west and east : green on, others off

// north and south : red on others off

// time : this stage lasts for (time) seconds

void we_passable(UCH time);

 

// north and south are passable

// west and east : red on, others off

// north and south : green on, others off

// time : this stage lasts for (time) seconds

void ns_passable(UCH time);

 

// west and east are waiting for red on

// west and east : yellow flicker, others off

// flicker every 2 seconds (yellow on for 1s, yellow off for 1s)

// north and south : red on, others off

// time : this stage lasts for (time * 2) seconds

void we_wait(UCH time);

 

// north and south are waiting for red on

// north and south : yellow flicker, others off

// flicker every 2 seconds (yellow on for 1s, yellow off for 1s)

// west and east : red on, others off

// time : this stage lasts for (time *) seconds

void ns_wait(UCH time);

 

sbit sw1 = P2 ^ 6;    //use P2.6 to contral the first 74LS273

sbit sw2 = P2 ^ 7;    //use P2.7 to contral the second 74LS273

 

void main() {

    //start : all red on

    allred(1);

    // loop on

    while (1) {

        // 1st

        // west and east, green on

        // north and south, red on

        we_passable(30);

 

        //2st

        // west and east, green off, yellow flicker

        we_wait(3);

 

        //3rd

        //west and east, red on

        //north and south, red off, green on

        ns_passable(30);

 

        //4th

        //north and south, green off, yellow flicker

        ns_wait(3);

    }

}

// send data to the first 74LS273

void senddata_1() {

    sw1 = 1;

    sw1 = 0;

}

// send data to the second 74LS273

void senddata_2() {

    sw2 = 1;

    sw2 = 0;

}

 

//delay time s

void delay(UCH time) {

    UCH i, j, k;

    for (; time > 0; time--) {

        for (k = 10; k > 0; k--) {

            for (i = 250; i > 0; i--) {

                for (j = 133; j > 0; j--) {

                    _nop_();

                }

            }

        }

    }

}

void allred(UCH time) {

    P1 = 0x49;

    senddata_1();

    P1 = 0x02;

    senddata_2();

    delay(time);

}

 

void we_passable(UCH time) {

    P1 = 0x0C;

    senddata_1();

    P1 = 0x03;

    senddata_2();

    delay(time);

}

 

void ns_passable(UCH time) {

    P1 = 0x61;

    senddata_1();

    P1 = 0x08;

    senddata_2();

    delay(time);

}

 

void we_wait(UCH time) {

    for (; time > 0; time--) {

        P1 = 0x8A;

        senddata_1();

        P1 = 0x02;

        senddata_2();

        delay(1);

 

        P1 = 0x08;

        senddata_1();

        P1 = 0x02;

        senddata_2();

        delay(1);

    }

}

 

void ns_wait(UCH time) {

    for (; time > 0; time--) {

        P1 = 0x51;

        senddata_1();

        P1 = 0x04;

        senddata_2();

        delay(1);

 

        P1 = 0x41;

        senddata_1();

        P1 = 0x00;

        senddata_2();

        delay(1);

    }

}


 

 

七、实验分析

1.  锁存器74LS273的工作机制为:当MR脚为低电平时,无论CLK脚有无脉冲,数据端(D端)是高或低电平,输出端(Q端)都为低电平;仅当MR脚为高电平时,“D”端的数据在脉冲的上升期间被传送到“Q”端, 如下表所示:

 

Tabel 1.truth table of 74LS273

MR

CLK

Di

Qi

L

X

X

L

H

H

H

H

L

L

i = 0~7

L – low logic level, H – high logic level

X – immaterial

 

故而在该电路中,P2.6/A14P2.7/A15)由高电平变为低电平时,P1脚的状态输出至U1U2)的Q端。

 

2.  本实验中采取软件延时,即在循环中不断发出NOP指令以达到延时的目的。在C语言中使用软件计时,为提高精准度,需要注意:

a)   循环控制变量类型为unsigned char

b)   使用自减循环。