打印

新手,交通灯的程序,请解答.

[复制链接]
2192|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
keele007|  楼主 | 2011-4-25 01:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
是智能交通的程序,有些地方看不明白,谁能给我指点迷津,下面是部分程序:                  /**************************************************************
根据当前车流量自动调节通行时间,每秒通行大于2辆将延长通行时间
小于等于2辆恢复正常时间
**                                                                                                   *
*第1个状态:主干道亮绿灯30S、支干道亮红灯                        *
*第2个状态:主干道绿灯闪3次转亮黄灯、支干道亮红灯3S                          *                                 *
*第3个状态:主干道亮红灯、支干道亮绿灯30S                        *
*第4个状态:主干道亮红灯、支干道绿灯闪3次转亮黄灯3S              *
*返回到第1个状态                                                 *
*                                                                 *
***************************************************************

/
/* 11.0952M晶振*/
#include<reg51.h>//头文件
#include<intrins.h>//头文件
#define  uchar  unsigned  char//宏定义
#define  uint   unsigned   int//宏定义
sbit   RED_ZHU    =  P1^0;
sbit   YELLOW_ZHU =  P1^1;
sbit   GREEN_ZHU  =  P1^2;
sbit   RED_ZHI    =  P1^3;
sbit   YELLOW_ZHI =  P1^4;
sbit   GREEN_ZHI  =  P1^5;
sbit   key1  =  P3^6;
sbit   key2  =  P3^7;

uint aa, bai,shi,ge,bb; //定义变量
uchar j,k,b,dd;
char t=31;
/*数码管显示0-9*/
uint code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
/*子函数声明*/
void  delay(uint z);
void  delay0(uint z);
//void  init(uint a);
void  display(uint ge,uint shi);
void  xtimer0();
void  init1();
void  init2();
void  init3();
void  init4();
void xint1();
void xint0();
void  LED_ON();
void  LED_OFF();
/*********************************************************
   主函数
*********************************************************/
void main()
{        
        P1=0xFF;
           P2=0xFF;
        EA=1;//打开外部中断
        EX0=1;//允许外部中断0中断
        IT0=1;//
         
  while(1)
  {
        init1();//第1个状态
                  init2();//第2个状态
                 init3(); //第3个状态
                 init4(); //第4个状态
  }
}
void  init1()//第1个状态:主干道亮绿灯30S、支干道亮红灯
{
        uint temp;
        temp=t;//变量赋初值
        TMOD=0x01;//定时器0工作于方式1
        TH0=0x4c;
        TL0=0x00;//定时器赋初值
        EA=1;//开外部中断
        ET0=1;//开定时中断
        TR0=1;//开定时器0
        while(1)
        {         
                RED_ZHU=1;
                RED_ZHI=0;
                GREEN_ZHU=0;
                GREEN_ZHI=1;
                YELLOW_ZHU=1;//第二个状态:主干道亮绿灯30S、支干道亮红灯
                   YELLOW_ZHI=1;
               
                if(aa==20)//定时20*50MS=1S
                {
                        aa=0;//定时完成一次后清0
                        temp--;//变量自增
                        if(temp==3)//
                        {
                                temp=30;//变量清0
                                break;
                        }
                        shi=temp%100/10;//显示十位
                        ge=temp%10;//显示个位
                }
                display(ge,shi);
        }
}

