導航:首頁 > 操作系統 > 51單片機打出汽車左右轉向燈代碼

51單片機打出汽車左右轉向燈代碼

發布時間:2023-04-04 12:03:50

❶ 求教大神51單片機匯編語言p1口轉向燈實驗問題~~~~~~~~~~

找個代做的去吧 我們學校的很多這樣都是

❷ 求人幫我做一段51晶元十字路口交通燈程序

ORG 0000H ;主程序的入口地址
LJMP MAIN ;跳轉到主程序的開始處
ORG 0003H ;外部中斷0的中斷程序入口地址
ORG 000BH ;定時器0的中斷程序入口地址
LJMP T0_INT ;跳轉到中斷服務程序處
ORG 0013H ;外部中斷1的中斷程序入口地址
MAIN : MOV SP,#50H
MOV IE,#8EH ;CPU開中斷,允許T0中斷,T1中斷和外部中斷1中斷
MOV TMOD,#51H ;設置T1為計數方式,T0為定時方式,且都工作於模式1
MOV TH1,#00H ;T1計數器清零
MOV TL1,#00H
SETB TR1 ;啟動T1計時器
SETB EX1 ;允許INT1中斷
SETB IT1 ;選擇邊沿觸發方式
MOV DPTR ,#0003H
MOV A, #80H ;給8255賦初值,8255工作於方式0
MOVX @DPTR, A
AGAIN: JB P3.1,N0 ;判斷是否要設定東西方向紅綠燈時間的初值,若P3.1為1 則跳轉
MOV A,P1
JB P1.7,RED ;判斷P1.7是否為1,若為1則設定紅燈時間,否則設定綠燈時間
MOV R0,#00H ;R0清零
MOV R0,A ;存入東西方向綠燈初始時間
MOV R3,A
LCALL DISP1
LCALL DELAY
AJMP AGAIN
RED: MOV A,P1
ANL A,#7FH ;P1.7置0
MOV R7,#00H ;R7清零
MOV R7,A ;存入東西方向紅燈初始時間
MOV R3,A
LCALL DISP1
LCALL DELAY
AJMP AGAIN
;-------------------------------------------
N0: SETB TR0 ;啟動T0計時器
MOV 76H,R7 ;紅燈時間存入76H
N00: MOV A,76H ;東西方向禁止,南北方向通行
MOV R3,A
MOV DPTR,#0000H ;置8255A口,東西方向紅燈亮,南北方向綠燈亮
MOV A,#0DDH
MOVX @DPTR, A
N01: JB P2.0,B0
N02: SETB P3.0
CJNE R3,#00H,N01 ;比較R3中的備則值是否為0,不為0轉稿滾陪到當前指令處執行
;------黃燈閃爍5秒程序------
N1: SETB P3.0
MOV R3,#05H
MOV DPTR,#0000H ;置8255A口,東西,南北方向黃燈亮
MOV A,#0D4H
MOVX @DPTR,A
N11: MOV R4,#00H
N12: CJNE R4,#7DH,$ ;黃燈持續亮0.5秒
N13: MOV DPTR,#0000H ; 置8255A口,南北方向黃燈滅
MOV A,#0DDH
MOVX @DPTR,A
N14: MOV R4,#00H
CJNE R4,#7DH,$ ;黃燈持續滅0.5秒
CJNE R3,#00H,N1 ;閃爍時間達5秒則退出
;------------------------------------------------------------
N2: MOV R7,#00H
MOV A,R0 ;東西通行,南北禁止
MOV R3,A
MOV DPTR,#0000H ; 置8255A口,東西方向綠燈亮,南北方向紅燈亮
MOV A,#0EBH
MOVX @DPTR,A
N21: JB P2.0,T03

