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

📄 jt 21-4.c

📁 51单片机开发入门与典型实例
💻 C
字号:
/* 文件名:JT 21-4.c */
/* 程序功能:交通信号灯控制(改进)*/
  #include <AT89X51.H>          /* 头文件 */  
  char count;                   /* 声明count为字符变量 */
  bit flag;                     /* 声明flag为位变量 */
  char sum =0;                   /* 声明sum为字符变量并赋初始值0 */
  xhd( );                       /* 信号灯函数xhd( ) */
 /* ――――――――  主函数(主程序) ―――――――――――*/
  main( )                       /* 主函数 */
  {  
    TMOD=0x01;                  /* 设定T0为模式1 */
    TH0=-(50000/256);           /* 设定时器初始值50000 */
    TL0=-(50000%256);  
    EA=1;                       /* 总允许中断 */
    ET0=1;                      /* 允许定时器T0中断 */
    TR0=1;                      /* 启动定时器工作 */

    EX0=1;                      /* 允许外部中断0中断 */
    PX0=1;                      /* 外部中断0为高优先级 */
 
    P1=0xff;                    /* P1初始值,关闭所有信号灯 */
    xhd( );                     /* 调用信号灯函数 */
  }
 /* ――――――― 中断函数(中断服务程序) ―――――――― */
  T0_srv( ) interrupt 1 using 1  /* 中断服务程序 */
  {
    TH0=-(50000/256);            /* 重装定时器初始值 */
    TL0=-(50000%256); 
    count++;                     /* count加1 */ 
    if(count==20)                /* 判断count是否等于20 */
     { 
      count=0;                   /* count清0,以便从新计数 */
      flag=1;                    /* 标志位为1 */
     } 
  }
 /* ――――――――  信号灯函数(子程序) ―――――――― */
   xhd( )                        /* 信号灯函数 */
   {                             
     while(1)                    /* 无限循环 */ 
     {
 /* ―――――――――――――*/
       P1_3=0; P1_2=0;           /*东西红灯亮,南北绿灯亮 */ 
       while( sum<15)            /* 循环15次,延时15秒 */
        {
          while( ! flag );       /* 等待1秒 */
          flag=0;                /* 标志位清0 */
          sum++;                 /* sum加1 */
        }
      sum=0;                     /* sum清0,以便从新计数 */
 /* ―――――――――――――*/
      P1_2=1; P1_1=0;            /* 南北绿灯灭,黄灯亮 */      
  while( sum<3)                  /* 循环3次,延时3秒 */
   {
     while(! flag);
     flag=0;
     sum++;
    }
   sum=0;


/*―――――――――――――*/
   P1_1=1; P1_0=0;               /* 南北黄灯灭,红灯亮 */
   P1_3=1; P1_5=0;               /* 东西红灯灭,绿灯亮 */
  while( sum<10)                 /* 延时10秒 */
   {
    while(! flag);
    flag=0;
    sum++;
   }
  sum=0;
 /* ―――――――――――――*/
  P1_5=1; P1_4=0;                /*东西绿灯灭,黄灯亮 */
  while( sum<3)                  /* 延时3秒 */
    {
     while(! flag);
     flag=0;
     sum++;
    }
   sum=0;
 /* ――――――――――――― */
   P1_4=1; P1_0=1;               /* 东西黄灯灭,南北红灯灭 */ 
  }
 }
 /* ―――――― 外部中断函数(外部中断服务程序)――――― */
 int0_srv( ) interrupt 0 using 2
  {
    char a;
    unsigned int i;
	for (i=0;i<10000;i++);
    if ( INT0==0)
     {
       a=P1;                     /* 保留P1状态*/
       P1=0xff;
       P1=0xf6;                  /* 使两边亮起红灯 */
       while (INT0==0);          /* 等待开关断开*/
       P1=a;                     /* 恢复P1状态*/
     }
  }

⌨️ 快捷键说明

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