我想问点东西 大神来帮帮忙

2019-07-15 15:06发布

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define THVL -50000/256
#define TLVL -50000%256
#define LRA 0XEE
#define ERNG 0XEB
#define ERNY 0XED
#define EGNR 0XBE
#define EYNR 0XDE
uchar i,j;
/**************************************************************/
//定义全局变量
uint time_Count=0;     //延时倍数
uchar Flash_Count=0;    //闪烁次数
uchar Operation_Type=0; //操作类型
//0:全红;1:东西红灯南北绿灯;2:东西红灯南北黄灯
//3: 东西绿灯南北红灯; 4: 东西黄灯南北红灯
/**************************************************************/
//T0中断函数
void T0_INT()interrupt 1
{  TH0=THVL;
   TL0=TLVL;
   switch(Operation_Type)
{
/**************************************************************/
   //东西南北全红灯 5秒
  case 0:
       P1=LRA;
      if(++Time_Count!=50) return;
       Time_Count=0;
       Operation_Type=1;
                  P1=ERNG;
        break;
这是个交通灯的C  我想知道++Time_Count!=50 这一句的工作原理 就是让等怎么变换的 为什么?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
liujinyi016
1楼-- · 2019-07-15 16:13
Time_Count初始化为0,应该是定时器是100ms吧,那么Time_Count从0开始++,到50时,if不满足,没有return ,而执行下面的程序。
LemonShane
2楼-- · 2019-07-15 19:35
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define THVL -50000/256
#define TLVL -50000%256
#define LRA 0XEE
#define ERNG 0XEB
#define ERNY 0XED
#define EGNR 0XBE
#define EYNR 0XDE
uchar i,j;
/**************************************************************/
//定义全局变量
uint Time_Count=0;     //延时倍数
uchar Flash_Count=0;    //闪烁次数
uchar Operation_Type=0; //操作类型
//0:全红;1:东西红灯南北绿灯;2:东西红灯南北黄灯
//3: 东西绿灯南北红灯; 4: 东西黄灯南北红灯
/**************************************************************/
//T0中断函数
void T0_INT()interrupt 1
{  TH0=THVL;
   TL0=TLVL;
   switch(Operation_Type)
{
/**************************************************************/
   //东西南北全红灯 5秒
  case 0:
       P1=LRA;
      if(++Time_Count!=50) return;
       Time_Count=0;
       Operation_Type=1;
                  P1=ERNG;
        break;
/**************************************************************/
   //东西红灯南北绿灯 10秒
   case 1:
       if(++Time_Count!=200) return;
       Time_Count=0;
       Operation_Type=2;
                 P1=ERNY;
        break;
/**************************************************************/
   //东西红灯南北黄灯 3秒
        case 2:
      if(++Time_Count!=10) return;
             Time_Count=0;
             P1^=0X02;  //对黄灯位取反
          //闪烁3次
          if(++Flash_Count!=6)return;
             Flash_Count=0;
             Operation_Type=3;
                                 P1=EGNR;
            break;
/**************************************************************/
   //东西绿灯南北红灯 10秒
    case 3:
     if(++Time_Count!=200) return;
     Time_Count=0;
       Operation_Type=4;
                 P1=EYNR;
     break;
/**************************************************************/
    //东西黄灯南北红灯 3秒
        case 4:
       if(++Time_Count!=10) return;
             Time_Count=0;
             P1^=0X20;  //对黄灯位取反
          //闪烁3次
          if(++Flash_Count!=6)return;
             Flash_Count=0;
             Operation_Type=1;
                                 P1=ERNG;
           break;

}
}
/**************************************************************/
//延时函数
void delay10s()
{ uchar k;
  for(k=0;k<200;k++)
  {
   TH1=THVL;
   TL1=TLVL;
   TR1=1;
   while(!TF1);
   TF1=0;
  }
}
/**************************************************************/
//外中断0函数           
void INT_0() interrupt 0 using 1
{
  P1=LRA;
  delay10s();
}

/**************************************************************/
/*主函数*/
/**************************************************************/
void main()
{
TMOD=0X11;
TH0=THVL;
TL0=TLVL;
TR0=1;
TH1=THVL;
TL1=TLVL;
ET0=1;
IT0=1;
EX0=1;
PX0=1;
EA=1;

while(1);
}
LemonShane
3楼-- · 2019-07-15 22:03
 精彩回答 2  元偷偷看……
lifefans
4楼-- · 2019-07-15 22:48
原理是这样的,从main函数起,while(1)循环之前的都为配置操作,开时钟了、配置引脚输出模式了、设定多少时间进一次中断了等,然后就是等待时间到,进入中断处理程序。在中断处理程序中,根据当前状态进行不同的处理。比如说,一开始操作类型是0,这里P1=LRA;就是配置红灯全亮;然后只要红灯全亮时间没有满,就退出中断处理程序,状态也不会被改变。等到时间满足了,就将Time_count置零,将状态改变为下一个状态,同时,将p1也更改,也就是把灯亮情况也更新为下一个状态对应的情况。之后一样,在新的状态判断是否到达时间,到达时间则更新状态。

一周热门 更多>