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

📄 1.c

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

#define uchr      unsigned char
#define uint      unsigned int

#define T100MS    180//100ms
#define T500MS    500//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

#define WIP  0x01 //X5045 写操作忙标志位掩码
#define WEL  0x02 //X5045 写保护标志位掩码
#define WDT  0x00 //X5045 看门狗时间:1.4s
//#define WDT  0x10 //X5045 看门狗时间:600ms
//#define WDT  0x20 //X5045 看门狗时间:200ms
//#define WDT  0x30 //X5045 关闭看门狗
#define BLA  0x00 //X5045 ROM块锁定范围:无
//#define BLA  0x04 //X5045 ROM块锁定范围:180H-1FFH
//#define BLA  0x08 //X5045 ROM块锁定范围:100H-1FFH
//#define BLA  0x0C //X5045 ROM块锁定范围:000H-1FFH


#define WREN 0x06 //允许X5045写操作
//#define WRDS 0x04 //禁止X5045写操作
#define RDSR 0x05 //读X5045状态寄存器
#define WRSR 0x01 //写X5045状态寄存器

sbit LE = P3^7;
sbit p17 = P1^7;
//X5045 PINS
sbit cs      = P3^4;
sbit sck     = P3^0;
sbit si      = P3^1;
sbit so      = P3^5;

extern bit  freset       = 0;
extern bit  frcntdstart  = 0;
//extern bit  fgcntdstart  = 0;
extern bit  frpulsechk   = 0;
//extern bit  fgpulsechk   = 0;
extern bit  frcntdend    = 0;
//extern bit  fgcntdend    = 0;
extern bit  frcomp       = 0;
//extern bit  fgcomp       = 0;
extern bit  frdisp       = 0;
//extern bit  fgdisp       = 0;
extern bit  frdispstr    = 0; //////////////

//extern uchr gcountdn     = 0;
extern uint rcntdtim     = 0;    /////////////////
//extern uchr gcntdtim     = 0;
extern uint rchktim      = 0;
//extern uint gchktim      = 0;
extern uint r1stim       = 0;
//extern uint g1stim       = 0;
extern uchr rcountdn     = 0;


void rint(void);
void t0int(void);
void disp(uchr num);
void closedisp(void);
void delay(void);
void delay1(void);
void send(uchr tx);
void x5045ini(void);
//void 2051initi(void);
void main(void)
{
  uchr rdisptim=0;
 //uchr gdisptim=0;
  uchr tmp=0,i=0;
  P1=0xFF;
  LE=0;
  EA=1;
 //外部中断允许,下降沿触发    
  PX0=1;
  IT0=1;     
  PT0=0;
  TMOD=0x11;
  TL0=0x66;
  TH0=0xFC;
  TR0=1;
  x5045ini();
  delay1();
  EX0=1;
  ET0=1;

  while(1)
   {
    cs=0;
    cs=1;
    if(frdispstr==1)//显示标志置1///
     {
      if(frdisp==1)//显示更新标志置1//
        {
          frdisp=0;//清显示更新标志//
          if(rdisptim>2)  { rdisptim--;  disp(rdisptim); }                                    
          else  closedisp();         
        }
      }
    else  closedisp();  
    if(frcomp)
     {
      frcomp=0;
      tmp=(rcntdtim-T1S)/1000;
      if(((rcntdtim-T1S)%1000)/100 >= 5)  tmp++;                        
      if(rcountdn!=tmp)    rcountdn=tmp;
      rdisptim=rcountdn-1;
      }
  }
}
     
//////外部中断0服务程序///////////////////////////////////////////////////////////////////////////////
void rint(void) interrupt 0
{
  if (frcntdstart==0)////触发脉冲还没有来到时//
   {
     if((rchktim>T100MS)&&(rchktim<T500MS))//如果时间大于100ms并且小于500ms,/////检测到触发脉冲////////准备开始计数
     {   
	   //p17=!p17;
       rcntdtim=rchktim; //延时计数器
       r1stim=rchktim; //用于处理1秒钟后要更新显示的问题//
       frcntdstart=1;    //触发脉冲来到标志
       frdispstr=1;      //显示开始标志
     }                                                  
   }
  frpulsechk=1;//保证在红灯亮的前提下让定时器0开始计数//否则定时器0进入中断只是重置初值而不计数//
  rchktim=0;//清0脉宽计数器
}
////////////定时器0中断服务程序///////////////////////////////////////////////////////////////////////
//T0:16位,1ms//11.0592MHZ晶振////////////////////
void t0int(void) interrupt 1
{
   TL0=0x66;
   TH0=0xFC;
     // tt0++;
   if(frpulsechk==1)////在红灯亮的前提下///
	{
	  rchktim++;
	  if(rchktim>=T1S)////判断学习结束//学习时间结束后的1S//
	   {
	     frpulsechk=0;//红灯已经熄灭没有脉冲了//
	     rchktim=0;
	     if(frcntdstart==1)  frcntdend=1;//置学习时间结束标志///
	   }
    }
   if(frcntdstart==1)////触发脉冲来到之后///
	{
	   if(frcntdend==0)////如果学习时间还没有结束//
	    {
          r1stim++;///从触发脉冲来到的时刻起一直在计算时间///
          rcntdtim++;///从触发脉冲来到的时刻起延时计数器也一直在计算时间///
          if(r1stim>=T1S)/////从触发脉冲来到的时刻起每隔1秒的时间//置显示更新标志
           {
             r1stim=0;///清0//
             frdisp=1;///每隔1秒的时间置显示更新标志//
           }
           if(rcntdtim>=TMAX)  frcntdend=1; ///包含触发脉冲共20S后认为结束//
	     }
	    else////学习结束///
	     {
	      frcomp=1;//比较标志置1///
		  frcntdstart=0;
		  frcntdend=0;
		  frdisp=0;
	      frdispstr=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 closedisp(void)
{
  P1=0;
  LE=1;
  delay();
  LE=0;
}
//////////////////////////    
void delay()
{
 uchr i;
 for(i=0;i<10;i++)
 {;}
}
///////////////////////////////////////////////////////
void delay1()
{
 uint i;
 for(i=0;i<1000;i++)
 {;}
}
//////////////////////////////////////////////////////
void send(uchr tx)
{
 uchr i;
 uchr tmp=0x80;
 for(i=0;i<8;i++)
 {
   sck = 0 ;
   if(tx & tmp)si = 1;
   else   si = 0;
   tmp = tmp >> 1;
   delay();
   sck = 1;
   delay();
  }
}
///////////////////////////////////////////////////////////
void x5045ini(void)
{
 cs = 1;
 delay();
 cs = 0;
 delay();
 send(WREN);
 cs = 1;
 delay();
 cs = 0;
 delay();
 send(WRSR);
 send(WDT);//设置X5045
 cs = 1;
 delay1();
}
////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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