當前位置:編程學習大全網 - 編程語言 - 基於51單片機控制交通燈的電路圖與C語言程序

基於51單片機控制交通燈的電路圖與C語言程序

思路:

紅燈停,綠燈行,黃燈閃爍提示行人紅綠燈即將切換。四個方向各有壹個紅、黃、綠顯示和兩個數碼管。

東西道為人行道(20秒),南北道為車行道(60秒),黃燈延時最後三秒時,閃爍並切換。

三、硬件電路設計

此電中路設計采用AT89C51單片機,74LS47(數碼管驅動)74LS373(數碼管驅動輸出鎖存),8個數碼管顯示其延時值,四個紅、黃、綠指示燈。硬件設計關鍵在於,延時顯示時,要考慮到當個位數字顯示時,要確保十位數字顯示輸出的不變。因此,可加輸出鎖存器。在延時最後三秒時,要讓黃燈進行閃爍,並同時顯示數字(這壹步在軟件設計上很關鍵)。

四、軟件程序(C語言)

以下是整個設計的軟件程序,直接可以編譯成*。Hex代碼。通過以上電路,下載到單片機,可直接運行。

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

//程序名:十字路口交通燈控制

//編寫人:黃庭劍

//初寫時間:2009年1月2日

//程序功能:南北為車行道,延時60秒;東西方向為人行道,延時20秒,且在最後3秒黃燈顯示2秒鐘再實現切換.

//CPU說明:AT89C51型單片機;?24MHZ晶體振蕩器

//完成時間:2009年1月6日

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

#include<stdio.h>

#include<reg51.h>

#include<intrins.h>

sfr?p0=?0x80;

sfr?p1=?0x90;

sfr?p2=?0xA0;

sfr?p3=?0xb0;?//這部分內容其實在“#include<reg51.h>”裏已經有,但裏面定義的必須區分大小寫,在這裏,因為我程序采用的是小寫,reg51.h裏對各個端口與寄存器的定義都是大寫,所以在編譯連接時,會報錯,所以,在本設計程序裏,我只用到了端口,在這裏也就只定義了四個,而沒有去改reg51.h裏面的內容。其實兩者是壹樣的。

sbit?sw?=?p0^0;

sbitOE=P0^6;

sbitLE=P0^7;?//74LS373鎖存器控制端定義

char?display[]={?0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99?};?//p1口的數碼管時間顯示調用,利用74L74BCD碼,8位驅動輸出;

//函數聲明?begin

void?delay1(int?count);

void?delay_long(int?number1,int?number2);

voidpeople_car_drive();

//函數聲明end

//***********************//延時子程序

void?delay1(int?count)

{?int?i;

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

{?;}?

}

void?delay_long(int?number1,int?number2)

{

int?a,b;

for(a=number1;a>0;a--)

{

for(b=number2;b>0;b--)

{?_nop_();?}

}

}

//**********************//延時子程序

voidpeople_car_drive()

{

intp_1=2,i,j=9,p_2=6;//****************//行人通行時,延時20秒

p2=0x09;?//南北紅燈亮

p3=0x24;?//東西綠燈亮

while(p_1-->0)

{?LE=1;

OE=0;

if(p_1==0){OE=1;}//當十位數減到0時,只顯示個位數

p1=display[p_1];

delay1(1000);

LE=0;?

j=9;

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

{?

if(p_1==0&&j==3)break;?//減到3時退出循環,讓其黃燈閃爍顯示

p1=display[j--];

delay_long(16000,2);

if(sw==1)return;

}

}?

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

p2=0x12;?//南北黃燈閃爍三秒,以提醒行人註意

p3=0x12;?

p1=display[3];?

delay_long(8000,1);

p2=0x00;?

p3=0x00;?

delay_long(14000,1);

p2=0x12;

p3=0x12;

p1=display[2];

delay_long(8000,1);

p2=0x00;?

p3=0x00;

delay_long(14000,1);

p2=0x12;

p3=0x12;

p1=display[1];

delay_long(8000,1);

p2=0x00;?

p3=0x00;

delay_long(14000,1);

//*****************以下是車輛通行時延時60秒//

p2=0x24;?//南北綠燈亮

p3=0x09;?//東西紅燈亮

while(p_2-->0)

{?LE=1;

OE=0;

if(p_2==0){OE=1;}//當十位數減到0時,只顯示個位數

p1=display[p_2];

delay1(1000);

LE=0;

j=9;

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

{?

if(p_2==0&&j==3)break;?//減到2時退出循環

p1=display[j--];

delay_long(16000,2);

if(sw==1)return;?

}

}

p2=0x12;//南北黃燈閃爍三秒,以提醒行人註意

p3=0x12;?

p1=display[3];?

delay_long(8000,1);

p2=0x00;?

p3=0x00;?

delay_long(14000,1);

p2=0x12;

p3=0x12;

p1=display[2];

delay_long(8000,1);

p2=0x00;?

p3=0x00;

delay_long(14000,1);

p2=0x12;

p3=0x12;

p1=display[1];

delay_long(8000,1);

p2=0x00;?

p3=0x00;

delay_long(14000,1);//南北黃燈閃爍三秒完畢

}

void?main()//主函數入口處

{

p0=0x01;

p1=0x00;

p2=0x00;

p3=0x00;//初始化各端口

{?while(1)?

{

if(sw==0)

{?people_car_drive();}

else

{

p2=0x00;

p3=0x00;//關閉所有交通燈

}

}

}

}

詳情訪問:/hjiannew/

  • 上一篇:我是女生,馬上要上大學學阿拉伯語了,都說阿語很難,而且女生不吃香。您能具體介紹壹下嗎
  • 下一篇:個人創新思維的障礙
  • copyright 2024編程學習大全網