N22: CJNE R3,#00H,N21
;------黃燈閃爍5秒程序------
N3: MOV R3,#05H
MOV DPTR,#0000H ;置鍵蠢8255A口,東西,南北方向黃燈亮
MOV A,#0E2H
MOVX @DPTR,A
N31: MOV R4,#00H
CJNE R4,#7DH,$ ;黃燈持續亮0.5秒
N32: MOV DPTR,#0000H ; 置8255A口,南北方向黃燈滅
MOV A,#0EBH
MOVX @DPTR,A
N33: MOV R4,#00H
CJNE R4,#7DH,$ ;黃燈持續滅0.5秒
CJNE R3,#00H,N3 ;閃爍時間達5秒則退出
SJMP N00
;------闖紅燈報警程序------
B0: MOV R2,#03H ;報警持續時間3秒
B01: MOV A,R3
JZ N1 ;若倒計時完畢,不再報警
CLR P3.0 ;報警
CJNE R2,#00H,B01 ;判斷3秒是否結束
SJMP N02
;------1秒延時子程序-------
N7: RETI
T0_INT:MOV TL0,#9AH ;給定時器T0送定時10ms的初值
MOV TH0,#0F1H
INC R4
INC R5
CJNE R5,#0FAH,T01 ;判斷延時是否夠一秒,不夠則調用顯示子程序
MOV R5,#00H ;R5清零
DEC R3 ;倒計時初值減一
DEC R2 ;報警初值減一
T01: ACALL DISP ;調用顯示子程序
RETI ;中斷返回
;------顯示子程序------
DISP: JNB P2.4,T02
DISP1: MOV B,#0AH
MOV A,R3 ;R3中值二轉十顯示轉換
DIV AB
MOV 79H,A
MOV 7AH,B
DIS: MOV A,79H ;顯示十位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#0002H
MOVX @DPTR,A
MOV DPTR,#0001H
MOV A,#0F7H
MOVX @DPTR,A
LCALL DELAY
DS2: MOV A,7AH ;顯示個位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#0002H
MOVX @DPTR,A
MOV DPTR,#0001H
MOV A,#0FBH
MOVX @DPTR,A
RET
;------東西方向車流量檢測程序------
T03: MOV A,R3
SUBB A,#00H ;若綠燈倒計時完畢,不再檢測車流量
JZ N3
JB P2.0,T03
INC R7
CJNE R7,#64H,E1
MOV R7,#00H ;中斷到100次則清零
E1: SJMP N22
;------東西方向車流量顯示程序------
T02: MOV B,#0AH
MOV A,R7 ;R7中值二轉十顯示轉換
DIV AB
MOV 79H,A
MOV 7AH,B
DIS3: MOV A,79H ;顯示十位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#0002H
MOVX @DPTR,A
MOV DPTR,#0001H
MOV A,#0F7H
MOVX @DPTR,A
LCALL DELAY
DS4: MOV A,7AH ;顯示個位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#0002H
MOVX @DPTR,A
MOV DPTR,#0001H
MOV A,#0FBH
MOVX @DPTR,A
LJMP N7
;------延時4MS子程序----------
DELAY: MOV R1,#0AH
LOOP: MOV R6,#64H
NOP
LOOP1: DJNZ R6,LOOP1
DJNZ R1,LOOP
RET
;------字元表------
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
我有書,M我,給你參考

❸ 單片機汽車轉向燈程序

如果你的燈接的是51單片機的P0.1口,並且輸出高電平為點亮,並且要求轉向燈是一秒一次的閃爍。那麼,C語言程序如下:#include <51.h>viod delay(viod){ int i,k;for(i=0;i<1000;i++)知雀{forf(k=0;k<1000;k++){;}} main(){while(1){p0^1=1;搭中早delay(void);p0^1=0;delay(void);}}對了,你在想想單按鍵程培兄序設計,比如按鍵接在P0.2口上。然後把鍵盤程序函數嵌入上面的mian就好。

❹ 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

❺ 單片機中的交通燈代碼

#include<reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
//定義三個燈
sbitsw1=P3^0;
sbitsw2=P3^1;
sbitsw3=P3^2;

sbitkey_ew=P3^3;
sbitkey_sn=P3^4;
sbitBZ=P3^5;

ucharTH,TL;
ucharSN=30,EW=25,NN=60;
uinttt,ii,jj,kk;


//數碼管,應該是7seg,0-9
ucharcodeDisCode[]
={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

ucharDisbuff0[2];
ucharDisbuff1[2];

voidDelay(uintx)//MS延時
{
uchari;
while(x--)
{
for(i=0;i<123;i++);
}
}

voidinit()//對中斷的初始化
{
TMOD=0x01;
TH=(65536-4000)/256;//設置初始值
TL=(65536-4000)%256;
和毀肆TH0=TH;
TL0=TL;
EA=1;//開中斷開關
ET0=1;
TR0=1;
}

voidfenli0()
{
Disbuff0[0]=SN/10;
Disbuff0[1]=SN%10;
}

voidfenli1()
{
Disbuff1[0]=EW/10;
Disbuff1[1]=EW%10;
}

voidDisplay()
{
ucharii;
if(ii==0)
{
P0=0x80;
P2=0x80;
P2=DisCode[Disbuff0[0]]|0x80;
P0=DisCode[Disbuff1[0]]&0x7f;
}
else
{
P0=0x80;
P2=0x80;
余罩P2=DisCode[Disbuff0[1]]&0x7f;
喚轎P0=DisCode[Disbuff1[1]]|0x80;
}
}

這程序沒寫完,沒有主程序調用

❻ 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++);

}


❼ 51單片機C程序怎樣把LED燈從左到右點亮然後又從右到左點亮然後循環

#include<reg51.h>

unsigned char ledtab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}
void delay(unsigned char a)
{
unsigned char i,j;
for(i=0;i<a;i++)
for(j=0;j<120;j++);
}
main()
{
unsigned char i;
while(1)
{
for(i=0;i<8;i++){P0=ledtab[i];delay(100);}
for(i=0;i<8;i++){P0=ledtab[7-i];delay(100);}
}
}

❽ (1)利用51單片機、開關和發光二極體做一個汽車轉向燈系統; (2)右轉:右燈頭,右尾燈亮;

程亂世滑序返臘見附件嘩臘。