void  init2() //第2个状态:主干道绿灯闪3次转亮黄灯、支干道亮红灯3S
{
        uint temp;
        temp=4;//变量赋初值
        TMOD=0x01;//定时器0工作于方式1
        TH0=0x4c;
        TL0=0x00;//定时器赋初值
        EA=1;//开外部中断
        ET0=1;//开定时中断
        TR0=1;//开定时器0
        while(1)
        {
                RED_ZHI=0;
                GREEN_ZHU=1;
                //YELLOW_ZHU=~YELLOW_ZHU;
                if(aa==20)//定时20*50MS=1S
                {
                        aa=0;//定时完成一次后清0
                        temp--;//变量自增
                        YELLOW_ZHU=~YELLOW_ZHU;
                        if(temp>200)//
                        {
                                temp=4;//变量清0
                                break;
                        }
                        shi=temp%100/10;//显示十位
                        ge=temp%10;//显示个位         
                }
                display(ge,shi);;
        }
}
void  init3()//第3个状态:主干道亮红灯、支干道亮绿灯30S
{
        uint temp;
        temp=t;//变量赋初值
        TMOD=0x01;//定时器0工作于方式1
        TH0=0x4c;
        TL0=0x00;//定时器赋初值
        EA=1;//开外部中断
        ET0=1;//开定时中断
        TR0=1;//开定时器0
        while(1)
        {        
                RED_ZHU=0;
                RED_ZHI=1;
                GREEN_ZHU=1;
        GREEN_ZHI=1;
                YELLOW_ZHU=1;//第一个状态主干道、支干道均亮红灯5S
                   GREEN_ZHI=0;
                if(aa==20)//定时20*50MS=1S
                {
                        aa=0;//定时完成一次后清0
                        temp--;//变量自增
                        if(temp==3)//
                        {
                                temp=t;//变量清0
                                break;
                        }
                        shi=temp%100/10;//显示十位
                        ge=temp%10;//显示个位         
                }
                display(ge,shi);
        }
}

void  init4()//第4个状态:主干道亮红灯、支干道绿灯闪3次转亮黄灯3S
{
        uint temp;
        temp=4;//变量赋初值
        TMOD=0x01;//定时器0工作于方式1
        TH0=0x4c;
        TL0=0x00;//定时器赋初值
        EA=1;//开外部中断
        ET0=1;//开定时中断
        TR0=1;//开定时器0
        while(1)
        {
                RED_ZHI=1;
                RED_ZHU=0;
                GREEN_ZHU=1;
                GREEN_ZHI=1;
                //YELLOW_ZHI=~YELLOW_ZHI;
                if(aa==20)//定时20*50MS=1S
                {
                        aa=0;//定时完成一次后清0
                        temp--;//变量自增
                        YELLOW_ZHI=~YELLOW_ZHI;
                        if(temp>200)//定时100S
                        {
                                temp=4;//变量清0
                                break;
                        }
                        shi=temp%100/10;//显示十位
                        ge=temp%10;//显示个位         
                }
                display(ge,shi);
        }

我弄不懂的是 :if(temp>200)//定时100S
                        {
                                temp=4;//变量清0
                                break;
                        }

     这句话有什么作用?temp后的数值是什么意思?temp不是一直--吗?怎么会有个200出来?

相关帖子

沙发
snailxixi| | 2011-4-25 11:42 | 只看该作者
这程序思路不好,未见到中断函数

使用特权

评论回复
板凳
wang_2003| | 2011-4-25 12:15 | 只看该作者
我也没看明白撒

使用特权

评论回复
地板
wsxh4984| | 2011-4-25 13:40 | 只看该作者
没中断,aa会自增吗?这种程序结构未见过,学习。。。

使用特权

评论回复
5
ayb_ice| | 2011-4-25 14:07 | 只看该作者
没中断,aa会自增吗?这种程序结构未见过,学习。。。
wsxh4984 发表于 2011-4-25 13:40

有中断程序,只是没有帖出来

使用特权

评论回复
6
sysdriver| | 2011-4-25 20:17 | 只看该作者
没什么难理解的,根据程序的意思:temp 定义的是16位 无符号整型 初始化是4;
           if(aa==20)//定时20*50MS=1S
                {
                        aa=0;//定时完成一次后清0
                        temp--;//变量自增
                YELLOW_ZHI=~YELLOW_ZHI;
                        if(temp>200)//定时100S
                        {
                                temp=4;//变量清0
                                break;
                        }
                        shi=temp%100/10;//显示十位
                ge=temp%10;//显示个位         
           }
意思是,每秒钟,temp的值自减(从4开始),当减到0后,如果还再减,那么temp的值会是11111111 11111111B,这个值肯定大于200的,然后重新赋值为4,然后跳出while(1),根据主函数,会重新跳到init1()中去,temp的值就只有4,3,2,1,0而已。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

1

帖子

0

粉丝