1. 基於51單片機的簡易交通燈的proteus模擬,我要原理圖,模擬圖,protell圖,程序要完整的,對應哦,
#include "reg51.h"
#define uchar unsigned char
sbit k1=P1^0;
void delay8s(void)
{
unsigned char i,j,k;
for(i=80;i>0;i--)
for(j=200;j>0;j--)
for(k=248;k>0;k--);
}
void delay05s(void)
{
unsigned char i,j,k;
for(i=2;i>0;i--)
for(j=200;j>0;j--)
for(k=248;k>0;k--);
}
void zt0()
{
P2=0xf3;
delay8s();
}
void zt1()
{
char i;
for(i=4;i>0;i--)
{
P2=0xeb;
delay05s();
P2=0xfb;
delay05s();
}
}
void zt2()
{
P2=0xde;
delay8s();
}
void zt3()
{
char j;
for(j=4;j>0;j--)
{
P2=0xdd;
delay05s();
P2=0xdf;
delay05s();
}
}
void k1yes()
{
while(1)
{
zt0();
zt1();
zt2();
zt3();
}
}
void k1no()
{
P2=0x00;
delay05s();
P2=0xff;
delay05s();
}
void main(void)
{
while(1)
{
uchar a;
a=P1;
a=a&0x01;
switch(a)
{
case 0:k1yes();break;
case 1:k1no();break;
}
}
}
2. 51單片機交通燈紅燈綠燈19秒黃燈閃爍三秒
51單片機交通燈紅燈綠燈19秒黃燈閃爍三秒可以採用4行4列的矩陣開關顯示。用單片機做一交通信號燈控制裝置,要求A東西綠燈亮5秒後閃2秒熄滅,黃燈閃2秒後熄滅,紅燈亮9秒,B南北綠燈亮5秒後閃2秒熄滅,黃燈閃2秒後熄滅,紅燈亮9秒C循環10個開關,2個控制交通燈,共輸出3種狀態紅、綠、黃、全滅。其中全滅開關狀態為00,黃燈開關狀態為01,綠燈開關狀態為10,紅燈狀態為11.8個開關控制兩位數碼管,數碼管採用7段數碼管,2位數碼管共14段顯示。可以採用4行4列的矩陣開關顯示。這樣正好需要8個開關。每個數碼管可顯示0-9.例如交通燈規律是綠燈40秒,閃爍4秒(也就是綠燈和全滅間隔顯示),黃燈3秒,紅燈20秒。
3. c51單片機控制交通燈要求用匯編語言
// 51單片機控制交通燈要求用匯編語言,模擬實例,可以參考一下
SNF EQU 00H ; 南北通行標志位
EWF EQU 01H ; 東西通行標志位
URF EQU 02H ; 緊急事件標志位
ORG 0000H
LJMP MAIN ; 上電轉主程序
ORG 000BH ; 定時中斷入口
LJMP DSZD
ORG 0003H ; 緊急中斷入口
LJMP URZD
ORG 0030H
MAIN: LCALL INIT ; 調用初始化子程序
LOOP: LCALL DIS ; 循環執行顯示子程序
AJMP LOOP
; *** *** *** 初始化程序
INIT: SETB SNF
SETB EWF
SETB URF
MOV R2,#20 ; 定時器中斷20次為1s
MOV TMOD,#01H ; 初始化定時器
MOV TL0,#0B0H
MOV TH0,#3CH
SETB EA ; 開定時中斷與緊急中斷
SETB ET0
SETB TR0
SETB EX0
SETB IT0 ; 設置中斷程式控制方式
MOV DPTR,#TAB ; 數值首地址放入DPTR中
MOV 40H,#40 ; 東南西北通行時間設置
MOV 41H,#40
MOV 30H,#40 ; 通行時間初始化
MOV 31H,#60
MOV P0,#4CH ; 初始化時南北通行並把交通燈狀態分別放在32H和33H中
MOV 32H,#4CH
MOV P2,#15H
MOV 33H,#15H
RET
; *** *** *** 顯示子程序
DIS: MOV P3,#0DFH ; 選中南北方向的十位數碼管
MOV A,30H ; 把顯示數據送人數碼管顯示
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P1,A ;
LCALL D1MS
MOV P3,#0EFH ; 選中南北方向的個位數碼管
MOV A,B ; 送入數碼管顯示
MOVC A,@A+DPTR
MOV P1,A
LCALL D1MS
MOV P3,#7FH ; 選中第東西方向的十位數碼管
MOV A,31H ; 送入數碼管顯示
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P1,A
LCALL D1MS
MOV P3,#0BFH ; 選中第東西方向的個位數碼管
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
LCALL D1MS
SETB P3.0
SETB P3.1
JNB P3.0,DIS_S ; 查詢是否第一個按鍵按下
JNB P3.1,DIS_E ; 查詢是否第二個按鍵按下
AJMP DIS_R ; 沒有鍵按下則返回
DIS_S:LCALL D5MS ; 按鍵去抖
JNB P3.0,DIS_SN
AJMP DIS_R
DIS_SN:MOV 40H,#50 ; 對通行時間從新分配,南北通行時間加長
MOV 41H,#30
AJMP DIS_R
DIS_E:LCALL D5MS ; 按鍵去抖
JNB P3.1,DIS_EW
AJMP DIS_R
DIS_EW:MOV 40H,#30 ; 東西通行時間加長
MOV 41H,#50
DIS_R:RET
; *** *** *** 定時中斷處理程序
DS_C: LJMP DS_R ; 接力跳轉
DSZD: PUSH ACC ; 保護現場
PUSH PSW
CLR TR0 ; 關定時器及中斷標志位並重新賦值
CLR TF0
MOV TL0,#0B0H
MOV TH0,#3CH
DJNZ R2,DS_C ; 判斷1m時間是否到達
MOV R2,#20 ; 到達重新賦值
DEC 30H ; 南北方向通行時間減一
MOV A,30H ; 把減一後的時間送入顯示存儲單元
; *** *** *** 南北通行到達最後4秒時黃燈閃爍
DS_10:CJNE A,#4,DS_11 ; 如果通行時間剩餘4秒
JNB SNF,DS_11 ; 判斷是否是南北通行
MOV P0,#8AH
MOV 32H, #8AH ; 把交通燈狀態存入存儲單元(後面類似)
DS_11:CJNE A,#3,DS_12 ; 不是剩餘3秒,返回
JNB SNF,DS_12 ; 不是南北通行時間,返回
MOV P0,#88H
MOV 32H, #88H
DS_12:CJNE A,#2,DS_13
JNB SNF,DS_13
MOV P0,#8AH
MOV 32H, #8AH
DS_13:CJNE A,#1,DS_14
JNB SNF,DS_14
MOV P0,#88H
MOV 32H, #88H
; *** *** ***
DS_14:JNZ DS_NE ; 通行時間沒有結束轉向改變東西方向的數碼管
CPL SNF ; 如果通行時間結束則對標志位取反
JNB SNF,DS_1 ; 判斷是否南北通行
MOV 30H,40H ; 是,點亮相應的交通燈
MOV P0,#4CH
MOV 32H,#4CH ; 存儲交通燈狀態
MOV P2,#15H
MOV 33H, #15H ; 存儲交通燈狀態
DS_NE:DEC 31H ; 東西方向通行時間減一
MOV A,31H ; 把通行剩餘時間送入顯示存儲單元
; *** *** *** 東西方向通行時間剩餘4秒鍾黃燈閃爍(程序注釋與南北方向類似 略)
DS_20:CJNE A,#4,DS_21
JB EWF,DS_21
MOV P0,#51H
MOV 32H, #51H
DS_21:CJNE A,#3,DS_22
JB EWF,DS_22
MOV P0,#41H
MOV 32H, #41H
DS_22:CJNE A,#2,DS_23
JB EWF,DS_23
MOV P0,#51H
MOV 32H, #51H
DS_23:CJNE A,#1,DS_24
JB EWF,DS_24
MOV P0,#41H
MOV 32H, #41H
; *** *** ***
DS_24:JNZ DS_R ; 東西方向時間沒有結束,返回
CPL EWF ; 對通行狀態取反
JNB EWF,DS_2 ; 東西方向通行時間到來,跳轉
MOV 31H,#80 ; 東西方向通行結束,重新顯示時間
MOV P0,#89H ; 點亮相應的交通燈
MOV 32H, #89H
MOV P2,#29H
MOV 33H, #29H
AJMP DS_R
DS_1: MOV 30H,#80 ; 南北通行時間結束,重新對顯示存儲單元賦值
MOV P0,#89H ; 執行轉彎狀態1
MOV 32H, #89H
MOV P2,#26H
MOV 33H, #26H
AJMP DS_NE
DS_2: MOV 31H,41H ; 東西方向開始通行,賦值予顯示存儲單元
MOV P0,#61H ; 點亮相應的交通燈
MOV 32H, #61H
MOV P2,#15H
MOV 33H, #15H
DS_R: SETB TR0
POP PSW ; 恢復現場
POP ACC
RETI
; *** *** *** 緊急中斷處理程序
URZD: PUSH ACC ; 保護現場
PUSH PSW
CLR IE0 ; 清除中斷標志位
CLR TR0 ; 關定時器
CPL URF ; 緊急事件標志位
JB URF,UR_CON ; 緊急結束;跳轉
MOV P0,#49H ; 各路口燈全顯示紅燈亮
MOV P2,#15H
AJMP UR_R
UR_CON:SETB TR0 ; 恢復正常交通
MOV A,32H
MOV P0,A
MOV A,33H
MOV P2,A
UR_R: POP PSW ; 恢復現場
POP ACC
RETI
; *** *** *** 查表指令0,1,2,3,4,5,6,7,8,9
TAB: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH
DB 7DH, 07H, 7FH, 6FH
; *** *** *** 延時5ms與1ms
D5MS: MOV R7,#5
D1MS: MOV R7,#10
MOV R6,#50
L1: DJNZ R6,$
DJNZ R7,L1
RET
4. 51單片機交通燈實驗錯誤
編程問題。51單片機交通燈為高校物理必修實驗之一,其中出現實驗錯誤是因為編程問題導致,需要將運行出錯的編程找出並編寫上正確代碼即可解決出錯問題。
5. 51單片機交通燈設計,求程序和模擬圖
手動模式:當東西向(或南北向)有特殊情況,可用開關K1(或K2)使東西向綠燈、南北向紅燈(南北向綠燈、東西向紅燈)。
6. 基於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/
7. 基於51單片機的交通燈控制設計
這個設計完了 可以在proteus下模擬的啊
可以交流
8. 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++);
}
9. 模擬交通燈套件一直閃爍
按鍵進入深夜模式四個方向黃燈閃爍提示車輛注意來往車輛,還可以通過按鍵調節綠燈通行的時間。
套件是基於51單片機的交通燈模擬設計,通過對單片機編程,控制數碼管顯示和LED亮滅的變化。有深夜模式,按鍵進入深夜模式四個方向黃燈閃爍提示車輛注意來往車輛,還可以通過按鍵調節綠燈通行的時間。本電路使用一個51單片機,結合一個2位數碼管和三色LED燈,模擬現實十字路口交通燈的工作狀態完成不同信號指示燈的亮滅燈及倒計時功能。另外可通過按鍵設置,使得倒計時的時間加減可調以及切換不同特定情況下的工作模式。按鍵1為交通燈深夜模式開/關,按下後進入深夜模式,4個方向LED(黃)閃爍,再次按下後則退出深夜模式,交通燈正常運行。按鍵2為調整時間開/關,上電後,交通燈正常運行,按下此按鍵後,進入調時模式,此時按鍵3和4均有效,按鍵3為通行時間加,按鍵4通行時間減。設定好通行時間後,按鍵2 再次按下,退出調時模式。交通燈按照您調整好的時間開始正常運行。正常運行時,按鍵3 和 按鍵4 均無效。
10. 用51單片機製作交通燈電路問題
不用再重新寫一遍程序,只要用燒錄程序的軟體就可以下載到單片機上!用stc-isp把你用keil生成的hex文件燒錄到單片機上就好!你Q給我 我把那軟體發給你!