① 模拟交通灯套件一直闪烁
按键进入深夜模式四个方向黄灯闪烁提示车辆注意来往车辆,还可以通过按键调节绿灯通行的时间。
套件是基于51单片机的交通灯模拟设计,通过对单片机编程,控制数码管显示和LED亮灭的变化。有深夜模式,按键进入深夜模式四个方向黄灯闪烁提示车辆注意来往车辆,还可以通过按键调节绿灯通行的时间。本电路使用一个51单片机,结合一个2位数码管和三色LED灯,模拟现实十字路口交通灯的工作状态完成不同信号指示灯的亮灭灯及倒计时功能。另外可通过按键设置,使得倒计时的时间加减可调以及切换不同特定情况下的工作模式。按键1为交通灯深夜模式开/关,按下后进入深夜模式,4个方向LED(黄)闪烁,再次按下后则退出深夜模式,交通灯正常运行。按键2为调整时间开/关,上电后,交通灯正常运行,按下此按键后,进入调时模式,此时按键3和4均有效,按键3为通行时间加,按键4通行时间减。设定好通行时间后,按键2 再次按下,退出调时模式。交通灯按照您调整好的时间开始正常运行。正常运行时,按键3 和 按键4 均无效。
② 基于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/
③ 单片机设计急救车优先的交通灯控制
ORG 0000H
LJMP STAR
STAR:MOV P1,#00H
MOV P0,#0FFH
MOV P3,#00H
setb p1.6
L1:CLR P1.7
JB P1.0 , WAN ;;判断方式转换
;;MOV P3,#00H ;;P3口清零
SETB P3.2 ;;主干绿灯
SETB P3.3 ;;次道红灯
MOV 31H,#03CH ;;付初值60秒
MOV R4,#03CH
L2 :CALL DIS1 ;;调用显示
CALL YS
clr p1.6
DEC R4 ;;减一
DJNZ 31H,L2 ;;判断是否计数完成
CLR P3.2 ;;主黄灯亮
CLR P3.3
SETB P3.1
mov 32H,#05H
MOV R4 ,#05H
L3:
setb p3.3
CALL DIS1 ;;调用显示
CALL YS
DEC R4
CLR p3.3
DJNZ 32H,L3
CLR P3.1
CLR P3.4
SETB P3.0
SETB P3.5
mov 33H ,#020H ;;主干红灯 次道绿灯20秒
MOV R4,#02DH
setb p1.6
L4 :
CALL DIS1
CALL YS
clr p1.6
DEC R4
DJNZ 33H,L4
CLR P3.2 ;;次道黄灯亮5秒钟
CLR P3.5
setb p3.4
mov 34h,#05h
MOV R4 ,#05H
L8:setb p3.0
CALL DIS1
CALL YS
clr p3.0
CALL DIS1
CALL YS
setb p3.0
clr p3.0
DEC R4
DJNZ 34H,L8
LJMP L1
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
wan:SETB P1.7
JB P1.0 , L1 ;;判断方式转换
MOV P3,#00H ;;P3口清零
SETB P3.2 ;;主干绿灯
SETB P3.3 ;;次道红灯
MOV 31H,#040D ;;付初值60秒
MOV R4,#040D
L12 :CALL DIS1 ;;调用显示
CALL YS
DEC R4 ;;减一
DJNZ 31H,L12 ;;判断是否计数完成
CLR P3.2 ;;主黄灯亮
CLR P3.3
SETB P3.1
mov 32H,#05H
MOV R4 ,#05H
L13: CALL DIS1
CALL YS
setb p3.3
CALL DIS1
CALL YS
DEC R4
CLR p3.3
DJNZ 32H,L13
CLR P3.1
CLR P3.4
SETB P3.0
SETB P3.5
mov 33H ,#010H ;;主干红灯 次道绿灯20秒
MOV R4,#010H
L14 :CALL DIS1
CALL YS
CALL DIS1
DEC R4
DJNZ 33H,L14
CLR P3.2 ;;次道黄灯亮5秒钟
CLR P3.5
setb p3.4
mov 34h,#05h
MOV R4 ,#05H
L18:setb p3.0
CALL DIS1
CALL YS
clr p3.0
CALL DIS1
CALL YS
setb p3.0
clr p3.0
DEC R4
DJNZ 34H,L18
LJMP WAN
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
YS: MOV 72H,#80D
LOOP3:MOV 71H,#100D
LOOP1:MOV 70H,#22D
LOOP0:DJNZ 70H,LOOP0
DJNZ 71H,LOOP1
MOV 70H,#46D
LOOP2:DJNZ 70H,LOOP2
DJNZ 72H,LOOP3
MOV 70H,#48D
LOOP4:DJNZ 70H,LOOP4
RET
Dis1: mov A,r4
mov B,#10D
div AB
lcall SEG7
CLR P2.0
mov P0,A
lcall DLY
mov A,B
lcall SEG7
SETB P2.0
mov P0,A
lcall DLY
RET
SEG7: MOV DPTR,#TAB
movc A,@A+DPTR
RET
TAB:DB 03FH,006H,05BH,04FH,066H
DB 06DH,07DH,007H, 07FH,06Fh
DLY:
mov R7,#2D
D1: mov R6,#249D
DJNZ R6,$
DJNZ R7,D1
RET
④ 单片机开发板的灯总是闪烁怎么回事
1、单片机里面没有任何程序或杂乱的数据,有可能闪烁,这是由于单片机总是自动复位造成的。
2、单片机有程序控制LED闪烁。
3、开发板有问题,比如电源不稳,其他硬件毛病等,闪烁也可能发生。
⑤ 单片机交通灯程序
采用51单片机作为系统的MCU,基本完成控制两组交通指示灯交替亮
每个街口有左拐、直行及行人三种指示灯。直行灯每个灯有红、黄、绿三种颜色。自行车与汽车共用左拐和直行灯。
首先东西向直行绿灯和行人灯亮1分钟,左转灯亮30秒,黄灯亮5秒(同时南北向红灯亮95秒),然后东西向红灯亮95秒钟(同时首先南北向直行绿灯和行人灯亮1分钟,左转灯亮30秒,黄灯亮5秒),然后东西向的绿灯亮,依次类推。
每次绿灯亮的时候,对应的行人灯亮。
60S/30S/5S/60S/30S/5S
东西道
绿和行人/左转/黄/红/红/红
南北道
红/红/红/绿和行人/左转/黄
行人灯亮的时候有声音提示盲人能通过。
突发交通事故的时候能够紧急全红灯。
在有重要人物通过的时候能手动改为绿灯。
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
⑥ 单片机控制的交通灯
题目 交通灯控制系统的设计 一、课程设计的目的与要求 1、课程设计目的: (1)进一步理解和消化书本知识,运用所学知识和技能进行简单的设计。 (2)通过课程设计提高应用能力,分析问题和解决问题的能力。 (3)培养查阅资料的习惯,训练和提高自学,独立思考的能力。 2、课程设计要求 交通灯控制系统的设计 1) 掌握在单片机系统中扩展简单I/O接口的方法。 2) 掌握数据输出程序的设计方法。 3) 掌握模拟交通灯控制的实现方法。 4) 掌握外部中断技术的基本使用方法。 5) 掌握中断处理程序的编程方法。 从课程设计的目的出发,通过设计工作的各个环节,达到以下要求: (1)能够正确理解课程设计的题目和意义,全面思考问题。 (2)运用科学合理的方法,认真按时完成。 二、课程设计课题的分析 1、电路的设计 1)原理 要完成本实验,首先必须了解交通灯的亮灭规律。本实验需要用到试验箱上八个发光二极管中的六个,即红、绿、黄各两个。将L1(红)、L2(绿)、L3(黄)作为东西方向的指示灯,将L5(红)、L6(绿)、L7(黄)作为南北方向的指示灯。交通灯的亮灭规律为:初始态是两个路口的红灯全亮,之后,东西路口的绿灯亮,南北路口的红灯亮,东西方向通车,延时一段时间后,东西路口绿灯灭,黄灯开始闪烁。闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北方向开始通车,延时一段时间后,南北路口的绿灯灭,黄灯开始闪烁。闪烁若干次后,再切换到东西路口方向,重复上述过程。 各发光二极管的阳极通过保护电阻接到+5V的电源上,阴极接到输入端上,因此使其点亮使相应使相应输入端为低电平。 当有急救车到达时,两个方向上的红灯亮,以便让急救车通过,假设急救车通过路口的时间为10秒,急救车通过后,交通灯恢复中断前的状态。本程序以单次脉冲为中断申请,表示有急救车通过,单次脉冲输出端P-接CPU板上的INT0。 2)、硬件电路图 图1—1 交通灯控制系统的硬件接线图 74LS273的输出00—07接发光二极管L1—L8,74LS273的片选CS273接片选信号CS2,此时74LS273的片选地址为CFA0—CFA7之间任选。 3)、程序流程图 主程序流程 图1—2 主程序软件流程图 中断程序流程图 三、课程设计的结果 1、程序 NAME JIAOTONGGENG OUTPORT EQU 0CFB0H ;端口地址 SAVE EQU 55H ;SAVE保存从端口CFA0输出的数据 CSEG AT 0000H LJMP START CSEG AT 4003H LJMP INT CSEG AT 4100H START: SETB IT0 ;中断程序初始化 SETB EX0 SETB EA MOV A,#11H ;置首显示码,两红灯全亮 MOV SAVE,A ;保存 ACALL DISP ;显示输出 ACALL DE3S ;延时3秒 LLL: MOV A,#12H ;东西路口绿灯亮,南北路口红灯亮 MOV SAVE,A ACALL DISP ACALL DE10S ;延时10秒 MOV A,#10H ;东西路口绿灯灭 MOV SAVE,A ACALL DISP MOV R2,#05H ;东西路口黄灯闪烁5次 TTT: MOV A,#14H MOV SAVE,A ACALL DISP ACALL DE02S ;延时0.2秒 MOV A,#10H MOV SAVE,A ACALL DISP ACALL DE02S DJNZ R2,TTT MOV A,#11H ;红灯全亮 MOV SAVE,A ACALL DISP ACALL DE02S ;延时0.2秒 MOV A,#21H ;东西路口红灯亮,南北路口绿灯亮 MOV SAVE,A ACALL DISP ACALL DE10S ;延时10秒 MOV A,#01H ;南北路口绿灯灭 MOV SAVE,A ACALL DISP MOV R2
⑦ 交通灯 C语言 单片机。中断函数问题
参考《51单片机C语言创新教程》温子祺等着。
源码转自:《51单片机C语言创新教程》。
/*实验名称:交通灯实验
*描述:交通灯实验要求红灯亮15秒,绿灯亮10秒,黄灯亮5秒,
当红灯切换为绿灯或者绿灯切换为红灯,
要实现灯闪烁。红灯、绿灯、黄灯的点亮持续时间可以通过串口来修改,
并在下一个循环中更新数值。
*作者:温子祺
*修改日期:2010/5/4
*说明:代码注释与讲解详见《51单片机C语言创新教程》温子祺等着,北京航空航天大学出版社
*/
#include"stc.h"
typedefunsignedcharUINT8;
typedefunsignedint UINT16;
typedefunsignedlongUINT32;
typedefcharINT8;
typedefintINT16;
typedeflongINT32;
#defineTIMER0_INITIAL_VALUE5000
#defineHIGH1
#defineLOW0
#defineON1
#defineOFF0
#defineSEG_PORTP0
#defineLS164_DATA(x){if((x))P0_4=1;elseP0_4=0;}
#defineLS164_CLK(x){if((x))P0_5=1;elseP0_5=0;}
#defineNORTH_R_LIGHT(x){if((x))P2_0=0;elseP2_0=1;}
#defineNORTH_Y_LIGHT(x){if((x))P2_1=0;elseP2_1=1;}
#defineNORTH_G_LIGHT(x){if((x))P2_2=0;elseP2_2=1;}
#defineSOUTH_R_LIGHT(x){if((x))P2_3=0;elseP2_3=1;}
#defineSOUTH_Y_LIGHT(x){if((x))P2_4=0;elseP2_4=1;}
#defineSOUTH_G_LIGHT(x){if((x))P2_5=0;elseP2_5=1;}
#defineTRAFFIC_STATUS_10
#defineTRAFFIC_STATUS_21
#defineTRAFFIC_STATUS_32
#defineUART_MARKER0xEE
UINT8Timer0IRQEvent=0;
UINT8Time1SecEvent=0;
UINT8Time500MsEvent=0;
UINT8TimeCount=0;
UINT8SegCurPosition=0;
UINT8LightOrgCount[4]={15,5,15,5};
UINT8LightCurCount[4]={15,5,15,5};
UINT8TrafficLightStatus=0;
codeUINT8SegCode[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
UINT8SegBuf[4]={0};
codeUINT8SegPosition[4]={0x07,0x0b,0x0d,0x0e};
typedefstruct_LIGHT_VAL
{
UINT8Head;
UINT8val[4];
}LIGHT_VAL;
typedefunion_LIGHT_VAL_EX
{
LIGHT_VALlv;
UINT8p[5];
}LIGHT_VAL_EX;
voidLS164Send(UINT8byte)
{
UINT8j;
for(j=0;j<=7;j++)
{
if(byte&(1<<(7-j)))
{
LS164_DATA(HIGH);
}
else
{
LS164_DATA(LOW);
}
LS164_CLK(LOW);
LS164_CLK(HIGH);
}
}
voidRefreshDisplayBuf(UINT8s1) //刷新显示缓存
{
SegBuf[0]=s1%10;
SegBuf[1]=s1/10;
SegBuf[2]=s1%10;
SegBuf[3]=s1/10;
}
voidSegDisplay(void)
{
UINT8t;
t=SegCode[SegBuf[SegCurPosition]];
SEG_PORT|=0x0f;
LS164Send(t);
SEG_PORT=(SEG_PORT|0x0f)&SegPosition[SegCurPosition];
if(++SegCurPosition>=4)
{
SegCurPosition=0;
}
}
voidTimerInit(void)
{
TH1=0;
TL1=0;
TH0=(65536-TIMER0_INITIAL_VALUE)/256;
TL0=(65536-TIMER0_INITIAL_VALUE)%256;//定时1MS
TMOD=0x51; /*01010001T1计数,T0定时*/
}
voidTimer0Start(void)
{
TR0=1; //启动计时器1
ET0=1;
}
voidTimer0Stop(void)
{
TR0=0; //启动计时器1
ET0=0;
}
voidPortInit(void)
{
P0=P1=P2=P3=0xFF;
}
voidUartInit(void)
{
SCON=0x40;
T2CON=0x34;
RCAP2L=0xD9;
RCAP2H=0xFF;
REN=1;
ES=1;
}
voidUartSendByte(UINT8byte)
{
SBUF=byte;
while(TI==0);
TI=0;
}
voidUartPrintfString(INT8*str)
{
while(str&&*str)
{
UartSendByte(*str++);
}
}
voidmain(void)
{
UINT8i=0;
PortInit();
TimerInit();
Timer0Start();
UartInit();
RefreshDisplayBuf(LightCurCount[0]);
EA=1;
NORTH_R_LIGHT(ON);
SOUTH_G_LIGHT(ON);
while(1)
{
if(Timer0IRQEvent)
{
Timer0IRQEvent=0;
TimeCount++;
if(TimeCount>=200)
{
TimeCount=0;
if(LightCurCount[0])
{
TrafficLightStatus=0;
}
elseif(LightCurCount[1])
{
TrafficLightStatus=1;
}
elseif(LightCurCount[2])
{
TrafficLightStatus=2;
}
elseif(LightCurCount[3])
{
TrafficLightStatus=3;
}
else
{
for(i=0;i<4;i++)
{
LightCurCount[i]=LightOrgCount[i];
}
TrafficLightStatus=0;
}
switch(TrafficLightStatus)
{
case0:
{
NORTH_R_LIGHT(ON);
SOUTH_R_LIGHT(OFF);
NORTH_G_LIGHT(OFF);
SOUTH_G_LIGHT(ON);
NORTH_Y_LIGHT(OFF);
SOUTH_Y_LIGHT(OFF);
}
break;
case1:
{
if(LightCurCount[1]%2)
{
NORTH_R_LIGHT(ON);
SOUTH_G_LIGHT(ON);
}
else
{
NORTH_R_LIGHT(OFF);
SOUTH_G_LIGHT(OFF);
}
NORTH_Y_LIGHT(ON);
SOUTH_Y_LIGHT(ON);
}
break;
case2:
{
NORTH_R_LIGHT(OFF);
SOUTH_R_LIGHT(ON);
NORTH_G_LIGHT(ON);
SOUTH_G_LIGHT(OFF);
NORTH_Y_LIGHT(OFF);
SOUTH_Y_LIGHT(OFF);
}
break;
case3:
{
if(LightCurCount[3]%2)
{
NORTH_G_LIGHT(ON);
SOUTH_R_LIGHT(ON);
}
else
{
NORTH_G_LIGHT(OFF);
SOUTH_R_LIGHT(OFF);
}
NORTH_Y_LIGHT(ON);
SOUTH_Y_LIGHT(ON);
}
break;
default:break;
}
RefreshDisplayBuf(LightCurCount[TrafficLightStatus]);
LightCurCount[TrafficLightStatus]--;
}
SegDisplay();
}
}
}
voidUartIRQ(void)interrupt4
{
staticUINT8cnt=0;
staticLIGHT_VAL_EXLightValEx;
if(RI)
{
RI=0;
LightValEx.p[cnt++]=SBUF;
if(LightValEx.lv.Head==UART_MARKER)
{
if(cnt>=5)
{
for(cnt=1;cnt<5;cnt++)
{
LightOrgCount[cnt-1]=LightValEx.lv.val[cnt];
LightCurCount[cnt-1]=LightValEx.lv.val[cnt];
}
cnt=0;
UartPrintfString("设置交通灯完成 ");
}
}
else
{
cnt=0;
}
}
}
voidTimer0IRQ(void)interrupt1
{
ET0 =0;
TH0=(65536-TIMER0_INITIAL_VALUE)/256;
TL0=(65536-TIMER0_INITIAL_VALUE)%256;//定时1MS
Timer0IRQEvent=1;
ET0 =1;
}
=====================================================================
坐等拿分!
⑧ 急单片机交通灯程序修改~高手请进
及在学的学生自行设计和制造中档的、有市场竞争力的广泛产品,就是在提高民族的整体素质,这就是古人曰;取法乎上,仅得乎中;你们看高考状元、博士后、博导的效力更高吗?空谈创新、转型是浪费社会资源,糟蹋学生的宝贵青春时光,毁掉他们的前程,在发达国家和跨国公司面前抬不起头。做硬件非常地花费时间,费钱,没有几十年的连续不间断历练,没有财政支持,没有生产实践验证,没有商业实战建议,是空谈,而能走出来的人是十分稀少的,一个是淘汰率高,一个是没有金钱和时间支持,更重要的,是许许多多人,到了生命终了,都不知道自己错在哪里?什么没有做好?根本上就不知道在当时的历史条件、环境约束下,最佳的做法是什么?还是科科优秀,考个高考状元来的实惠,有说服力!!!就业是压倒一切的首要任务,是人类生存的根本!!!政府应该给穷人钱吗?应该公开科技馆展品的全部设计、加工、调整、部件采购地点资料,授人以渔,提高全民族、全体国民的素质。现在的教材都是一大抄,现在都时兴系统集成,高科技装配工,用钱砸就可以了。国家的战略机密当然要严格保密, 商业机密由受益者保护。
国外用社会资源完成的学术研究,一般是完全公开。 中国的许多用国家资源完成的研究,应该公开,高等院校的教材和实验书籍应该公开,否则加剧学术腐败!这是对使用国家和社会资源负责的体现。 在中国,知识公有化,实质内容和技术手段竞争公开化,实际装置可以在第三者免费复制,技术指标可以由独立的第三者测量、公开性能比较数据、指标,是彻底提升基础教育跨过久攻不克门槛的唯一途径,国家应该支付相关费用;这不是抄袭所能替代的。 本人在25年前设计的下一代键盘,因为没有专利申请资助,没有实验室,在几个行业中内部已经无偿公开。向科技博物馆、科普展览馆提供创新展项,公开所有设计、采购、加工、调试、维修资料,提高全国国民的基础素质。谁能给我讲讲70 80年代的事啊 要贴近生活的,讲讲老一辈人的经历就行70年代教材、工业设备、技术革新资料完全公开,全国相互学习,毫无保留地各地交流,原材料、设备利用率最高,从各种机床、汽车、线切割机、电火花加工机床、水泵、内燃机、电动机、钟表、自行车、灯具等等的零配件全国通用、互换性好,基础图纸公开,全国统一设计DDZ仪表、全国统一设计N1钟芯等等。80年代
⑨ 急求单片机设计《急救车优先的交通灯控制》
/*没有使用中断,硬件包括单片机、电源、晶振、复位电路、六个led灯、一个开关。单片机使用11.0592M晶振*/
#include<reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitsw=P3^3;//模拟救护车的开关
uintx;
voiddelay10ms()
{
uinti;
for(i=120;i>0;i--)//改变i的初值以改变各状态转变间隔时间,使用时改为1200
{;;}
}
voiddelays()
{
uintz;
for(z=2000;z>0;z--)
delay10ms();
}
voidamb(uchardat,uchartc)
{
x=tc*100;
while(x>0)
{
if(sw==0)
{
P1=0xf6;
delays();
P1=dat;
}
delay10ms();
x--;
}
}
/*绿灯没有闪烁,黄灯直接亮了,P1^0至P1^5依次连接南北方向的红、黄、绿灯和东西方向的红、黄、绿灯(led)。*/
voidmain()
{
P1=0xf6;
delays();
while(1)
{
P1=0xf3;
amb(0xf3,20);
P1=0xf5;
amb(0xf5,4);
P1=0xde;
amb(0xde,20);
P1=0xee;
amb(0xee,4);
}
}
至于Proteus的仿真,我以前没用过,画出来的图软件提示错误,我就不弄了。同学你也是电相关专业的吧,应该做得出来。该程序我在单片机实验板上测试过,没问题,模拟的救护车通过后各灯回到救护车到来时的状态。除了绿灯不会闪,时间不是很准确,大致符合要求了。
⑩ 单片机交通灯LED动态显示,黄灯闪烁延时
很容易改,提示你一下。延时程序改为定时器延时,你要设置一秒钟的中断。在中断中加入 DEC R2这一句,使中断一次自动减一。
动态显示也很简单,主要修改的就是你的 显示子程序。
XS: MOV B,#0AH;拆分数显
MOV A,R2
DIV AB;十位存A,个位存B
MOV DPTR ,#TAB;将表TAB存入DPTR寄存器。
MOVC A,@A+DPTR;将A和DPTR相加作为地址,并把地址中对应的值赋予A
setb p2.0
MOV P0,A;将A的值经过P0口输出。
MOV A,B;将B的值赋予A
MOVC A,@A+DPTR;将A和DPTR相加作为地址,把地址中对应的值赋予A
clr p2.0
MOV P0,A;将A的值经过P2口输出
RET
两个数码管都接PO口,。P2.0出来的线分两根一根接一个非门然后接一个数码管的公共端。另一根直接接另外一个数码管的公共端。