⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 new.c

📁 可调节的智能交通灯 程序
💻 C
字号:
#include <reg52.h>

/************************************************************************************************************
端口定义:
P1口的3个口控制交通灯,输出
P2口的四个端口P2.0 2.1 2.2 2.3控制数码管,输出
P0口的 0.4口用作启动开关 输入
P0口的四个端口P0.0 0.1 0.2 0.3作为输入开关用,用以调节红绿灯的亮灭时间  输入
初始值 红绿灯亮2秒(2000毫秒)
可调节红绿灯亮灭的时间,每次调节必须等到一个周期 即左边的绿灯亮完红灯重新开始为起始点
*************************************************************************************************************/
sbit P10=P1^0;//输出交通灯
sbit P11=P1^1;//输出交通灯
sbit P12=P1^2;//输出交通灯
sbit P00=P0^0;//输入开关
sbit P01=P0^1;//输入开关
sbit P02=P0^2;//输入开关
sbit P03=P0^3;//输入开关
sbit P04=P0^4;//启动开关


void Initial(void);//系统初始化;
int check(void);//判断是否改变 交通灯亮灭时间 返回参数
void delay_ms(unsigned int i);//延时程序,单位毫秒
/*
初始化状态
先对要输入的口P00~P04写1,表示要输入
P10 11 12口输出0,交通灯全灭
P2口输出0X0F,显示在数码管中
*/


void Initial(void)//系统初始化
{
P00=1;
P01=1;
P02=1;
P03=1;
P04=1;//输入端口先写1
P10=0;
P11=0;
P12=0;//交通灯先灭
P2=0X0f;//计数灯先为F
}
/******************************************************************************************
P03 使能开关,当其打开时,才判断其他时间选择开关的值
三位值 高位到低位 P02 P01 P00
******************************************************************************************/
int check(void) //判断是否改变 交通灯亮灭时间 返回参数
{
  int count,P0,P1,P2;
  P0=~P00;
  P1=~P01;
  P2=~P02;
  count=P2 * 4+P1 * 2+P0;
   if(P03==1)
     return -1;
   else
     return count;
     
}
/*****************************************************************************************************
未核实 精确延时时间   from 51系列单片机设计实例 (第二版)  楼然苗   北京航空航天大学出版社
******************************************************************************************************/
void delay_ms(unsigned int i)//延时1毫秒程序
{
   unsigned int j;
    while(i--)
   for(j=0;j<120;j++);   
}

/****************************************************************************************************
修改延时时间
 返回值         左边红灯(P1.0)亮时间增减量        左边绿灯(P1.3)时间增减量      数码管显示值
                  右边绿灯亮时间增减量               右边红灯时间增减量 
  option                   (timel)                        (timer)
    0                       1(3)                            0(2)                     1
    1                       2(4)                            0(2)                     2
    2                       3(5)                            0(2)                     3
    3                       4(6)                            0(2)                     4 
    4                       0(2)                            1(3)                     5 
    5                       0(2)                            2(4)                     6
    6                       0(2)                            3(5)                     7
    7                       0(2)                            4(6)                     8
    -1                      0(2)                            0(2)                     0
****************************************************************************************************/

void main(void)
{
/*
变量说明:
option 返回的交通灯亮灭参数check(void) 用来调节数码管输出
timel  根据check(void)的值,调节后左边红灯(右边绿灯)的亮的时间
timer  根据check(void)的值,调节后右边红灯(左边绿灯)的亮的时间
*/
  int option,timel, timer;//
  Initial();
 
  while(P04==1);//等到按下开关 电路开始运作
 /***********************调试输入输出端口********************************
 while(1)
  {if(P00==0)
    P10=1;
   else
    P10=0;
   if(P01==0)
    P11=1;
   else
    P11=0;
   if(P04==0)
    P12=1;
   else
    P12=0;
  }
  **********************************************************************/
  /***********************调试check函数********************************
  while(1)
  {
  int b;
  b=check();
  switch(b)
  {
   case -1:P10=0;P11=0;P12=0;break;
   case 0:P10=1;P11=0;P12=0;break;
   case 1:P10=0;P11=1;P12=0;break;
   case 2:P10=1;P11=1;P12=0;break;
   case 3:P10=0;P11=0;P12=1;break;
   case 4:P10=1;P11=0;P12=1;break;
   case 5:P10=0;P11=1;P12=1;break;
   case 6:P10=1;P11=1;P12=1;break;
   default :P10=0;P11=0;P12=0;break;
  }
  }
   **********************************************************************/
/**/
  for(;;)
  {
      P10=1;//先亮左边红灯,右边绿灯
	  P11=0;//黄灯灭
	  P12=0;//灭左边绿灯,右边红灯
      option=check();//读入交通灯亮灭时间参数	  
      P2=(option+1);
	  if(option>=0)//参照上面的表
	   {
	     if(option<4)
		  {
		    timel=2+option+1;
			timer=2;
		  }
		 else
		  {
		    timer=option-1;
			timel=2;
		  }
	   }
       else
        {
           timel=2;
           timer=2;
        }
	 
        delay_ms(timel*1000);//延时,延时时间根据读入参数定
		P10=0;//灭左边红灯和右边绿灯
		P11=1;//黄灯亮         //    黄
        delay_ms(300);        //     灯
		P11=~P11;             //     闪
		delay_ms(300);        //     烁
		P11=~P11;             //     两
		delay_ms(300);         //    次
		P11=0;//黄灯灭
        P12=1;//亮左边绿灯,右边红灯
        delay_ms(timer*1000);
		P12=0;//左边绿灯,右边红灯灭
        P11=1;//黄灯亮        //    黄
        delay_ms(300);        //    灯
		P11=~P11;             //    闪
		delay_ms(300);        //    烁
		P11=~P11;             //    两
		delay_ms(300);        //    次
		P11=0;//黄灯灭        
  }
/**/
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -