當前位置:首頁 » 編程語言 » 51單片機交通燈設計c語言
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

51單片機交通燈設計c語言

發布時間: 2022-11-13 03:52:46

① 基於51單片機的紅綠燈設計

/*****************************************************
十字路口交通燈控制 C 程序

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

#defineucharunsigned char
#defineuintunsigned int
#include<reg52.h>
/*****定義控制位**********************/
sbit Time_Show_LED2=P2^5;//Time_Show_LED2控制位
sbit Time_Show_LED1=P2^4;//Time_Show_LED1控制位
sbitEW_LED2=P2^3;//EW_LED2控制位
sbitEW_LED1=P2^2;//EW_LED1控制位
sbitSN_LED2=P2^1;//SN_LED2控制位
sbitSN_LED1=P2^0;//SN_LED1控制位
sbit SN_Yellow=P1^6;//SN黃燈
sbit EW_Yellow=P1^2;//EW黃燈
sbit EW_Red=P1^3;//EW紅燈
sbit SN_Red=P1^7;//SN紅燈
sbit EW_ManGreen=P3^0;//EW人行道綠燈
sbit SN_ManGreen=P3^1;//SN人行道綠燈
sbit Special_LED=P2^6;//交通正常指示燈
sbit Busy_LED=P2^7;//交通繁忙指示燈
sbit Nomor_Button=P3^5;//交通正常按鍵
sbit Busy_Btton=P3^6;//交通繁忙按鍵
sbit Special_Btton=P3^7;//交通特殊按鍵
sbit Add_Button=P3^3;//時間加
sbit Reces_Button=P3^4;//時間減
bit Flag_SN_Yellow; //SN黃燈標志位
bit Flag_EW_Yellow;//EW黃燈標志位
charTime_EW;//東西方向倒計時單元
charTime_SN;//南北方向倒計時單元
uchar EW=60,SN=40,EWL=19,SNL=19; //程序初始化賦值,正常模式
uchar EW1=60,SN1=40,EWL1=19,SNL1=19;//用於存放修改值的變數
uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//1~~~~9段選碼
uchar code S[8]={0X28,0X48,0X18,0X48,0X82,0X84,0X81,0X84};//交通信號燈控制代碼
/**********************延時子程序************************/
voidDelay(uchar a)
{
uchari;
i=a;
while(i--){;}
}
/*****************顯示子函數**************************/
voidDisplay(void)
{
char h,l;
h=Time_EW/10;
l=Time_EW%10;
P0=table[l];
EW_LED2=1;
Delay(2);
EW_LED2=0;
P0=table[h];
EW_LED1=1;
Delay(2);
EW_LED1=0;

h=Time_SN/10;
l=Time_SN%10;
P0=table[l];
SN_LED2=1;
Delay(2);
SN_LED2=0;
P0=table[h];
SN_LED1=1;
Delay(2);
SN_LED1=0;

h= EW1/10;
l= EW1%10;
P0=table[l];
Time_Show_LED1=1;
Delay(2);
Time_Show_LED1=0;
P0=table[h];
Time_Show_LED2=1;
Delay(2);
Time_Show_LED2=0;
}
/**********************外部0中斷服務程序************************/

voidEXINT0(void)interrupt 0 using 1
{
EX0=0; //關中斷

if(Add_Button==0) //時間加
{
EW1+=5;
SN1+=5;
if(EW1>=100)
{
EW1=99;
SN1=79;
}
}
if(Reces_Button==0) //時間減
{
EW1-=5;
SN1-=5;
if(EW1<=40)
{
EW1=40;
SN1=20;
}

}

if(Nomor_Button==0)//測試按鍵是否按下,按下為正常狀態
{
EW1=60;
SN1=40;
EWL1=19;
SNL1=19;
Busy_LED=0;//關繁忙信號燈
Special_LED =0;//關特殊信號燈
}
if(Busy_Btton==0) //測試按鍵是否按下,按下為繁忙狀態
{
EW1=45;
SN1=30;
EWL1=14;
SNL1=14;
Special_LED=0;//關特殊信號燈
Busy_LED=1;//開繁忙信號燈

}
if(Special_Btton==0)//測試按鍵是否按下,按下為特殊狀態
{
EW1=75;
SN1=55;
EWL1=19;
SNL1=19;
Busy_LED=0;//關繁忙信號燈
Special_LED =1;//開特殊信號燈

}
EX0=1;//開中斷
}
/**********************T0中斷服務程序*******************/
void timer0(void)interrupt 1 using 1
{
static uchar count;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;

if(count==10)
{
if(Flag_SN_Yellow==1) //測試南北黃燈標志位
{SN_Yellow=~SN_Yellow;}
if(Flag_EW_Yellow==1) //測試東西黃燈標志位
{EW_Yellow=~EW_Yellow;}
}
if(count==20)
{
Time_EW--;
Time_SN--;
if(Flag_SN_Yellow==1)//測試南北黃燈標志位
{SN_Yellow=~SN_Yellow;}
if(Flag_EW_Yellow==1)//測試東西黃燈標志位
{EW_Yellow=~EW_Yellow;}
count=0;
}

}
/*********************主程序開始**********************/
voidmain(void)

{
Busy_LED=0;
Special_LED=0;
IT0=1;//INT0負跳變觸發
TMOD=0x01;//定時器工作於方式1
TH0=(65536-50000)/256;//定時器賦初值
TL0=(65536-50000)%256;
EA=1; //CPU開中斷總允許
ET0=1;//開定時中斷
EX0=1;//開外部INTO中斷
TR0=1;//啟動定時

while(1)

{/*******S0狀態**********/
EW_ManGreen=0;//EW人行道禁止
SN_ManGreen=1;//SN人行道通行
Flag_EW_Yellow=0; //EW關黃燈顯示信號
Time_EW=EW;
Time_SN=SN;
while(Time_SN>=5)
{P1=S[0]; //SN通行,EW紅燈
Display();}
/*******S1狀態**********/
P1=0x00;
while(Time_SN>=0)
{Flag_SN_Yellow=1; //SN開黃燈信號位
EW_Red=1; //SN黃燈亮,等待左拐信號,EW紅燈

Display();
}
/*******S2狀態**********/
Flag_SN_Yellow=0; //SN關黃燈顯示信號
Time_SN=SNL;
while(Time_SN>=5)
{P1=S[2];//SN左拐綠燈亮,EW紅燈
Display();}

/*******S3狀態**********/
P1=0x00;
while(Time_SN>=0)
{Flag_SN_Yellow=1;//SN開黃燈信號位
EW_Red=1; //SN黃燈亮,等待停止信號,EW紅燈

Display();}


/***********賦值**********/
EW=EW1;
SN=SN1;
EWL=EWL1;
SNL=SNL1;


/*******S4狀態**********/
EW_ManGreen=~EW_ManGreen;//EW人行道通行
SN_ManGreen=~SN_ManGreen;//SN人行道禁止
Flag_SN_Yellow=0; //SN關黃燈顯示信號
Time_EW=SN;
Time_SN=EW;
while(Time_EW>=5)
{P1=S[4]; //EW通行,SN紅燈
Display();}
/*******S5狀態**********/
P1=0X00;
while(Time_EW>=0)
{Flag_EW_Yellow=1;//EW開黃燈信號位
SN_Red=1;//EW黃燈亮,等待左拐信號,SN紅燈
Display();}
/*******S6狀態**********/
Flag_EW_Yellow=0; //EW關黃燈顯示信號
Time_EW=EWL;
while(Time_EW>=5)
{P1=S[6];//EW左拐綠燈亮,SN紅燈
Display();}

/*******S7狀態**********/
P1=0X00;
while(Time_EW>=0)
{Flag_EW_Yellow=1; //EN開黃燈信號位
SN_Red=1;//EW黃燈亮,等待停止信號,SN紅燈
Display();}

/***********賦值**********/
EW=EW1;
SN=SN1;
EWL=EWL1;
SNL=SNL1;
}

}

② 求解釋c語言編寫的交通燈程序!(C51單片機的)追加啊!!

...得打多少字。。。
先自己把單片機C語言的資料看一下,,讀通一些語句。。
循環是條件控制的,延遲是利用無操作循環來浪費掉時間產生延遲。。
。。
7788就PM了吧

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

#include <reg51.h>

#include <stdio.h>

#define uchar unsigned char

#define uint unsigned int

uchar h;

uint r=0;

uint s;

uchar code dis[]={ 0Xc0,0Xf9, 0Xa4,0Xb0,0X99,0X92,0X82,0Xf8,0X80,0X90,0Xff,};

/*0*//*1*//*2*//*3*//*4*//*5*//*6*//*7*//*8*//*9*//*NULL*/

void delay(uint c)

{

uint i,j;

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

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

}

void t0(void) interrupt 0 using 1 //interrupt 1

{

delay(2);

if(INT0==0)

{

r++;

if(r==2)

{

r=0;

}

r%=2;

if(r==0)

{

P0=0xeb;

P1=0x00;

P2=0xff;

}while(1)

{

if(INT0==0|INT1==0|T0==0)

{

delay(2);

if(INT0==0|INT1==0|T0==0)

break;

}

};

}

}

void t1(void) interrupt 2 using 1 //interrupt 2

{

delay(2);

if(INT1==0)

{

r++;

if(r==2)

{

r=0;

}

r%=2;

if(r==0)

{

P0=0xdd;

P1=0x00;

P2=0xff;

}while(1)

{

if(INT1==0|INT0==0|T0==0)

{

delay(2);

if(INT1==0|INT0==0|T0==0)

break;

}

};

}

}

void t2(void) interrupt 1 using 1 //interrupt 3

{

TH0=0xff;

TL0=0xff;

delay(2);

if(T0==0)

{

P0=0xdb;

P1=0x00;

P2=0xff;

}while(1)

{

if(INT0==0|INT1==0)

{

delay(2);

if(INT0==0|INT1==0)

break;

}

};

}

void main(void)

{

TMOD=0x06;

TH0=0xff;

TL0=0xff;

TR0=1;

EA=1;

EX0=1;

EX1=1;

ET0=1;

while(1)

{

P0=0xeb;

for(h=28;h>0;h--)

{

for(s=248;s>0;s--)

{

P1=0x00;

P2=0xff;

P1=0x01;

P2=dis[h/10];

delay(1);

P1=0x00;

P2=0xff;

P1=0x02;

P2=dis[h%10];

delay(1);

P1=0x00;

P2=0xff;

P1=0x04;

P2=dis[(h+2)/10];

delay(1);

P1=0x00;

P2=0xff;

P1=0x08;

P2=dis[(h+2)%10];

delay(1);

}

}

delay(248);

P0=0xf3;

for(h=3;h>0;h--)

{

delay(392);

P0=0xf3;

delay(1);

P1=0x00;

P2=0xff;

P1=0xaa;

P2=dis[(h-1)%10];

delay(600);

P0=0xfb;

}

delay(248);

P0=0xdd;

for(h=38;h>0;h--)

{

for(s=248;s>0;s--)

{

P1=0x00;

P2=0xff;

P1=0x01;

P2=dis[(h+2)/10];

delay(1);

P1=0x00;

P2=0xff;

P1=0x02;

P2=dis[(h+2)%10];

delay(1);

P1=0x00;

P2=0xff;

P1=0x04;

P2=dis[h/10];

delay(1);

P1=0x00;

P2=0xff;

P1=0x08;

P2=dis[h%10];

delay(1);

}

}

delay(248);

P0=0xde;

for(h=3;h>0;h--)

{

delay(392);

P0=0xde;

delay(1);

P1=0x00;

P2=0xff;

P1=0xaa;

P2=dis[(h-1)%10];

delay(600);

P0=0xdf;

}

delay(248);

}

}

④ 基於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>

sfrp0=0x80;

sfrp1=0x90;

