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

📄 18.c

📁 智能交通控制系统中SCATS系统倒计时控制程序
💻 C
字号:
/*
*********************************************************************************************************
*
*                                               倒计时牌源代码
*
* CPU          :AT89C2051
*
* FILE         : 18.C
* By           : CC
* DATE         : 2008-04-05
* VERSION      : 1.0
* 修改记录     :
*********************************************************************************************************
*/


#include<REG2051.H>
#include<X5045.H>

#define uchr      unsigned char
#define uint      unsigned int

#define T100MS    90//100ms
#define T500MS    420//500ms
#define T1S       1000//1000ms
#define TMAX      20000//20s
#define DISP_0    0xFC
#define DISP_1    0x0C
#define DISP_2    0xDA
#define DISP_3    0xF2
#define DISP_4    0x66
#define DISP_5    0xB6
#define DISP_6    0xBE
#define DISP_7    0xE0
#define DISP_8    0xFE
#define DISP_9    0xF6
#define DISP_10   0x01

sbit LE = P3^7;
sbit p17 = P1^7;

bit  freset       = 0;//复位标志
bit  frcntdstart  = 0;//红倒计时开始标志
bit  fgcntdstart  = 0;//绿倒计时开始标志
bit  frpulsechk   = 0;//红脉宽检查开始标志
bit  fgpulsechk   = 0;//绿脉宽检查开始标志
bit  frcntdend    = 0;//红倒计时结束标志
bit  fgcntdend    = 0;//绿倒计时开始标志
bit  frcomp       = 0;//红倒计时比较标志
bit  fgcomp       = 0;//绿倒计时比较标志
bit  frdisp       = 0;//红倒计时显示标志
bit  fgdisp       = 0;//绿倒计时显示标志


uchr rcountdn[20]     = 0;//红倒计时
uchr gcountdn     = 0;//绿倒计时
uchr rcntdtim     = 0;//红倒计时计数器
uchr gcntdtim     = 0;//绿倒计时计数器
uint rchktim      = 0;//红脉宽计数器
uint gchktim      = 0;//红脉宽计数器
uint r1stim       = 0;//红1秒计数器
uint g1stim       = 0;//红1秒计数器
/*uint tt2=0;
uint tt1=0;
uint tt0=0;
uint tt[10]={0};*/


//T0:16位,1ms
void t0int() interrupt 1
{
     TL0=0x66;
     TH0=0xFC;
//tt0++;
	 if(frpulsechk)
	 {
	     rchktim++;
         if(rchktim>=T1S)
	     {
	         frpulsechk=0;
		     rchktim=0;
		     if(frcntdstart)
	         {
	     	     frcntdend=1;
		     }
	     }
     }

	 if(fgpulsechk)
	 {
	     gchktim++;
         if(gchktim>=T1S)
	     {
	         fgpulsechk=0;
		     gchktim=0;
		     if(fgcntdstart)
	         {
	     	     fgcntdend=1;
		     }
	     }
     }

 	 if(frcntdstart)
	 {
		 if(frcntdend==0)
         {
             r1stim++;
			 rcntdtim++;
		     if(r1stim>=T1S)
             {
                 r1stim=0;
                 frdisp=1;
             }
             if(rcntdtim>=TMAX)
             {
                 frcomp=1;
			     frcntdstart=0;
			     frcntdend=0;
				 frdisp=0;
			 }
		 }
		 else
		 {
		     frcomp=1;
			 frcntdstart=0;
			 frcntdend=0;
			 frdisp=0;
         }
	 }

     if(fgcntdstart)
	 {
		  if(fgcntdend==0)
         {
             g1stim++;
			 gcntdtim++;
		     if(g1stim>=T1S)
             {
                 g1stim=0;
                 fgdisp=1;
             }
  		     if(gcntdtim>=TMAX)
             {
                 fgcomp=1;
			     fgcntdstart=0;
			     fgcntdend=0;
				 fgdisp=0;
			 }
		 }
		 else
		 {
		     fgcomp=1;
			 fgcntdstart=0;
			 fgcntdend=0;
			 fgdisp=0;
         }
	 }
}

