求用C语言编写的交通灯程序,C51单片机控制,无左转右转

求用C语言编写的交通灯程序,C51单片机控制,无左转右转,第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);

}

}

1.当为黄灯时南北、东西两道同时为黄灯;以提示行人或车辆下一个灯色即将到来时间 3秒。

2.当南北为红灯,南北道车辆禁止通行,时间30秒;南北道为绿灯,南北道车辆通过时间38秒 。

3.当东西道绿灯,东西道车辆通行,时间为28秒;东西道为红灯,东西道车辆禁止通过时间为40秒。

4.这样如上表的时间和红、绿、黄出现的顺序依次出现这样行人和车辆就能安全畅通的通行。

我用的是ATMEGA16单片机编程的,也是AVR单片机

假设PA0接红灯,PA1接黄灯,PA2接绿灯。高电平亮。

我的延时函数是ms延时,比如delay(1000)表示延时1000毫秒

void main()

{

DDRA|=BIT(0)|BIT(1)|BIT(2);//设置PA0,PA1,PA2口为输出

while(1)

{

PORTA|=BIT(0);

PORTA&=~BIT(1);

PORTA&=~BIT(2);

delay(50000);

PORTA&=~BIT(0);

PORTA|=BIT(1);

PORTA&=~BIT(2);

delay(5000);

PORTA&=~BIT(0);

PORTA&=~BIT(1);

PORTA|=BIT(2);

delay(50000);

}

}

思路:

红灯停,绿灯行,黄灯闪烁提示行人红绿灯即将切换。四个方向各有一个红、黄、绿显示和两个数码管。

东西道为人行道(20秒),南北道为车行道(60秒),黄灯延时最后三秒时,闪烁并切换。

三、硬件电路设计

此电中路设计采用AT89C51单片机,74LS47(数码管驱动)74LS373(数码管驱动输出锁存),8个数码管显示其延时值,四个红、黄、绿指示灯。硬件设计关键在于,延时显示时,要考虑到当个位数字显示时,要确保十位数字显示输出的不变。因此,可加输出锁存器。在延时最后三秒时,要让黄灯进行闪烁,并同时显示数字(这一步在软件设计上很关键)。

四、软件程序(C语言)

以下是整个设计的软件程序,直接可以编译成。Hex代码。通过以上电路,下载到单片机,可直接运行。

////

//程序名:十字路口交通灯控制

//编写人:黄庭剑

//初写时间:2009年1月2日

//程序功能:南北为车行道,延时60秒;东西方向为人行道,延时20秒,且在最后3秒黄灯显示2秒钟再实现切换

//CPU说明:AT89C51型单片机; 24MHZ晶体振荡器

//完成时间:2009年1月6日

////

#include<stdioh>

#include<reg51h>

#include<intrinsh>

sfr p0   = 0x80;

sfr p1   = 0x90;

sfr p2   = 0xA0;

sfr p3   = 0xb0;      //这部分内容其实在“#include<reg51h>”里已经有,但里面定义的必须区分大小写,在这里,因为我程序采用的是小写,reg51h里对各个端口与寄存器的定义都是大写,所以在编译连接时,会报错,所以,在本设计程序里,我只用到了端口,在这里也就只定义了四个,而没有去改reg51h里面的内容。其实两者是一样的。

sbit  sw      = p0^0;

sbit   OE    =P0^6;

sbit   LE    =P0^7;  //74LS373锁存器控制端定义

char  display[]={ 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99 }; //p1口的数码管时间显示调用,利用74L74BCD码,8位驱动输出;

//函数声明 begin

void  delay1(int count);

void  delay_long(int  number1,int number2);

void    people_car_drive();

//函数声明end

////延时子程序

void  delay1(int  count)

{ int  i;

for(i=count;i>0;i--)

{ ;}

}

void  delay_long(int  number1,int number2)

{

int a,b;

for(a=number1;a>0;a--)

{

for(b=number2;b>0;b--)

{ _nop_();     }

}

}

////延时子程序

void   people_car_drive()

{

int   p_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);    //南北黄灯闪烁三秒完毕

}

void  main()               //主函数入口处

{

p0=0x01;

p1=0x00;

p2=0x00;

p3=0x00;               //初始化各端口

{ while(1)

{

if(sw==0)

{  people_car_drive();}

else

{

p2=0x00;

p3=0x00;                    //关闭所有交通灯

}

}

}

}

详情访问:>

[货品采购支持]

※ 享有总部进货渠道和进货价格,享有国际知名品牌进货渠道

※ 与孔夫子总部共享批量进货优惠折扣,降低进货成本,提高赢利率

※ 拥有孔夫子自有品牌产品

※ 可委托总部统一配货

[人员学习培训支持]

在“孔夫子视光学中心”接受培训

※ 学费享受孔夫子总部员工的待遇;

※ 毕业后获得国家劳动部统一颁发的职业资格证书。

在孔夫子眼镜直营店实习

※ 实习期间孔夫子免收学习费用。

以上就是关于求用C语言编写的交通灯程序,C51单片机控制,无左转右转全部的内容,包括:求用C语言编写的交通灯程序,C51单片机控制,无左转右转、用C语言编写的交通灯控制程序、基于51单片机控制交通灯的电路图与C语言程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存