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

📄 main.c

📁 51单片机十字路口交通灯控制程序
💻 C
字号:
/***************************************/
/*       十字路口交通灯控制系统        */
/*       开发语言:C51                 */
/*       编译器:keil C51 V7.06        */
/***************************************/
/*采用线选法寻址8255A                  */
/*PA      Address 7FFCH                */
/*PB      Address 7FFDH                */
/*PC      Address 7FFEH                */
/*Control Address 7FFFH                */
/*晶振:  12M                          */
/*单片机:AT89s51                      */
/***************************************/
#include "at89x51.h"
#include "absacc.h"
#define  KEY     XBYTE [0x7FFC]
#define  LED     XBYTE [0x7FFD]
#define  Control XBYTE [0x7FFF]

#define  R_ON_G_ON  0x2e//东西方向红灯亮 南北方向绿灯亮
#define  R_ON_G_OFF 0x3e//东西方向红灯亮 南北方向绿灯灭
#define  R_ON_Y_ON  0x1e//东西方向红灯亮 南北方向黄灯亮

#define  G_ON_R_ON  0x35//东西方向绿灯亮 南北方向红灯亮
#define  G_OFF_R_ON 0x37//东西方向绿灯灭 南北方向红灯亮
#define  Y_ON_R_ON  0x33//东西方向黄灯亮 南北方向红灯亮
unsigned char data second;
unsigned char data msecond;
unsigned char data caution;
bit      complete;
/****************************************************************/
/*******************************/
/*     定时器初始化            */
/*     输入:无                */
/*     输出:无                */
/*******************************/
void init_t(void)
{
 TMOD=0X21;                     //定时器0工作在方式1  10ms产生一次中断 

 TH0=0xd8; 
 TL0=0xf0;
 EA=1;
 ET0=1;
}
/****************************************************************/
/***************************************/
void init_8255A(void)
{Control=0x98;        //PA口工作于方式0 输入
                      //PB口工作于方式0 输出
                      //PC7-4输入 PC3-0 输出
}
/****************************************************************/
/*******************************/
/*     键盘检测延迟函数        */
/*     输入:无                */
/*     输出:无                */
/*******************************/
void key_delay(void)
{unsigned int i;
 i=1000;
 while(--i); 
}
/****************************************************************/
/*******************************/
/*     键盘检测函数            */
/*     输入:无                */
/*     输出:键盘检测值        */
/*******************************/
unsigned char key_detect(void)
{unsigned char key;
 key=KEY;
 key_delay();                  //延迟约20MS 消除按键抖动
 if((key==KEY)&&(key==0xFE))
   return 0x01;                //若两次按键值相同 且 PA0为0 为有效按键 返回 0x01 
 else return 0x00;             //否则还回 0x00

}
/***************************************************************************************/
/*******************************/
/*        主函数               */
/*        输入:无             */
/*        输出:无             */
/*******************************/
/***************************************/
main()
{ init_8255A();                  //8255初始化
  init_t();                      //定时器初始化  定时器未开启
  while(1) 
 {switch( key_detect())          //键盘检测 
    {
     case 0x00:LED=0xFF;TR0=0;break;   //检测函数为 0x00  开关断开 关闭定时器 交通灯停止工作
     case 0x01:TR0=1   ;      break;   //检测函数为 0x01  开关闭合 启动定时器 交通灯开始工作
     default:LED=0xFF  ;TR0=0;break;   //检测函数为其他值          关闭定时器 交通灯停止工作
    }

 }
}
/***************************************/
/***************************************************************************************/
/*******************************/
/*     定时中断服务函数        */
/*     输入:无                */
/*     输出:无                */
/*******************************/
void timer0_isp()interrupt 1 using 2
{  TR0=0;                              //关闭定时器 
   if(++msecond==100)                  //10毫秒中断一次 100次为1秒
       {msecond=0;                     
        ++second;
       }
   if(msecond==3)
     complete=~complete;               //设定闪烁标志位  
   //-----------------------------------------------------------------------------------
   if(second<=15)       caution=0x01;  //0-15s  东西方向红灯亮,  南北方向绿灯亮   共15s
   else if(second<=18)  caution=0x02;  //15-18s 东西方向红灯亮,  南北方向绿灯闪烁 共3s
   else if(second<=20)  caution=0x03;  //18-20s 东西方向红灯亮,  南北方向黄灯亮   共2s
   else if(second<=35)  caution=0x04;  //20-35s 东西方向绿灯亮,  南北方向红灯亮   共15s
   else if(second<=38)  caution=0x05;  //35-38s 东西方向绿灯闪烁,南北方向红灯亮   共3s
   else                 caution=0x06;  //38-40s 东西方向黄灯亮,  南北方向红灯亮   共2s
  //-------------------------------------------------------------------------------------
   switch(caution)
       {case 0x01:LED=R_ON_G_ON;break;      //东西方向红灯亮 南北方向绿灯亮     
        case 0x02:if(complete)
                       LED=R_ON_G_ON ;
                  else LED=R_ON_G_OFF;
                  break;                    //东西方向红灯亮   南北方向绿灯闪动
        case 0x03:LED=R_ON_Y_ON;break;      //东西方向红灯亮   南北方向黄灯亮
        case 0x04:LED=G_ON_R_ON;break;      //东西方向绿灯亮   南北方向红灯亮
        case 0x05:if(complete)
                       LED=G_ON_R_ON;
                  else LED=G_OFF_R_ON;
                  break;                    //东西方向绿灯闪动 南北方向红灯亮
        case 0x06:LED=Y_ON_R_ON;break;      //东西方向黄灯亮   南北方向红灯亮
        default  :LED=0xFF;break;           //其他情况下 交通停止工作
       }
   //-------------------------------------------------------------------------------------
   if(second==40) second=0;            //40秒完成一次交通灯循环 秒值归0
   
  TH0=0xd8; //10ms                     //校正定时器启动值
  TL0=0xf0;                     
  TR0=1;                               //重新启动定时器
}
/*********************************************************************************************************************************/

⌨️ 快捷键说明

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