void rint() interrupt 0
{
     frpulsechk=1;
p17=!p17;
/*	 tt1++;

	 if(tt1>=100)
	 {
	 tt2++;
	 tt[tt2]=tt0;
	 tt0=0;
	 tt1=0;
	 }
     if(tt2=10) tt2=0;
   */  
     
     if (frcntdstart==0)
     {
         if(rchktim>T100MS && rchktim<T500MS)//如果时间大于100ms并且小于500ms,准备开始计数
         {
             rcntdtim=rchktim;//延时计数器
             r1stim=rchktim;//
             frcntdstart=1;//延时开始标志
         }
     }

     rchktim=0;//清0脉宽计数器
}

void gint() interrupt 2
{
     fgpulsechk=1;

     if (fgcntdstart==0)
     {
         if(gchktim>T100MS && gchktim<T500MS)//如果时间大于100ms并且小于500ms,准备开始计数
         {
             gcntdtim=gchktim;//延时计数器
             g1stim=gchktim;//
             fgcntdstart=1;//延时开始标志
         }
     }

     gchktim=0;//清0脉宽计数器
}

void disp(uchr num)
{

     P1=0xFF;
	 LE=0;

	 switch(num%10)
	 {
	     case 0:P1 = P1 & DISP_0; break;

		 case 1:P1 = P1 & DISP_1; break;

		 case 2:P1 = P1 & DISP_2; break;

		 case 3:P1 = P1 & DISP_3; break;

		 case 4:P1 = P1 & DISP_4; break;

		 case 5:P1 = P1 & DISP_5; break;

		 case 6:P1 = P1 & DISP_6; break;

		 case 7:P1 = P1 & DISP_7; break;

		 case 8:P1 = P1 & DISP_8; break;

	     case 9:P1 = P1 & DISP_9; break;

	     default: break;
	 }

     if(num>=10) P1&=DISP_10;

     LE=1;
     delay();
     LE=0;
}


void main(void)
{
     uchr rdisptim=0;
     uchr gdisptim=0;
     uchr tmp=0,i=0;

     P1=0xFF;
	 LE=0;
     EA=1;
     //外部中断允许,下降沿触发
     EX0=1;
     PX0=1;
     IT0=1;

     EX1=1;
     PX1=1;
     IT1=1;

     //T0:16位,10ms
     TMOD=0X11;
     ET0=1;
     TL0=0x66;
     TH0=0xFC;
     TR0=1;

	 //x5045ini();
     while(1)
     {
	      if(frdisp==1)
	      {
		      frdisp=0;

			  if(rdisptim>1)
              {
                  rdisptim--;
                  disp(rdisptim);

			  }
               else
                        {
                        P1=0;
                        LE=1;
                        delay();
                        LE=0;
                        }

		  }

          if(fgdisp)
	      {
		      fgdisp=0;
			  if(gdisptim)
              {
                  disp(gdisptim);
			      gdisptim--;
			  }
		  }

	      if(frcomp)
          {
              frcomp=0;
			  tmp=(rcntdtim-T1S)/1000;
			  if(((rcntdtim-T1S)%1000)/100 >= 5) tmp++;
			  if(rcountdn!=tmp)
 			  {
			      rcountdn[i]=tmp;
                  i++;

			  }
		      rdisptim=rcountdn;
          }
          if(fgcomp)
          {
              fgcomp=0;
			  tmp=(gcntdtim-T1S) / 1000;
			  if(((gcntdtim-T1S) % 1000)/100 >= 5) tmp++;
			  if(gcountdn!=tmp)
 			  {
			      gcountdn=tmp;
			  }
			  gdisptim=gcountdn;
          }

     }
}

⌨️ 快捷键说明

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