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

📄 4-15.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 delay(void);
void delay1(void);
void send(uchr tx);
void x5045ini(void);

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;

     ET0=1;
     PT0=0;
     TMOD=0X11;
     TL0=0x66;
     TH0=0xFC;
     TR0=1;
     x5045ini();
     while(1)
             {
             cs=0;
             cs=1;
            if(frdispstr==1)
              {
	      if(frdisp==1)
	             {
		      frdisp=0;

	              if(rdisptim>2)
                              {
                              rdisptim--;
                              disp(rdisptim);
                              }
                      else
                              {
                              P1=0;
                              LE=1;
                              delay();
                              LE=0;
                              }
                      }
                 }
            else
                 {
                 P1=0;
                 LE=1;
                 delay();
                 LE=0;
                 }
              if(frcomp)
                      {
                      frcomp=0;
		      tmp=(rcntdtim-T1S)/1000;
		      if(((rcntdtim-T1S)%1000)/100 >= 5)
                              {
                              tmp++;
                              }
		      if(rcountdn!=tmp)
 			      {
			      rcountdn=tmp;

			      }
		      rdisptim=rcountdn-1;
                      }
              }
     }
     

void rint(void) interrupt 0
    {
     if (frcntdstart==0)
         {
         //if((rchktim>T100MS) && (rchktim<T500MS))//如果时间大于100ms并且小于500ms,准备开始计数
         if((rchktim>T100MS) & (rchktim<T500MS))   /////////////
             {   //p17=!p17;
             rcntdtim=rchktim;//延时计数器
             r1stim=rchktim;//
             frcntdstart=1;//延时开始标志
             frdispstr=1;//显示开始标志
             }                                                  
         }
     frpulsechk=1;
     rchktim=0;//清0脉宽计数器
}

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



 	 if(frcntdstart==1)
	         {
		 if(frcntdend==0)
                         {
                          r1stim++;
		          rcntdtim++;
		          if(r1stim>=T1S)
                                 {
                                  r1stim=0;
                                  frdisp=1;
                                 }
                          if(rcntdtim>=TMAX)
                                 {
                                 frcntdend=1;   /////////////////
			         }
		         }
		 else
		         {
		         frcomp=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 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 + -