sfrp2=0xA0;

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

sbitsw=p0^0;

sbitOE=P0^6;

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

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

//函數聲明begin

voiddelay1(intcount);

voiddelay_long(intnumber1,intnumber2);

voidpeople_car_drive();

//函數聲明end

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

voiddelay1(intcount)

{inti;

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

{;}

}

voiddelay_long(intnumber1,intnumber2)

{

inta,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);//南北黃燈閃爍三秒完畢

}

voidmain()//主函數入口處

{

p0=0x01;

p1=0x00;

p2=0x00;

p3=0x00;//初始化各埠

{while(1)

{

if(sw==0)

{people_car_drive();}

else

{

p2=0x00;

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

}

}

}

}

詳情訪問:http://hi..com/hjiannew/

⑤ c51單片機c語言交通燈的程序

Proteus模擬原理圖:

程序如下:

#include <reg51.h>

#define uchar unsigned char

#define uint unsigned int

uchar data buf[4];

uchar data sec_dx=20;//東西數默認

uchar data sec_nb=30;//南北默認值

uchar data set_timedx=20;

uchar data set_timenb=30;

int n;

uchar data b;//定時器中斷次數

sbit k1=P1^6;//定義5組開關

sbit k2=P1^7;

sbit k3=P2^7;

sbit k4=P3^0;

sbit k5=P3^1;

sbit Yellow_nb=P2^5; //南北黃燈標志

sbit Yellow_dx=P2^2; //東西黃燈標志

sbit Green_nb=P2^4;

sbit Green_dx=P2^1;

sbit Buzz=P3^7;

bit Buzzer_Indicate;

bit time=0;//燈狀態循環標志

bit set=1;//調時方向切換鍵標志

uchar code table[11]={ //共陰極字型碼

0x3f, //--0

0x06, //--1

0x5b, //--2

0x4f, //--3

0x66, //--4

0x6d, //--5

0x7d, //--6

0x07, //--7

0x7f, //--8

0x6f, //--9

0x00 //--NULL

};

//函數的聲明部分

void delay(int ms);//延時子程序

void key();//按鍵掃描子程序

void key_to1();//鍵處理子程序

void key_to2();

void key_to3();

void display();//顯示子程序

void logo(); //開機LOGO

void Buzzer();

//主程序

void main()

{

TMOD=0X01;

TH0=0XD8;

TL0=0XF0;

EA=1;

ET0=1;

TR0=1;

EX0=1;

EX1=1;

logo();

P2=0Xc3;// 開始默認狀態,東西綠燈,南北黃燈

sec_nb=sec_dx+5;

while(1)

{

key(); //調用按鍵掃描程序

display(); //調用顯示程序

Buzzer();

}

}

//函數的定義部分

void key() //按鍵掃描子程序

{

if(k1!=1)

{

delay(10);

if(k1!=1)

{

while(k1!=1)

{

key_to1();

for(n=0;n<40;n++)

{ display();}

}

}

}

if(k2!=1)

{

delay(10);

if(k2!=1)

{

while(k2!=1)

{

key_to2();

for(n=0;n<40;n++)

{ display();}

}

}

}

if(k3!=1)

{

TR0=1; //啟動定時器

Buzzer_Indicate=0;

sec_nb=set_timenb; //從中斷回復,仍顯示設置過的數值

sec_dx=set_timedx;

if(time==0)

{ P2=0X99;sec_nb=sec_dx+5; }

else { P2=0xC3;sec_dx=sec_nb+5; }

}

if(k4!=1)

{

delay(5);

if(k4!=1)

{

while(k4!=1);

set=!set;

}

}

if(k5!=1)

{

delay(5);

if(k5!=1)

{

while(k5!=1)

key_to3();

}

}

}

void display() //顯示子程序

