
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
}
}
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)