『壹』 基於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單片機的教室智能照明控制系統
畢業設計拿來主義,看到就煩,為什麼這么簡單的東西都不肯花點時間做一下。當然,如果你是女生還情有可原。