用Keilc软件设计一个交通灯程序C程序

用Keilc软件设计一个交通灯程序C程序,第1张

东西和南北的时间不同步,楼主没有说得很清楚

你把时间流程说清楚我可以把代码写出来

//以下代码经过Keil C51软件调试通过

#include "reg51h" //头文件包含

//宏定义

#define uint unsigned int

#define uchar unsigned char

#define ON 0 //0的时候灯亮

#define OFF 1 //1的时候灯亮

//管脚定义

//南北道 黄灯亮3秒 红灯亮 30秒 黄灯3秒 绿灯38秒

//东西道 黄灯亮3秒 绿灯亮 28秒 黄灯3秒 红灯40秒

sbit PortDX_Yellow = P1^0; //东西方向黄灯

sbit PortDX_Red = P1^1; //东西方向红灯

sbit PortDX_Green = P1^2; //东西方向绿灯

sbit PortNB_Yellow = P1^3; //南北方向黄灯

sbit PortNB_Red = P1^4; //南北方向红灯

sbit PortNB_Green = P1^5; //南北方向绿灯

void delay(uint ms) // 毫秒级延时(AT89C52 @ 110592MHz)

{

uint ti;

while(ms--)

{

for(ti=0;ti<112;ti++){}//112

}

}

/==================== 主函数 ====================/

void main(void)

{

delay(400); //开机延时400ms

while(1)

{

PortNB_Yellow = ON ;PortNB_Red = OFF;PortNB_Green = OFF;//南北黄灯亮3秒

PortDX_Yellow = ON ;PortDX_Red = OFF;PortDX_Green = OFF;//东西黄灯亮3秒

delay(3000);

PortNB_Yellow = OFF;PortNB_Red = ON ;PortNB_Green = OFF;//南北红灯亮28秒

PortDX_Yellow = OFF;PortDX_Red = OFF;PortDX_Green = ON ;//东西绿灯亮28秒

delay(28000);

PortNB_Yellow = OFF;PortNB_Red = ON ;PortNB_Green = OFF;//南北红灯亮2秒

PortDX_Yellow = ON ;PortDX_Red = OFF;PortDX_Green = OFF;//东西黄灯亮2秒

delay(2000);

PortNB_Yellow = ON ;PortNB_Red = OFF;PortNB_Green = OFF;//南北黄灯亮1秒

PortDX_Yellow = ON ;PortDX_Red = OFF;PortDX_Green = OFF;//东西黄灯亮1秒

delay(1000);

PortNB_Yellow = ON ;PortNB_Red = OFF;PortNB_Green = OFF;//南北黄灯亮2秒

PortDX_Yellow = OFF;PortDX_Red = ON ;PortDX_Green = OFF;//东西红灯亮2秒

delay(2000);

PortNB_Yellow = OFF;PortNB_Red = OFF;PortNB_Green = ON ;//南北绿灯亮38秒

PortDX_Yellow = OFF;PortDX_Red = ON ;PortDX_Green = OFF;//东西红灯亮38秒

delay(3800);

}

}

到百度文库中找找,参考论文也比较多。你也可到“淘宝网”上找找:“51单片机交通灯控制系统C语言设计源程序送仿真图”,有现成的,有实物图、仿真、原理图、源程序等,这款交通灯有以下功能。

1. 系统除基本交通灯功能外;

2. 还具有倒计时、显示时间设置;

3. 紧急情况处理、LED信息显示;

4. 时间可以根据具体情况手动控制等功能。

你这个程序和你发上来的图,是不符的。

无论是看图,还是看程序,都不能确定LED怎么接。

这是从哪抄来的程序吗,是想仿真呢,还是想做实物呢,还是完成作业呢。

交通灯的题目,在百度里,可以找到无数个,还不如搜索一个呢。

这么个不完整的图不完整的程序,图和程序也不相符的东西就不要再纠结了。

#include<reg51h>

#define uchar unsigned char

#define uint unsigned int

sbit RED_A=P0^0; //东西向灯

sbit YELLOW_A=P0^1;

sbit GREEN_A=P0^2;

sbit RED_B=P0^3; //南北向灯

sbit YELLOW_B=P0^4;

sbit GREEN_B=P0^5;

uchar Flash_Count=0,Operation_Type=1; //闪烁次数, *** 作类型变量

《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例

5

上海师范大学信息与机电工程学院—倪继锋

//延时

void DelayMS(uint x)

{

uchar i;

while(x--) for(i=0;i<120;i++);

}

//交通灯切换

void Traffic_Light()

{

switch(Operation_Type)

{

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

RED_A=1;YELLOW_A=1;GREEN_A=0;

RED_B=0;YELLOW_B=1;GREEN_B=1;

DelayMS(2000);

Operation_Type=2;

break;

case 2: //东西向黄灯闪烁,绿灯关闭

DelayMS(300);

YELLOW_A=~YELLOW_A;GREEN_A=1;

if(++Flash_Count!=10) return; //闪烁5 次

Flash_Count=0;

Operation_Type=3;

break;

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

RED_A=0;YELLOW_A=1;GREEN_A=1;

RED_B=1;YELLOW_B=1;GREEN_B=0;

DelayMS(2000);

Operation_Type=4;

break;

case 4: //南北向黄灯闪烁5 次

DelayMS(300);

YELLOW_B=~YELLOW_B;GREEN_B=1;

if(++Flash_Count!=10) return;

Flash_Count=0;

Operation_Type=1;

}

}

