導航:首頁 > 操作系統 > 基於51單片機的智能控制燈的設計

基於51單片機的智能控制燈的設計

發布時間:2022-06-29 19:23:26

『壹』 基於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/

『貳』 設計一個STC51單片機控制的RGB三基色LED燈光模式控制系統。

你最起碼要做一個恆流源,給LED供電。D/A轉換模塊。控制電流的大小。然後調節個個燈的電流變化就可以了,應該有那種調光IC賣的,讓單片機直接控制調光IC就可以了。

調光IC自帶恆流輸出,這樣就省事了。

『叄』 求基於單片機的智能照明系統的程序設計

這是我做的光敏電阻電壓採集設計,可以將監測到的電壓值顯示在led上面,同時也能把它發給PC,用串口調試就能接受,4800b/s裡面可能對你有些啟發

/*-------------------------------------------------------------------------
AD0809的工作頻范圍為10KHZ-1280KHZ,當頻率范圍為500KHZ時,其轉換速度為128us
飛翔的雄鷹-----2010.11.27
電路連接為直通型,a,b,c直接接地,選擇模擬輸入0通道
更改情況:增加了與PC的串列通訊
將P3.0和P3.1讓出換為P3.6和P3.7 2010.11.29
---------------------------------------------------------------------------*/

#include<reg52.h>
unsigned char t,m,s,x,ior,cn; //電子表的各個位信號 x顯示字位置控制
unsigned int foat,i; // 6位有效數字eg:4.56845
unsigned char ior;
unsigned char a[5]={0,0,0,0,0}; //注意5個數數組內是5而不是4
sbit start=P3^4; //啟動AD
sbit OE=P3^7; //啟動輸出數據
sbit EOC=P3^3; //轉換結束
sbit CLK=P3^6; //AD始終模擬
bit Recdat;
code unsigned char ledcod[]={0x7e,0x12,0xbc,0xb6,0xd2,0xE6,0xee,0x32,0xfe,0xf6};
code unsigned char ledcod1[]={0x7f,0x13,0xbd,0xb7,0xd3,0xE7,0xef,0x33,0xff,0xf7};//帶小數點的字形碼
/*------------------------------------------------
定時器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |=0x02;
TH0=0xd1;
TL0=0xd1; //定時0.05ms
EA=1;
ET0=1;
TR0=1;
}
/*------------------------------------------------
串口初始化子程序
------------------------------------------------*/
void InitCom(void) //初始化串口
{
SCON|=0x50; //0101 0000B,工作方式1,8位UART,波特率可變,允許接收
TMOD|=0x20; //T1工作於方式2自動重裝
TCON|=0x40; //定時器1開始計數TR1=1
TH1=250; //T1計數初值 波特率為4800
TL1=250;
RI=0;TI=0; //清發送接收標志
ES=1; // 開串口
}
/*--------------------------------------------------
顯示子程序
---------------------------------------------------*/
void display(unsigned char num)
{

switch(num)
{
case 0:
{
ior=foat/10000; //3
a[0]=ior;
P1=ledcod1[ior];
P0=0x7e;
x++;
}
break;
case 1:
{
ior=(foat-10000*a[0])/1000;
P1=ledcod[ior];
a[1]=ior; //5
P0=0xfd;
x++;
}
break;
case 2:
{
ior=(foat-10000*a[0]-1000*a[1])/100;
P1=ledcod[ior];
a[2]=ior; //3
P0=0xfb;
x++;
}
break;
case 3:
{
ior=(foat-10000*a[0]-1000*a[1]-100*a[2])/10;
P1=ledcod[ior];
a[3]=ior; //1
P0=0xf7;
x++;
}
break;
case 4:
{
ior=foat-10000*a[0]-1000*a[1]-100*a[2]-10*a[3]; //6
P1=ledcod[ior];
a[4]=ior;
P0=0xef;
x++;
}
break;
case 5:
{
ior=foat-10000*a[0]-1000*a[1]-100*a[2]-10*a[3]; //6
P1=ledcod[ior];
P0=0xdf;
x++;
}
break;
default:
break;
}
}
/*------------------------------------------------
串口發送
------------------------------------------------- */
void ComOut(void) //向串口發送數據
{ unsigned char i;
for(i=0;i<5;i++)
{
SBUF=a[i]; //發送數據t
while(!TI); //等待發送完成
TI=0;
}
SBUF=0x0;
while(!TI); //等待發送完成
TI=0;
SBUF=0x0;
while(!TI); //等待發送完成
TI=0;
SBUF=0x0;
while(!TI); //等待發送完成
TI=0;
}
/*-----------------------------------------------------
延時函數
------------------------------------------------------*/
void delay(unsigned int i)
{
while(i--);
}
/********************主函數************************/
main()
{
Recdat=0;
x=0;
P2=0xff; //P2口工作於讀,所以先寫1,阻斷內部的cmos
EOC=1; //
Init_Timer0();
InitCom();
while(1)
{
if(i==79) //開始的時候這里沒加采樣時間(79*0.05=3.94ms),導致始終無法采樣到信號
{
delay(8000); //為了使數碼管的數字讓人眼能夠分辨。增加了這個延時
start=0;
start=1; //AD在上升沿復位,在下降沿開始轉換(ST端給出一個至少有100ns寬的正脈沖信號 )
start=0;
}
delay(8); //轉換時間為20us
if(EOC==1) //查詢高電平的到來。轉換完畢AD0809的EOC會輸出一個高電平
{
OE=1; //打開--將數據發出到單片機的P2口
delay(2);
foat=P2*196;
OE=0; //輸出數據線呈高阻狀態
}
if(Recdat)
{
Recdat=0;
ComOut();
}

}

}
/*****************************************************/
/*------------------------------------------------
定時器中斷子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 using 2
{
i++;
CLK=~CLK; //為AD轉換提供時鍾周期 0.05ms 20khz
if(i==80) //每0.05ms*50=2.5ms 調用一次顯示
{
i=0;
if(x==6)
{ x=0;}
display(x);
}
}
/*---------------------------------------------------
串口中斷接收
----------------------------------------------------*/
void ComINT() interrupt 4 using 2 //中斷接收程序
{
if(RI) //判斷是否接收完,接收完成後,由硬體置RI位
{
cn=SBUF; //讀入緩沖區
RI=0; //清標志
Recdat=1; //有數據,建立標志
}
}