{

buf[1]=sec_dx/10; //第1位 東西秒十位

buf[2]=sec_dx%10; //第2位 東西秒個位

buf[3]=sec_nb/10; //第3位 南北秒十位

buf[0]=sec_nb%10; //第4位 南北秒個位

P1=0xff; // 初始燈為滅的

P0=0x00;

P1=0xfe; //片選LCD1

P0=table[buf[1]];

delay(1);

P1=0xff;

P0=0x00;

P1=0xfd; //片選LCD2

P0=table[buf[2]];

delay(1);

P1=0xff;

P0=0x00;

P1=0Xfb; //片選LCD3

P0=table[buf[3]];

delay(1);

P1=0xff;

P0=0x00;

P1=0Xf7;

P0=table[buf[0]]; //片選LCD4

delay(1);

}

void time0(void) interrupt 1 using 1 //定時中斷子程序

{

b++;

if(b==19) // 定時器中斷次數

{ b=0;

sec_dx--;

sec_nb--;

if(sec_nb<=5&&time==0) //東西黃燈閃

{ Green_dx=0;Yellow_dx=!Yellow_dx;}

if(sec_dx<=5&&time==1) //南北黃燈閃

{ Green_nb=0;Yellow_nb=!Yellow_nb;}

if(sec_dx==0&&sec_nb==5)

sec_dx=5;

if(sec_nb==0&&sec_dx==5)

sec_nb=5;

if(time==0&&sec_nb==0)

{ P2=0x99;time=!time;sec_nb=set_timenb;sec_dx=set_timenb+5;}

if(time==1&&sec_dx==0)

{P2=0Xc3;time=!time;sec_dx=set_timedx;sec_nb=set_timedx+5;}

}

}

void key_to1() //鍵盤處理子程序之+

{

TR0=0; //關定時器

if(set==0)

set_timenb++; //南北加1S

else

set_timedx++; //東西加1S

if(set_timenb==100)

set_timenb=1;

if( set_timedx==100)

set_timedx=1; //加到100置1

sec_nb=set_timenb ; //設置的數值賦給東西南北

sec_dx=set_timedx;

}

void key_to2() //鍵盤處理子程序之-

{

TR0=0; //關定時器

if(set==0)

set_timenb--; //南北減1S

else

set_timedx--; //東西減1S

if(set_timenb==0)

set_timenb=99;

if( set_timedx==0 )

set_timedx=99; //減到1重置99

sec_nb=set_timenb ; //設置的數值賦給東西南北

sec_dx=set_timedx;

}

void key_to3() //鍵盤處理之緊急車通行

{

TR0=0;

P2=0Xc9;

sec_dx=00;

sec_nb=00;

Buzzer_Indicate=1;

}

void int0(void) interrupt 0 using 1 //只允許東西通行

{

TR0=0;

P2=0Xc3;

Buzzer_Indicate=0;

sec_dx=00;

sec_nb=00;

}

void int1(void) interrupt 2 using 1 //只允許南北通行

{

TR0=0;

P2=0X99;

Buzzer_Indicate=0;

sec_nb=00;

sec_dx=00;

}

void logo()//開機的Logo "- - - -"

{ for(n=0;n<50;n++)

{

P0=0x40;

P1=0xfe;

delay(1);

P1=0xfd;

delay(1);

P1=0Xfb;

delay(1);

P1=0Xf7;

delay(1);

P1 = 0xff;

}

}

void Buzzer()

{

if(Buzzer_Indicate==1)

Buzz=!Buzz;

else Buzz=0;

}

void delay(int ms) //延時子程序

{

uint j,k;

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

for(k=0;k<124;k++);

}


⑥ C51單片機程序設計題,要求用C語言做,模擬交通燈控制單片機電路,答案要詳細具體。

晚上隨手寫,也未調試,權當看看

程序有不嚴謹地方還得調試修改

#include<REGX51.H>

#defineSTATUS_1S 1

#defineSTATUS_2S 2

#defineSTATUS_3S 3

#defineSTATUS_4S 4

#defineSTATUS_5S 5

#defineSTATUS_15S 15

#defineSTATUS_28S 28

#defineSTATUS_29S 29

#defineSTATUS_30S 30

unsignedcharflag,status,status_temp=1,status_temp_;