//主程序

void main()

{

while(1) Traffic_Light();

}

ORG  0000H

LJMP START

ORG  0003H    ;INT 0 中断入口地址

LJMP INT0

ORG  0040H

START:

MOV SP,#60H

SETB EX0      ;INT 0 中断有效

SETB IT0

SETB EA

LCALL STATUS0 ;初始状态(都是红灯)

CIRCLE:

LCALL STATUS1 ;南北绿灯,东西红灯

LCALL STATUS2 ;南北绿灯闪转黄灯,东西红灯

LCALL STATUS3 ;南北红灯,东西绿灯

LCALL STATUS4 ;南北红灯,东西绿灯闪转黄灯

LJMP CIRCLE

INT0:

PUSH PSW      ;保护现场

PUSH 2

PUSH ACC

MOV DPTR,#8300H

MOV A,#0FH    ;南北,东西都亮红灯

MOVX @DPTR,A

MOV R2,#100   ;延时10秒

LCALL DELAY

POP ACC       ;恢复现场

MOVX @DPTR,A

POP 2

POP PSW

RETI

STATUS0:              ;南北红灯,东西红灯

MOV DPTR,#8300H

MOV A,#0FH

MOVX @DPTR,A

MOV R2,#10    ;延时1秒

LCALL DELAY

RET

STATUS1:              ;南北绿灯,东西红灯

MOV DPTR,#8300H

MOV A,#96H    ;南北绿灯,东西红灯

MOVX @DPTR,A

MOV R2,#200   ;延时20秒

LCALL DELAY

RET

STATUS2:              ;南北绿灯闪转黄灯,东西红灯

MOV DPTR,#8300H

MOV R3,#03H   ;绿灯闪3次

FLASH:

MOV A,#9FH

MOVX @DPTR,A

MOV R2,#03H

LCALL DELAY

MOV A,#96H

MOVX @DPTR,A

MOV R2,#03H

LCALL DELAY

DJNZ R3,FLASH

MOV A,#06H    ;南北黄灯,东西红灯

MOVX @DPTR,A

MOV R2,#10    ;延时1秒

LCALL DELAY

RET

STATUS3:              ;南北红灯,东西绿灯

MOV DPTR,#8300H

MOV A,#69H

MOVX @DPTR,A

MOV R2,#200   ;延时20秒

LCALL DELAY

RET

STATUS4:              ;南北红灯,东西绿灯闪转黄灯

MOV DPTR,#8300H

MOV R3,#03H   ;绿灯闪3次

FLASH1:

MOV A,#6FH

MOVX @DPTR,A

MOV R2,#03H

LCALL DELAY

MOV A,#69H

MOVX @DPTR,A

MOV R2,#03H

LCALL DELAY

DJNZ R3,FLASH1

MOV A,#09H   ;南北红灯,东西黄灯

MOVX @DPTR,A

MOV R2,#10   ;延时1秒

LCALL DELAY

NOP

RET

DELAY:                ;延时子程序

PUSH 2

PUSH 1

PUSH 0

DELAY1:

MOV 1,#00H

DELAY2:

MOV 0,#0B2H

DJNZ 0,$

DJNZ 1,DELAY2 ;延时 100 mS

DJNZ 2,DELAY1

POP 0

POP 1

POP 2

RET

END

这是我们的实验,程序肯定没问题。至于ULN2803,只是一个增大电流,电压的芯片,因为51单片机本身的电流太小。你改一下就好。至于其他不明白的地方,可以交流。QQ375778861

给你一个思路:

假设是单纯的红绿灯,无黄灯的话,设红灯30秒,绿灯30秒。需要两个状态量,

方向Dir(1:东西,0:南北),东西灯颜色LightcolorEW,南北灯颜色LightcolorNS。

此刻,东西方向亮红灯,则Dir=1,LightcolorEW=red,LightcolorNS=green。对相应端口赋值即可。只需要东西方向与南北方向相反。

假设有黄灯,设红灯30秒,绿灯25秒,黄灯5秒。此刻,东西方向亮红灯,则Dir=1,LightcolorEW=red,前25秒LightcolorNS=green,后5秒LightcolorNS=yellow。由于新加入了绿灯转黄灯,则要再加入一个状态量,绿灯结束状态,黄灯根据绿灯结束状态启动,计时结束转红灯。对相应端口赋值即可。只需要东西方向与南北方向相反。

ORG 1000H

L:JNB P30,LP3

JNB P31,LP2 ;判断p31,p30口

;如果P30为1的话,正常运行交通灯

;如果P31为1的话,正常运行交通灯

;如果P31为0的话,依次点亮灯

;如果P30为0的话,停止交通灯,只有黄灯闪烁

;正常运行交通灯

LP1:

MOV P1,#61H