❾ 用51單片機編寫城市道路交通燈c語言程序,有左轉右轉

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit RED_A=P3^0; //東西向指示燈
sbit YELLOW_A=P3^1;
sbit GREEN_A=P3^2;
sbit RED_B=P3^3; //南北向指示燈
sbit YELLOW_B=P3^4;
sbit GREEN_B=P3^5;
sbit KEY1=P1^0;
sbit KEY2=P1^1;
sbit KEY3=P1^2;
//延時倍數,閃爍次數,操作類型變數
uchar Flash_Count=0,Operation_Type=1,LEDsng,LEDsns,LEDewg,LEDews,discnt;
uint Time_Count=0,time;
uchar ledtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
void displaysn()
{
LEDsng=((time-Time_Count)/20)%10;
LEDsns=((time-Time_Count)/20)/10;
LEDewg=0x10;
LEDews=0x10;
}
void displayew()
{
LEDewg=((time-Time_Count)/20)%10;
LEDews=((time-Time_Count)/20)/10;
LEDsng=0x10;
LEDsns=0x10;
}
//定時器0 中斷函數
void T0_INT() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
switch(Operation_Type)
{
case 1: //東西向綠燈與南北向紅燈亮
if((Time_Count%20)==0)displayew();
RED_A=0;YELLOW_A=0;GREEN_A=1;
RED_B=1;YELLOW_B=0;GREEN_B=0;
if(++Time_Count!=time) return;
Time_Count=0;
Operation_Type=2;
break;
case 2: //東西向黃燈開始閃爍,綠燈關閉
LEDewg=0x0;
LEDews=0x0;
if(++Time_Count!=8) return;
Time_Count=0;
YELLOW_A=~YELLOW_A;GREEN_A=0;
if(++Flash_Count!=10) return; //閃爍
Flash_Count=0;
Operation_Type=3;
break;
case 3: //東西向紅燈與南北向綠燈亮
if((Time_Count%20)==0)displaysn();
RED_A=1;YELLOW_A=0;GREEN_A=0;
RED_B=0;YELLOW_B=0;GREEN_B=1;
if(++Time_Count!=time) return;
Time_Count=0;
Operation_Type=4;
break;
case 4: //南北向黃燈開始閃爍,綠燈關閉
LEDsng=0x0;
LEDsns=0x0;
if(++Time_Count!=8) return;
Time_Count=0;
YELLOW_B=~YELLOW_B;GREEN_A=0;
if(++Flash_Count!=10) return; //閃爍
Flash_Count=0;
Operation_Type=1;
break;
}
}
void t1_isr() interrupt 3
{
TR1=0;
TH1=(65536-3000)/256;
TL1=(65536-3000)%256;
TR1=1;
switch(discnt)
{
case 0:
P2=0x02;
P0=ledtab[LEDewg];
break;
case 1:
P2=0x01;
P0=ledtab[LEDews];
break;
case 2:
P2=0x08;
P0=ledtab[LEDsng];
break;
case 3:
P2=0x04;
P0=ledtab[LEDsns];
break;
default:discnt=0;break;
}
discnt++;
discnt&=0x03;
}
void delay()
{
uint i;
for(i=0;i<1000;i++);
}
//主程序
void main()
{
TMOD=0x11; //T0 方式1
EA=1;
ET0=1;
TR0=1;
TH1=(65536-3000)/256;
TL1=(65536-3000)%256;
TR1=1;
ET1=1;
time=100;
Time_Count=100;
Time_Count=0;
Operation_Type=1;
while(1)
{
if(KEY1==0) //按一下加1S
{
delay();
if(KEY1==0)
{
while(KEY1==0);
TR0=0;
time+=20;
LEDsng=(time/20)%10;
LEDsns=(time/20)/10;
LEDewg=0x10;
LEDews=0x10;
}
}
if(KEY2==0) //按一下減1S
{
delay();
if(KEY2==0)
{
while(KEY2==0);
TR0=0;
time-=20;
if(time==0)time=20;
LEDewg=(time/20)%10;
LEDews=(time/20)/10;
LEDsng=0x10;
LEDsns=0x10;
}
}
if(KEY3==0) //啟動
{
delay();
if(KEY3==0)
{
while(KEY2==0);
TR0=1;
Time_Count=0;
}
}
}
}

閱讀全文

與51單片機打出汽車左右轉向燈代碼相關的資料

熱點內容
如何查看電腦系統伺服器ip地址查詢 瀏覽:389
把文件夾設鎖 瀏覽:570
命令行語句 瀏覽:218
企友3e財務如何連接伺服器 瀏覽:984
華為手機如何刪除卸載app殘留數據 瀏覽:543
rpm的命令作用 瀏覽:365
如何查看網站的伺服器時間 瀏覽:850
編譯局和人民出版社 瀏覽:652
java泛型extends 瀏覽:326
頭條程序員教學 瀏覽:772
安卓合並什麼意思 瀏覽:530
linux在光碟引導 瀏覽:537
imap伺服器地址怎麼查 瀏覽:654
作曲教程pdf 瀏覽:506
pr怎麼壓縮文件大小 瀏覽:863
查看oracle字元集命令 瀏覽:179
鋰電池增加密度 瀏覽:661
linux用戶密碼忘記 瀏覽:242
gb壓縮天然氣 瀏覽:635
圖片拼接不壓縮app 瀏覽:670