sbitK1 = P0^0;

sbitK2 = P0^1;

sbitRLED = P0^2;

sbitYLED = P0^3;

sbitGLED = P0^4;

voidInit(void)

{

ET0=1;

TR0=1;

RLED=0; //亮

YLED=0;

GLED=0;

while(status_temp)

{

switch(status)

{

caseSTATUS_1S: //1S

{

RLED=1; //滅,閃一次

YLED=1;

GLED=1;

} break;

caseSTATUS_2S: //1S

{

RLED=0; //亮,閃一次

YLED=0;

GLED=0;

} break;

caseSTATUS_3S: //1S

{

RLED=1; //滅

YLED=1;

GLED=1;

status_temp=0;

} break;

}

}

status_temp=1;

ET0=0;

TR0=0;

}

voidInit_Timer0(void)

{

TMOD=0x01;

// ET0=1;

// TR0=1;

EA=1;

TH0=0X3C;

TL0=0XB0; //未計算,偷樓上的

}

voidM_Start(void)

{

TH0=0X3C;

TL0=0XB0;

ET0=1;

TR0=1;

RLED=0; //紅亮

while(status_temp)

{

switch(status)

{

caseSTATUS_1S:

{

if(status_temp_==1)

{

YLED=0;

}

} break;

caseSTATUS_2S:

{

if(status_temp_==1)

{

YLED=1;

}

} break;

caseSTATUS_3S:

{

if(status_temp_==1)

{

YLED=0;

status_temp_=0;

}

} break;

caseSTATUS_15S: //15S滅,綠亮

{

RLED=1;

GLED=0;

} break;

caseSTATUS_28S:

{

GLED=1;

} break;

caseSTATUS_29S:

{

GLED=0;

} break;

caseSTATUS_30S:

{

GLED=1;

status=0;

status_temp_=1;

} break;

}

}

ET0=0;

TR0=0;

status=0;

status_temp=1;

YLED=1;

}

voidM_End(void)

{

TH0=0X3C;

TL0=0XB0;

ET0=1;

TR0=1;

RLED=0; //亮1次

YLED=0;

GLED=0;

while(status_temp)

{

switch(status)

{

caseSTATUS_1S: //1S

{

RLED=1; //滅一次

YLED=1;

GLED=1;

} break;

caseSTATUS_2S: //1S

{

RLED=0; //亮二次

YLED=0;

GLED=0;

} break;

caseSTATUS_3S: //1S

{

RLED=1; ////滅二次

YLED=1;

GLED=1;

} break;

caseSTATUS_4S: //1S

{

RLED=0; ////亮三次

YLED=0;

GLED=0;

} break;

caseSTATUS_5S: //1S

{

RLED=1; ////滅三次

YLED=1;

GLED=1;

status_temp=0;

} break;

}

}

status_temp=1;

ET0=0;

TR0=0;

}

main()

{

Init();//單片機初始化

Init_Timer0();//定時器初始化

while(1)

{

if(K1==0)

M_Start();//模擬開始

if(K2==0)

M_End();//模擬結束

}

}

voidinterrupt_time0()interrupt1 //核對頭文件,一致就好

{

TH0=0X3C;

TL0=0XB0;

flag++;

if(flag==20)

{

status++;

flag=0;

}

}

⑦ 如何用c語言編程在單片機上做交通信號燈

硬體電路設計

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

(1)電路連接圖:

三、軟體程序(C語言)

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