『肆』 以AT89C51單片機為控制器的智能交通燈控制系統,基於51單片機的交通信號燈模擬系統控制的模擬圖及C程序

你好!

這樣的效果可以嗎

『伍』 基於51單片機的光控路燈系統設計

關鍵是外圍電路,單片機編程沒有什麼,也就一個if語句吧。

『陸』 基於51單片機的LED彩燈控制器設計

電源電路+單片機最小系統+三極體驅動電路+程序編寫。這幾步就可以了,應該是很簡單的在網上找找資料就有了哦

『柒』 基於51單片機的教室智能照明控制系統

畢業設計拿來主義,看到就煩,為什麼這么簡單的東西都不肯花點時間做一下。當然,如果你是女生還情有可原。

閱讀全文

與基於51單片機的智能控制燈的設計相關的資料

熱點內容
戰雙程序員 瀏覽:479
him觸摸編程軟體 瀏覽:929
植物大戰僵屍存檔怎麼轉移安卓 瀏覽:852
java棧的元素 瀏覽:737
程序員與籃球事件 瀏覽:675
app反編譯不完整 瀏覽:788
電腦上的文件夾怎麼調整 瀏覽:7
伺服器無響應是什麼原因呀 瀏覽:984
wd文檔里的app怎麼製作 瀏覽:513
電腦里的文件夾沒有了一般能恢復嗎 瀏覽:418
哪裡有配加密鑰匙的 瀏覽:210
伺服器開不了機怎麼把數據弄出來 瀏覽:958
gif動態圖片怎麼壓縮 瀏覽:521
黑猴子棒球壓縮文件解壓密碼 瀏覽:631
如何讓app適應不同的手機屏幕大小 瀏覽:10
蘋果手機如何給安卓手機分享軟體 瀏覽:761
蘋果電腦怎麼運行騰訊雲伺服器 瀏覽:59
明日之後沙石堡命令助手 瀏覽:261
蛋糕店用什麼樣的app 瀏覽:877
長安銀行信用卡app怎麼取現 瀏覽:635