设计一个交通灯控制电路程序(单片机)

设计一个交通灯控制电路程序(单片机),第1张

交通灯模拟实验程序

GEWEI EQU 21H 个位数据

SHIWEI EQU 23H十位数据

SCANLED EQU 25H

SCANMODE EQU 26H

RED EQU 28H 定义灯的缓冲区

GREEN EQU 29H

YELLOW EQU 32H

NUMTIM EQU 33H

LED EQU 34H

ORG 000H

JMP START

ORG 0BH

JMP TIMER0 定时器0中断入口

ORG 100H

START:MOV SP,#50H

MOV R0,#20H

MOV R5,#20

CLR0:MOV @R0,#00H

INC R0

DJNZ R5,CLR0

MOV TMOD,#01H 设置定时器

MOV TH0,#HIGH(65536-5000)

MOV TL0,#LOW(65536-5000)

SETB TR0

MOV IE,#10000010B端口初始化

MOV P0,#0FFH

MOV P1,#0FFH

MOV P2,#00H

MOV P3,#0FFH

MOV R3,#10

MOV R2,#3

MOV R1,#10

MOV R7,#200

MOV RED,#10

MOV YELLOW,#3

MOV GREEN,#10

MOV NUMTIM,#10

MOV LED,#0FFH

AJMP $

============================================================= TIMER0:PUSH ACC 定时器部分,负责交通灯的及时和数码管动态扫描

PUSH PSW

MOV TH0,#HIGH(65536-5000) 重新赋初值

MOV TL0,#LOW(65536-5000)

DJNZ R7,RET0

MOV R7,#200

MOV A,SCANMODE 调用扫描

MOV B,#4

DIV AB

MOV A,B

RLA

MOV DPTR,#TAB_SCAN

JMP @A+DPTR

TAB_SCAN: AJMP RED_LIGHT

AJMP YEL_LIGHT

AJMP GRE_LIGHT

AJMP YEL_LIGHT

RET0: MOV A,NUMTIM

LCALL BIN_BCD

MOV SHIWEI,A

MOV GEWEI,B

INC SCANLED

MOV A,SCANLED

MOV B,#4

DIV AB

MOV A,B

RLA

MOV DPTR,#TAB_SCAN0

JMP @A+DPTR

TAB_SCAN0:AJMP SCAN_L1

AJMP SCAN_L2

SCAN_L1: MOV P2,#0

MOV A,SHIWEI

JMP END_SCAN

SCAN_L2: MOV P2,#1

MOV A,GEWEI

JMP END_SCAN

END_SCAN:MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

MOV A,LED

MOV P1,A

POP PSW

POP ACC

RETIRED_LIGHT:MOV LED,#11111100B

MOV NUMTIM,RED

DEC RED

MOV A,RED

CJNE A,#0FFH,RET0

MOV RED,#10

MOV A,SCANMODE

ADD A,#01H

MOV SCANMODE,A

JMP RET0

YEL_LIGHT:MOV LED,#11110011B

MOV NUMTIM,YELLOW

DEC YELLOW

MOV A,YELLOW

CJNE A,#0FFH,RET0

MOV YELLOW,#3

MOV A,SCANMODE

ADD A,#01H

MOV SCANMODE,A

JMP RET0

GRE_LIGHT:MOV LED,#11001111B

MOV NUMTIM,GREEN

DEC GREEN

MOV A,GREEN

CJNE A,#0FFH,RET1

MOV GREEN,#10

MOV A,SCANMODE

ADD A,#01H

MOV SCANMODE,A

RET1:JMP RET0 BIN_BCD:MOV B,#10

DIV AB

RET DELAY: MOV R5,#02

D1: MOV R6,#200

D2: MOV R7,#200

DJNZ R7,$

DJNZ R6,D2

DJNZ R5,D1

RETTABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH共阴字码表

DB 07H,7FH,6FH,77H,7CH,39H,5EH

DB 79H,71H,76H,73H,3EH,00HEND

#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=0YELLOW_A=0GREEN_A=1

RED_B=1YELLOW_B=0GREEN_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_AGREEN_A=0

if(++Flash_Count!=6) return//闪烁

Flash_Count=0

Operation_Type=3

break

case 3: //东西向红灯与南北向绿灯亮

if((Time_Count%20)==0)displaysn()

RED_A=1YELLOW_A=0GREEN_A=0

RED_B=0YELLOW_B=0GREEN_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_BGREEN_A=0

if(++Flash_Count!=6) 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=0break

}

discnt++

discnt&=0x03

}

void delay()

{

uint i

for(i=0i<1000i++)

}

//主程序

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=120

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

}

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11057270.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-13
下一篇2023-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存