//*****************************//
//程序名:十字路口交通燈控制
//編寫人:黃庭劍
//初寫時間:2009年1月2日
//程序功能:南北為車行道,延時60秒;東西方向為人行道,延時20秒,且在最後3秒黃燈顯示2秒鍾再實現切換.
//CPU說明:AT89C51型單片機;24MHZ晶體振盪器
//完成時間:2009年1月6日
//*****************************//
#include<stdio.h>
#include<reg51.h>
#include<intrins.h>
sfrp0=0x80;
sfrp1=0x90;
sfrp2=0xA0;
sfrp3=0xb0;//這部分內容其實在「#include<reg51.h>」里已經有,但裡面定義的必須區分大小寫,在這里,因為我程序採用的是小寫,reg51.h里對各個埠與寄存器的定義都是大寫,所以在編譯連接時,會報錯,所以,在本設計程序里,我只用到了埠,在這里也就只定義了四個,而沒有去改reg51.h裡面的內容。其實兩者是一樣的。
sbitsw=p0^0;
sbitOE=P0^6;
sbitLE=P0^7;//74LS373鎖存器控制端定義
chardisplay[]={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99};//p1口的數碼管時間顯示調用,利用74L74BCD碼,8位驅動輸出;
//函數聲明begin
voiddelay1(intcount);
voiddelay_long(intnumber1,intnumber2);
voidpeople_car_drive();
//函數聲明end
//***********************//延時子程序
voiddelay1(intcount)
{inti;
for(i=count;i>0;i--)
{;}
}
voiddelay_long(intnumber1,intnumber2)
{
inta,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);//南北黃燈閃爍三秒完畢
}

voidmain()//主函數入口處
{
p0=0x01;
p1=0x00;
p2=0x00;
p3=0x00;//初始化各埠
{while(1)
{
if(sw==0)
{people_car_drive();}
else
{
p2=0x00;
p3=0x00;//關閉所有交通燈
}
}

}
}

⑧ 跪求51單片機交通信號燈c語言程序設計

