天天看點

基于MCS-51的交通燈程式設計(c語言控制直行左轉)

一、說明:本程式與之前例程不同,采用c語言完成,實作四個方向的直走和左轉車輛控制,采用51定時器精确計時

二、原理圖:

基于MCS-51的交通燈程式設計(c語言控制直行左轉)
基于MCS-51的交通燈程式設計(c語言控制直行左轉)
基于MCS-51的交通燈程式設計(c語言控制直行左轉)

三、基本設計思想:

1、硬體部分。七段數位管顯示時間,采用共陽數位管,與P0口連接配接。根據51單片機的特性,P0口作為輸出時,若要輸出1,則必須外接上拉電阻。東西方向有直行紅黃綠燈,左轉紅黃綠燈,共6個接口,分别接在P1.0~P1.5,顯示時間的2位數位管位選開關接P1.6,P1.7。南北方向有直行紅黃綠燈,左轉紅黃綠燈,共6個接口,分别接在P2.0~P2.5,顯示時間的2位數位管位選開關接P2.6,P2.7。

2、軟體部分。直行綠燈亮27s,數位管從30s倒計時,接着直行黃燈亮3秒,數位管閃爍倒計時3s。左轉方向綠燈亮17s,數位管從20s倒計時,接着左轉黃燈亮3s,數位管閃爍倒計時3s。開機東西直行綠燈27s,直行黃燈3s,左轉綠燈17s,左轉黃燈3s,此時南北方向一直紅燈,倒計時50s。接着南北直行綠燈27s,直行黃燈3s,左轉綠燈17s,左轉黃燈3s,此時東西方向一直紅燈,倒計時50s。

四、源代碼:

#include

#define uint unsigned int

#define uchar unsigned char

#define OFF 0 //定義燈泡開關

#define ON 1

sbit ew_zx_red = P1^0;   //東西直行紅黃綠

sbit ew_zx_yellow = P1^1;

sbit ew_zx_green = P1^2;

sbit ew_zz_red = P1^3;   //東西左轉紅黃綠

sbit ew_zz_yellow = P1^4;

sbit ew_zz_green = P1^5;

sbit sn_zx_red = P2^0;   //南北直行紅黃綠

sbit sn_zx_yellow = P2^1;

sbit sn_zx_green = P2^2;

sbit sn_zz_red = P2^3;   //南北左轉紅黃綠

sbit sn_zz_yellow = P2^4;

sbit sn_zz_green = P2^5;

sbit seg_1 = P1^6;  //東西數位管位選開關

sbit seg_2 = P1^7;

sbit seg_3 = P2^6;  //南北數位管位選開關

sbit seg_4 = P2^7;

int time = 0; //計時器

int count = 0;

unsigned char SEG_CA[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};

unsigned char SEG_CC[10] = {0x3f, 0x06, 0x5b, 0x1f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};

void delay()

