如何用单片机制作交通灯 5
2个回答
展开全部
LED模拟交通灯
本例中的12只LED分成东西向和南北向两组,各组指示灯均有相向的2只红色、2只黄色与2只绿色的LED,本例中对应的LED单独进行定义,程序运行时模拟了十字路口交通信号灯得切换过程与显示效果。
本例电路如下图:
(呵呵 图片插入不进来)
程序设计调试与实训:
源程序中用6行sbit对东西和南北向的红、黄、绿指示灯分别进行定义,这样便于对它们进行单独控制。
本例交通指示灯切换时间设置的较短,这样可在调试的时候较快观察到运行效果,可在调试运行本例后修改代码,使指示灯切换过程更接近于实际的交通指示灯切换过程。
源程序代码:
//----------------------------------------------------------------
// 名称:LED模拟交通灯
//----------------------------------------------------------------
// 说明:东西向绿灯亮若干秒后,黄灯闪烁5次后亮红灯,红灯亮后,
// 南北向由红灯变为绿灯,若干秒后,南北向黄灯闪烁,
// 闪烁5次后亮红灯,东西向绿灯亮,如此重复。
//
//-----------------------------------------------------------------
#include <reg52.h>
#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 t;
while(x--)
{
for(t=120;t>0;t--);
}
}
//---------------------------------------------------------
//交通灯交换子程序
//---------------------------------------------------------
void Traffic_lignt()
{
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; //闪烁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); //延时
YELLOW_B=!YELLOW_B;
if(++Flash_Count !=10)
return; //闪烁5次
Flash_Count=0;
Operation_Type = 1; //回到第一种操作
break;
}
}
//----------------------------------------------------------
//主程序
//----------------------------------------------------------
void main()
{
while(1)
{
Traffic_lignt();
}
}
本例中的12只LED分成东西向和南北向两组,各组指示灯均有相向的2只红色、2只黄色与2只绿色的LED,本例中对应的LED单独进行定义,程序运行时模拟了十字路口交通信号灯得切换过程与显示效果。
本例电路如下图:
(呵呵 图片插入不进来)
程序设计调试与实训:
源程序中用6行sbit对东西和南北向的红、黄、绿指示灯分别进行定义,这样便于对它们进行单独控制。
本例交通指示灯切换时间设置的较短,这样可在调试的时候较快观察到运行效果,可在调试运行本例后修改代码,使指示灯切换过程更接近于实际的交通指示灯切换过程。
源程序代码:
//----------------------------------------------------------------
// 名称:LED模拟交通灯
//----------------------------------------------------------------
// 说明:东西向绿灯亮若干秒后,黄灯闪烁5次后亮红灯,红灯亮后,
// 南北向由红灯变为绿灯,若干秒后,南北向黄灯闪烁,
// 闪烁5次后亮红灯,东西向绿灯亮,如此重复。
//
//-----------------------------------------------------------------
#include <reg52.h>
#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 t;
while(x--)
{
for(t=120;t>0;t--);
}
}
//---------------------------------------------------------
//交通灯交换子程序
//---------------------------------------------------------
void Traffic_lignt()
{
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; //闪烁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); //延时
YELLOW_B=!YELLOW_B;
if(++Flash_Count !=10)
return; //闪烁5次
Flash_Count=0;
Operation_Type = 1; //回到第一种操作
break;
}
}
//----------------------------------------------------------
//主程序
//----------------------------------------------------------
void main()
{
while(1)
{
Traffic_lignt();
}
}
参考资料: 单片机C语言程序设计实训100例
展开全部
#include<reg51.h>
void delay0_5s()
{
unsigned char i;
for(i=0;i<0x0a;i++)
{
TH0=0x3c;
TL0=0xb0;
TR0=1;
while(!TF0);
TF0=0;}}
void delay_t(unsigned char t)
{
unsigned char i;
for(i=0;i<t;i++)delay0_5s();}
void int_0() interrupt 0
{while(1){
P1=0xe7;P0=0xd7;delay_t(30);
P1=0xeb;P0=0xe7;delay_t(6);
P1=0xbd;P0=0xf3;delay_t(30);
P1=0xdd;P0=0xf5;delay_t(3);}}
void main()
{
EA=1;
EX0=1;
EX1=1;
IT0=1;
IT1=1;
PX0=1;
PX1=0;
TMOD=0x01;
while(1){
P1=0xff;P0=0xff;delay_t(2);
P1=0xdb;P0=0xed;delay_t(2);}}
void delay0_5s()
{
unsigned char i;
for(i=0;i<0x0a;i++)
{
TH0=0x3c;
TL0=0xb0;
TR0=1;
while(!TF0);
TF0=0;}}
void delay_t(unsigned char t)
{
unsigned char i;
for(i=0;i<t;i++)delay0_5s();}
void int_0() interrupt 0
{while(1){
P1=0xe7;P0=0xd7;delay_t(30);
P1=0xeb;P0=0xe7;delay_t(6);
P1=0xbd;P0=0xf3;delay_t(30);
P1=0xdd;P0=0xf5;delay_t(3);}}
void main()
{
EA=1;
EX0=1;
EX1=1;
IT0=1;
IT1=1;
PX0=1;
PX1=0;
TMOD=0x01;
while(1){
P1=0xff;P0=0xff;delay_t(2);
P1=0xdb;P0=0xed;delay_t(2);}}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询