///******************************************************************************** 實驗名 : 動態顯示數碼管實驗* 使用的IO : * 實驗效果 : 數碼管顯示76543210。* 注意 :當位選用P1口的時候注意可能會有一位不亮,那麼調整J21*******************************************************************************/#include<reg51.h>
//--定義使用的IO口--//#define GPIO_DIG P0#define GPIO_PLACE P1
#define GPIO_TRAFFIC P2
sbit RED10 = P2^0; //上人行道紅燈sbit GREEN10 = P2^1; //上人行道綠燈sbit RED11 = P2^2;sbit YELLOW11= P2^3;sbit GREEN11 = P2^4;
sbit RED00 = P3^0; //右人行道紅燈sbit GREEN00 = P3^1; //右人行道綠燈sbit RED01 = P2^5;sbit YELLOW01= P2^6;sbit GREEN01 = P2^7;
//--定義全局變數--//unsigned char code DIG_PLACE[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位選控制 查表的方法控制unsigned char code DIG_CODE[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的顯示碼unsigned char DisplayData[8];//用來存放要顯示的8位數的值unsigned char Time, Second; //用來存放定時時間
//--聲明全局函數--//void DigDisplay(); //動態顯示函數void Timer0Cofig(void);
/******************************************************************************** 函 數 名 : main* 函數功能 : 主函數* 輸 入 : 無* 輸 出 : 無*******************************************************************************/
void main(void){ Second = 1;
Timer0Cofig();
while(1) { if(Second == 70) { Second = 1; }
//--寶田路通行,30秒--// if(Second < 31) { DisplayData[0] = 0x00; DisplayData[1] = 0x00; DisplayData[2] = DIG_CODE[(30 - Second) % 100 / 10]; DisplayData[3] = DIG_CODE[(30 - Second) %10]; DisplayData[4] = 0x00; DisplayData[5] = 0x00; DisplayData[6] = DisplayData[2]; DisplayData[7] = DisplayData[3]; DigDisplay();
//--寶田路通行--//
GPIO_TRAFFIC = 0xFF; //將所有的燈熄滅 RED00 = 1; GREEN00 = 1;
GREEN11 = 0; //寶田路綠燈亮 GREEN10 = 0; //寶田路人行道綠燈亮
RED01 = 0; //前進路紅燈亮 RED00 = 0; //前進路人行道紅燈亮 }
//--黃燈等待切換狀態,5秒--// else if(Second < 36) { DisplayData[0] = 0x00; DisplayData[1] = 0x00; DisplayData[2] = DIG_CODE[(35 - Second) % 100 / 10]; DisplayData[3] = DIG_CODE[(35 - Second) %10]; DisplayData[4] = 0x00; DisplayData[5] = 0x00; DisplayData[6] = DisplayData[2]; DisplayData[7] = DisplayData[3]; DigDisplay();
//--黃燈階段--//
GPIO_TRAFFIC = 0xFF; //將所有的燈熄滅 RED00 = 1; GREEN00 = 1;
YELLOW11 = 0; //寶田路黃燈亮 RED10 = 0; //寶田路人行道紅燈亮
YELLOW01 = 0; //前進路紅燈亮 RED00 = 0; //前進路人行道紅燈亮 }
//--前進路通行--// else if(Second < 66) { DisplayData[0] = 0x00; DisplayData[1] = 0x00; DisplayData[2] = DIG_CODE[(65 - Second) % 100 / 10]; DisplayData[3] = DIG_CODE[(65 - Second) %10]; DisplayData[4] = 0x00; DisplayData[5] = 0x00; DisplayData[6] = DisplayData[2]; DisplayData[7] = DisplayData[3]; DigDisplay();
//--黃燈階段--//
GPIO_TRAFFIC = 0xFF; //將所有的燈熄滅 RED00 = 1; GREEN00 = 1;
RED11 = 0; //寶田路紅燈亮 RED10 = 0; //寶田路人行道紅燈亮
GREEN01 = 0; //前進路綠燈亮 GREEN00 = 0; //前進路人行道綠燈亮 }
//--黃燈等待切換狀態,5秒--// else { DisplayData[0] = 0x00; DisplayData[1] = 0x00; DisplayData[2] = DIG_CODE[(70 - Second) % 100 / 10]; DisplayData[3] = DIG_CODE[(70 - Second) %10]; DisplayData[4] = 0x00; DisplayData[5] = 0x00; DisplayData[6] = DisplayData[2]; DisplayData[7] = DisplayData[3]; DigDisplay();
//--黃燈階段--//
GPIO_TRAFFIC = 0xFF; //將所有的燈熄滅 RED00 = 1; GREEN00 = 1;
YELLOW11 = 0; //寶田路黃燈亮 RED10 = 0; //寶田路人行道紅燈亮
YELLOW01 = 0; //前進路紅燈亮 RED00 = 0; //前進路人行道紅燈亮 } } }
/******************************************************************************** 函 數 名 : DigDisplay* 函數功能 : 使用數碼管顯示* 輸 入 : 無* 輸 出 : 無*******************************************************************************/
void DigDisplay(){ unsigned char i; unsigned int j;
for(i=0; i<8; i++) { GPIO_PLACE = DIG_PLACE[i]; //發送位選 GPIO_DIG = DisplayData[i]; //發送段碼 j = 10; //掃描間隔時間設定 while(j--); GPIO_DIG = 0x00; //消隱 }}
/******************************************************************************** 函 數 名 : Timer0Cofig* 函數功能 : 配置定時器* 輸 入 : 無* 輸 出 : 無*******************************************************************************/
void Timer0Cofig(void){ TMOD = 0x01; //定時器0選擇工作方式1 TH0 = 0x3C; //設置初始值,定時50MS TL0 = 0xB0; EA = 1; //打開總中斷 ET0 = 1; //打開定時器0中斷 TR0 = 1; //啟動定時器0 }
/******************************************************************************** 函 數 名 : Timer0* 函數功能 : 定時器0中斷函數* 輸 入 : 無* 輸 出 : 無*******************************************************************************/
void Timer0() interrupt 1{ TH0 = 0x3C; //設置初始值 TL0 = 0xB0; Time++; if(Time == 20) { Second ++; Time = 0; }}

⑨ 51單片機C語言程序:交通燈系統

這種問題一般沒人會的,像 CSDN、程序員網 等等有類似的設計,你可以去看看

⑩ c語言寫的交通燈設計 C51單片機

你郵箱多少?我有完整的發給你,是我去年做的畢業設計,已經通過答辯的完整的。不過要說話算數,分給我哦。