{

int i;

for(i = 0; i

}

void display_ew(unsigned int num)  //東西數字顯示

   P0 = SEG_CA[num/10];   //點亮數字高位

    seg_1 = ON;

delay();

    seg_1 = OFF;

    P0 = SEG_CA[num%10];   //點亮數字低位

seg_2 = ON;

    seg_2 = OFF;

void display_sn(unsigned int num)  //南北數字顯示

   P0 = SEG_CA[num/10];  //點亮數字高位

    seg_3 = ON;

    seg_3 = OFF;

    P0 = SEG_CA[num%10];  //點亮數字低位

seg_4 = ON;

    seg_4 = OFF;

void display_ew_shan(unsigned int num)  //東西3s 倒計時閃爍顯示

if(count

display_ew(num);

else

seg_1 = OFF;

seg_2 = OFF;

void display_sn_shan(unsigned int num)  //南北3s倒計時閃爍顯示

display_sn(num);

seg_3 = OFF;

seg_4 = OFF;

void init()

P0 = 0x00;

P1 = 0x00;

P2 = 0x00;

EA = 0; //關總中斷

ET0 = 1; //開定時器0中斷

TMOD = 0x02; //定時器0工作方式2

TL0 = 6; //定時250us

TH0 = 6;

EA = 1;   //開總中斷

TR0 = 1;  //開始定時

void main()

    init();

    while(1)

    {

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

開始東西直行綠燈亮,東西左轉紅燈亮27s,顯示綠燈倒計時30s

南北直行、左轉紅燈亮50s,顯示紅燈倒計時50s

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

  while(time%100

  {

  ew_zx_green = ON;  //東西直行綠燈亮,顯示27s

  ew_zx_yellow = OFF;

  ew_zx_red = OFF;

  display_ew(30 - time);

  ew_zz_red = ON;  //東西左轉紅燈亮

  ew_zz_green = OFF;

  ew_zz_yellow = OFF;

  sn_zx_red = ON;  //南北直行紅燈亮,顯示時間50s

  sn_zx_yellow = OFF;

  sn_zx_green = OFF;

  display_sn(50 - time);

  sn_zz_red = ON;  //南北左轉紅燈亮,顯示時間50s

  sn_zz_yellow = OFF;

  }

東西直行黃燈亮3s, 倒計時開始閃爍

東西左轉,南北方向不變

  while(time%100 >= 27 && time%100

  ew_zx_yellow = ON;  //東西直行黃燈亮 ,顯示時間3s

  ew_zx_green = OFF;

  display_ew_shan(30 - time);

東西左轉綠燈亮17s,直行紅燈亮 ,顯示綠燈倒計時20s

南北方向不變

  while(time%100 >= 30 && time%100

  ew_zz_green = ON; //東西左轉綠燈亮,顯示時間17s

  ew_zz_red = OFF;

  display_ew(50-time);

  ew_zx_red = ON;  //東西直行紅燈亮

  ew_zx_yellow =OFF;

  display_sn(50-time);  //南北繼續顯示倒計時

  }

東西左轉黃燈亮3s, 倒計時開始閃爍 3s

東西直行,南北方向不變

  while(time%100 >= 47 && time%100

  ew_zz_yellow = ON; //東西左轉黃燈亮,顯示時間3s

  display_ew_shan(50-time);

東西左轉紅燈亮50s,直行不變,顯示倒計時50s

南北直行綠燈亮27,左轉不變,顯示綠燈倒計時30s

  while(time%100 >=50 && time%100

sn_zx_green = ON; //南北直行綠燈亮,顯示時間27s

sn_zx_yellow = OFF;

sn_zx_red = OFF;

display_sn(80 - time);

ew_zz_red = ON;   //東西左轉紅燈亮,顯示時間50s

ew_zz_yellow = OFF;

ew_zz_green = OFF;

display_ew(100 - time);

南北直行黃燈亮3s,左轉不變,顯示黃燈閃爍倒計時3s

東西不變

while(time%100 >= 77 && time%100

sn_zx_yellow = ON; //南北直行黃燈亮,顯示時間3s

sn_zx_green = OFF;

display_sn_shan(80 - time);

南北左轉綠燈亮17s,直行不變,顯示綠燈倒計時20s

while(time%100 >=80 && time%100

sn_zz_green = ON;  //南北左轉綠燈亮, 顯示17s

sn_zz_red = OFF;

sn_zz_yellow = OFF;

display_sn(100-time);

sn_zx_red = ON; //南北直行紅燈亮

display_ew(100 - time); //東西繼續倒計時

南北左轉黃燈亮17s,直行不變,顯示黃燈閃爍倒計時3s

while(time%100 >= 97 && time

sn_zz_yellow = ON; //南北左轉黃燈亮, 顯示時間3s

sn_zz_green = OFF;

display_sn_shan(100 - time);

   }

void timer0() interrupt 1

count++;

if(count == 4000)

time++;

count = 0;

if(time > 100)

time = 0;

上一篇: Emoji 笑臉
下一篇: Emoji 膚色

繼續閱讀