A. 用單片機8051設計一個十字路口的紅、綠、黃交通信號燈控制系統,用c語言設計程序
三個模擬實例供參考
B. 交通信號燈的程序設計
#include<stdio.h>
#include<ctype.h>
#include<graphics.h>
#include<stdlib.h>
#include<math.h>
#include<conio.h>
#define X 800 //圖形區域寬度
#define Y 600 //圖形區域高度
#define WD 100 //單向車道寬度
#define LR 100 //車道長度
#define R 10 //紅綠燈半徑
void drawroad();
void pSound();
void baoshi();
void main(){
initgraph(X,Y);
setbkcolor(LIGHTGRAY);
cleardevice();
drawroad();
getch();
closegraph();
}
void drawroad(){
int midx=X/2,midy=Y/2,i;
setlinecolor(YELLOW);
setlinestyle(PS_DASH,2);
moveto(midx-WD/2,midy-WD-100);
lineto(midx-WD/2,0);
moveto(midx+WD/2,midy-WD-100);
lineto(midx+WD/2,0);
moveto(midx-WD/2,midy+WD+100);
lineto(midx-WD/2,Y);
moveto(midx+WD/2,midy+WD+100);
lineto(midx+WD/2,Y);
moveto(midx-WD-100,midy-WD/2);
lineto(0,midy-WD/2);
moveto(midx-WD-100,midy+WD/2);
lineto(0,midy+WD/2);
moveto(midx+WD+100,midy-WD/2);
lineto(X,midy-WD/2);
moveto(midx+WD+100,midy+WD/2);
lineto(X,midy+WD/2);
setlinestyle(PS_SOLID,3);
moveto(midx-WD,midy-WD-100);
lineto(midx-WD,0);
moveto(midx+WD,midy-WD-100);
lineto(midx+WD,0);
moveto(midx-WD,midy-WD-100);
linerel(2*WD,0);
for(i=0;i<25;i++)
line(midx-WD+(i-2)*10,midy-WD-100+10,midx-WD+(i-2)*10,midy-WD-100+40);
moveto(midx-WD,midy+WD+100);
lineto(midx-WD,Y);
moveto(midx+WD,midy+WD+100);
lineto(midx+WD,Y);
moveto(midx-WD,midy+WD+100);
linerel(2*WD,0);
for(i=0;i<25;i++)
line(midx-WD+(i-2)*10,midy+WD+100-10,midx-WD+(i-2)*10,midy+WD+100-40);
moveto(midx-WD-100,midy-WD);
lineto(0,midy-WD);
moveto(midx-WD-100,midy+WD);
lineto(0,midy+WD);
moveto(midx-WD-100,midy-WD);
linerel(0,2*WD);
for(i=0;i<25;i++)
line(midx-WD-100+10,midy-WD+(i-2)*10,midx-WD-100+40,midy-WD+(i-2)*10);
moveto(midx+WD+100,midy-WD);
lineto(X,midy-WD);
moveto(midx+WD+100,midy+WD);
lineto(X,midy+WD);
moveto(midx+WD+100,midy-WD);
linerel(0,2*WD);
for(i=0;i<25;i++)
line(midx+WD+100-10,midy-WD+(i-2)*10,midx+WD+100-40,midy-WD+(i-2)*10);
setfillstyle(BS_HATCHED,HS_BDIAGONAL);
fil
C. c語言編寫十字路口交通燈的程序
這程序是自己寫的嗎?要是的話也有點太,,,,那啥了吧,就是有點亂,感覺不用sbit那麼多。不過自己寫的怎麼都比抄的好。
P0=table【I】
table數組從來沒看到。定義的數組是uchar codetable[]和uchar codeS[8,codes數組也沒看到。
D. 用c語言或者c++寫交通信號燈模擬控制軟體設計
你這個程序,需要知道原理圖或模擬圖,結合電路才知道那些是用來控制什麼。不過,那些Pnn,應該是在程序的面定義的引腳,如P37,應該是用sbitP37=P3^7;這樣的語句定義過的,就是P3.7的引腳去控制什麼電路了。引腳是不是控制LED,用LED排列成的8字形的計時牌啊,就像數碼管似的。因交通燈的倒計時版就是由很多的LED燈排列而成的,並不是用現成的數碼管。
E. 如何用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;//關閉所有交通燈
}
}
}
}
F. 跪求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; }}
G. 基於ARM的交通信號燈系統設計,求C語言程序代碼要求如下:
我是你老師陳志國,隨時監視著你們!!!