CLR P32

CLR P33

CLR P34

SETB P35 ;1,3 路口红灯亮,2,4 路口绿灯亮

LCALL DELAY1

MOV B,#04H ;设置循环次数为4次

M:MOV P1,#51H

CLR P35

SETB P34 ;1,3路口红灯亮,2,4路口黄灯亮

LCALL DELAY2

MOV P1,#41H

CLR P34 ;1,3路口红灯亮,2,4路口黄灯灭

LCALL DELAY2

DJNZ B,M

MOV P1,#0CH

SETB P32

SETB P33 ;1,3路口绿灯亮,2,4路口红灯亮

LCALL DELAY1

MOV B,#04H

N:MOV P1,#8AH

CLR P32 ;1,3路口黄灯亮,2,4路口红灯亮

LCALL DELAY2

MOV P1,#08H ;1,3路口黄灯灭,2,4路口红灯亮

LCALL DELAY2

DJNZ B,N

AJMP L

;黄灯闪

LP3: CLR P17

CLR P32

CLR P33

CLR P35

MOV P1,#92H

SETB P34 ;黄灯亮,其他的灯灭

LCALL DELAY2

MOV P1,#00H

CLR P34 ;所有的黄灯灭

LCALL DELAY2

AJMP L

;循环亮

LP2: CLR P32

CLR P33

CLR P34

CLR P35

MOV A,#01H ;赋初值

MOV R0,#08 ;循环变量,循环7次,控制7个灯

LOOP: MOV P1,A ;点亮第一个灯

LCALL DELAY2 ;延迟

RL A ;A的值加1,循环左移

DJNZ R0,LOOP ;RO的值减1不等于1则执行LOOP标号

SETB P32 ;P32灯亮

LCALL DELAY2 ;延迟

CLR P32 ;P32灯灭

SETB P33 ;下一个灯P33亮

LCALL DELAY2 ;延迟

CLR P33 ;P33灯灭

SETB P34 ;下一个灯P33亮

LCALL DELAY2 ;延迟

CLR P34 ;P34灯灭

SETB P35 ;P35灯亮

LCALL DELAY2 ;延迟

AJMP L

;延迟1

DELAY1 :

MOV R3,#200

DEL1: MOV R4,#250

DEL2: MOV R5,#50

DEL3: NOP ;空 *** 作

DJNZ R5,DEL3

DJNZ R4,DEL2

DJNZ R3,DEL1 ;延长5秒

RET

;延迟2

DELAY2 :

DEL4: MOV R3,#200

DEL5: MOV R4,#200

DEL6: NOP

DJNZ R4,DEL6

DJNZ R3,DEL5 ;延迟008秒

RET

END

//--------------------------------------------------

//名称:LED模拟交通灯

//作者:彭伟《单片机C语言程序设计实训100例-基于8051+PROTEUS仿真》

//--------------------------------------------------

//说明:东西向绿灯亮若干秒后,黄灯闪烁,闪烁5次后亮红灯

// 红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁

// 闪烁5次后亮红灯,东西向绿灯亮,如此重复

//---------------------------------------------------

#include<reg51h>

#define uchar unsigned char

#define uint unsigned int

sbit RED_A=P0^0;//东西向指示灯

sbit YELLOW_A=P0^1;

sbit GREEN_A=P0^2;

sbit RED_B=P0^3;//南北向指示灯

sbit YELLOW_B=P0^4;

sbit GREEN_B=P0^5;

uchar Flash_count=0;Operation_type=1;//闪烁次数及 *** 作类型变量

//-----------------------------------------------------

//延时

//----------------------------------------------------

void DelayMS(uint x)

{

uchar i;

while(x--)for(i=0;i<120;i++)

}

//---------------------------------------------------

//交通灯切换子程序

//---------------------------------------------------

void Traffic_light()

{

switch(Operation_type)

{

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

RED_A=1;YELLOW_A=1;GREEN_A=0;

RED_B=0;YELLOW_B=1;GREEN_B=1;

DelayMS(2000);

Operation_type=2;

break;

case 2://东西向黄灯闪烁,绿灯关闭

DelayMS(300);

GREEN_A=1;

YELLOW_A=~YELLOW_A;

//闪烁5次

if (++Flash_count!=10) return;

Flash_count=0;

Operation_type=3;

break;

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

RED_A=0;YELLOW_A=1;GREEN_A=1;

RED_B=1;YELLOW_B=1;GREEN_B=0;

DelayMS(2000);

Operation_type=4;

break;

case 4://南北向黄灯闪烁,绿灯关闭

DelayMS(300);

GREEN_B=1;

YELLOW_B=~YELLOW_B;

//闪烁5次

if (++Flash_count!=10) return;

Flash_count=0;

Operation_type=1;

}

}

void main()

{

while(1) Traffic_light();

}

以上就是关于用Keilc软件设计一个交通灯程序C程序全部的内容,包括:用Keilc软件设计一个交通灯程序C程序、用单片机模拟控制交通灯、解释c语言编写的交通灯程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9340502.html

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

发表评论

登录后才能评论

评论列表(0条)

保存