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

📄 main.c

📁 使用LPC2214的测控系统
💻 C
📖 第 1 页 / 共 2 页
字号:
****************************************************************************/
void   __irq IRQ_EINT3(void) 
{ 
	VICIntEnClr=0x20000;// 关闭本中断
	
	PINSEL1=0x30000003;//设置p0.16为CAP0.2 p0.30为CAP0.0
	                   //0x          3              0              0              0              0             0              0          3
                       //        P0.31 P0.30   P0.29 P0.28   P0.27 P0.26     P0.25P0.24      P0.23P0.22    P0.21PO.20    PO.19P0.18   P0.17P0.16
	                   //         00    11       00   00       00   00        00   00         00   00       00   00       00   00      00   11
	                   //              CAP0.0                                                                                               CAP0.2
    
    T0IR=0xff;//清除应改变引脚设置而产生的捕获
    T1IR=0xff;
    EXTINT=0xf;//清除外部中断标志
    VICIntEnable=0x8030 ;//使能 EINT1 TIMER0 TIMER1 
                       //0x     0                 8                 0                       3                    0
                       // 19 18 17 16       15  14 13  12     11   10    9  8       7     6      5     4       3  2   1  0     
                       //  8  4  2  1        8   4  2   1     8     4    2  1       8     4      2     1       8  4   2  1                                                                        
                       //   a/d E3/E2       E1/E0/RTC/PLL    SPI1/SPI0/IIC/PWM0   UART1/UART0/TIMER1/TIMER0  ICE/ICE/--/WDT
    reflash1=1;                   
    sleep=0;        //清等待标志
    axles=0;        //轴数归0
	compartment=0;  //节数归0
	pulse=0;        //发送uart帧的序号归0  
    data.uStartStop=0xaa;
    T0TCR=0x1;
    T1TCR=0x1;
  
	VICVectAddr = 0;//向量中断结束					
}	

/****************************************************************************
* 名称:IRQ_TIMER0(void)       测速中断
* 功能:当车轮轧过后磁钢时 触发 记下前后磁钢的间隔时间
****************************************************************************/
void   __irq IRQ_Timer0(void) 
{   

	if(Pre_T0CR0!=T0CR0)//这次 前磁钢数据没掉 可以进行速度运算
    
     {
      	 Pre_T0CR0=T0CR0;//记录此次前磁钢的时间
	  	 delta_time=T0CR2-Pre_T0CR0;//前后磁钢的间隔时间
	 	  reflash=1; //刷行lcd的控制标记
	 }
	 
	
	if(axle_aft_compartment ==2)
	{
	EXTINT=0xf;//清中断
	VICIntEnable=0x8000;//开启记节中断
	}	
    T0IR=0xff;
    axle_aft_compartment ++;
    axles++;        //轴数加1
    T1TC=0;         //清结束中断的计数器表示火车还没走完
	VICVectAddr = 0;//向量中断结束					
}
/****************************************************************************
* 名称:IRQ_TIMER1(void)       结束中断
* 功能:当火车过去后产生此中断
****************************************************************************/
	
void   __irq IRQ_Timer1(void) 
{   
   
    VICIntEnClr=0x8030;// 关闭EINT1 TIMER0 TIMER1 中断
    T0TCR=0x2;         //关闭并复位Timer0计数器
    T1TCR=0x2;         //关闭并复位Timer1计数器
	
	PINSEL1=0x20000003;//设置p0.16为CAP0.2 p0.30为EINT3
	                   //0x          3              0              0              0              0             0              0          3
                       //        P0.31 P0.30   P0.29 P0.28   P0.27 P0.26     P0.25P0.24      P0.23P0.22    P0.21PO.20    PO.19P0.18   P0.17P0.16
	                   //         00    10       00   00       00   00        00   00         00   00       00   00       00   00      00   11
	                   //              EINT3                                                                                               CAP0.2
    
    EXTINT=0x0f;//清除应改变引脚设置而产生的捕获
    VICIntEnable=0x20000 ;//使能 EINT3 
                       //0x     2                 0                 0                       0                   0
                       // 19 18 17 16       15  14 13  12     11   10    9  8       7     6      5     4       3  2   1  0     
                       //  8  4  2  1        8   4  2   1     8     4    2  1       8     4      2     1       8  4   2  1                                                                        
                       //   a/d E3/E2       E1/E0/RTC/PLL    SPI1/SPI0/IIC/PWM0   UART1/UART0/TIMER1/TIMER0  ICE/ICE/--/WDT
                       

	data.uStartStop=0xbb;//置位结束标志
	
	reflash=1;      //刷行lcd的控制标记
	VICVectAddr = 0;//向量中断结束					
}	
/****************************************************************************
* 名称:IRQ_EINT1(void)       记节中断
* 功能:当一节火车过去时产生一次中断
****************************************************************************/
	
void   __irq IRQ_EINT1(void) 
{   
   
    VICIntEnClr=0x8000;// 关闭EINT1 TIMER0 TIMER1 中断
                       //0x     F                 F                 F                       F                    F
                       // 19 18 17 16       15  14 13  12     11   10    9  8       7     6      5     4       3  2   1  0     
                       //  8  4  2  1        8   4  2   1     8     4    2  1       8     4      2     1       8  4   2  1                                                                        
                       //   a/d E3/E2       E1/E0/RTC/PLL    SPI1/SPI0/IIC/PWM0   UART1/UART0/TIMER1/TIMER0  ICE/ICE/--/WDT
	EXTINT=0x0f;
	compartment++;  //节数加1;
	axle_aft_compartment =0;//开始计轴当轴数为2时打开中断
	reflash=1;      //刷行lcd的控制标记
	VICVectAddr = 0;//向量中断结束					
}												
uint8 const  SEND_STRING[] = "Hello World!\n";

/****************************************************************************
* 名称:main()
* 功能:
****************************************************************************/
int  main(void)
{
   DelayMS(1000);//等待外围芯片正常启动
   
   sleep=1;
   reflash=0;
   reflash1=1;
   data.ulHead=0xaa;
   data.ulHead1=0xaa;
   data.ulHead2=0xaa;
   data.uStartStop=0xaa;  
   GPIO_Init();//初始化引脚设置
   LCD_Init();
   DelayMS(100);
   	  Write_Position(1,1);  D_char(' '); 
      Write_Position(1,2);  D_char(' ');  
      Write_Position(1,3);  D_char(' '); 
      Write_Position(1,4);  D_char(' '); 
      Write_Position(1,5);  D_char(' '); 
      Write_Position(1,6);  D_char('L');		
      Write_Position(1,7);  D_char('E'); 	
      Write_Position(1,8);  D_char('E'); 	
      Write_Position(1,9);  D_char('D'); 	
      Write_Position(1,10); D_char('D');	
      Write_Position(1,11); D_char('O');  	
      Write_Position(1,12); D_char(' ');  	
      Write_Position(1,13); D_char(' ');    
      Write_Position(1,14); D_char(' ');   	
      Write_Position(1,15); D_char(' ');    
      Write_Position(1,16); D_char(' ');   
      Write_Position(2,1);  D_char('L'); 	DelayMS(2);
      Write_Position(2,2);  D_char('O');  	DelayMS(2);
      Write_Position(2,3);  D_char('A');	DelayMS(2);
      Write_Position(2,4);  D_char('D');	DelayMS(2);
      Write_Position(2,5);  D_char('I'); 	DelayMS(2);
      Write_Position(2,6);  D_char('N'); 	DelayMS(2);
      Write_Position(2,7);  D_char('G'); 	DelayMS(2);
      Write_Position(2,8);  D_char('.'); 	DelayMS(200);
      Write_Position(2,9);  D_char('.');   	DelayMS(200);
      Write_Position(2,10); D_char('.');    DelayMS(200);
      Write_Position(2,11); D_char('.');  	DelayMS(200);
      Write_Position(2,12); D_char('.');  	DelayMS(200);
      Write_Position(2,13); D_char('.');    DelayMS(200);
      Write_Position(2,14); D_char('.');   	DelayMS(200);
      Write_Position(2,15); D_char('.');    DelayMS(200);
      Write_Position(2,16); D_char('.');    DelayMS(200);
     
   UART0_Init();//初始化串口
   EINT_Init(); //初始化外部中断
   TIMER_Init();//初始化定时器
   VIC_Init();//这个初始化最后处理 中断控制器
   while(1)
   {
        DelayMS(10);
    	if(sleep==0)	
    	{ 
    	    IO3SET=0x800;
    	    if(reflash1!=0)
    			{
    			Write_Position(1,1);  D_char('S'); 
     			Write_Position(1,2);  D_char('P');  
  	   			Write_Position(1,3);  D_char('E'); 
   	     		Write_Position(1,4);  D_char('E'); 
  	     		Write_Position(1,5);  D_char('D'); 
     	 		Write_Position(1,6);  D_char(':');		
     	 		Write_Position(1,7);  D_char('0'); 	
     	 		Write_Position(1,8);  D_char('0'); 	
     	 		Write_Position(1,9);  D_char('.'); 	
     	 		Write_Position(1,10); D_char('0');	
     	 		Write_Position(1,11); D_char(' ');  	
     			Write_Position(1,12); D_char('C');  	
     	 		Write_Position(1,13); D_char(':');    
     	 		Write_Position(1,14); D_char('0');   	
     	 		Write_Position(1,15); D_char('0');    
     	 		Write_Position(1,16); D_char('0');   
     	 		Write_Position(2,1);  D_char('T'); 	
    	 		Write_Position(2,2);  D_char(':');  	
         		Write_Position(2,3);  D_char('0');		
         		Write_Position(2,4);  D_char('0');	 	
         		Write_Position(2,5);  D_char(':'); 	
     	 		Write_Position(2,6);  D_char('0'); 	
     	 		Write_Position(2,7);  D_char('0'); 	
     	 		Write_Position(2,8);  D_char(':'); 	
     	 		Write_Position(2,9);  D_char('0');   	
     	 		Write_Position(2,10); D_char('0');    
     	 		Write_Position(2,11); D_char(' ');  	
     	 		Write_Position(2,12); D_char('A');  	
     	 		Write_Position(2,13); D_char(':');    
     	 		Write_Position(2,14); D_char('0');   	
     	 		Write_Position(2,15); D_char('0');    
     	 		Write_Position(2,16); D_char('0');
				reflash1=0;
    			}
    		if(reflash==1)
    		{
    			
    			
    			if(axles==1)
    			{
					delta[3]=delta[2]=delta[1]=delta[0]=delta_time;//加权平均
			
				}
				else

				{
					delta[3]=delta[2];
					delta[2]=delta[1];
					delta[1]=delta[0];
					delta[0]=delta_time;
					delta_time=(delta[0]*4+delta[1]*2+delta[2]+delta[3])/8;
				}
				
    		    reflash=0;
    		 }
    		if(data.uStartStop==0xbb)
    		sleep=1;
    		
    		pulse++;  
    		
    		
    		data.Pulse1=pulse/256;//每次来车后测量板发送的数据序号
			data.Pulse2=pulse%256;//每次来车后测量板发送的数据序号
			Current_T0CR0=T0TC;
			data.Minute=Current_T0CR0/1105920/60;        //每次来车后-分
			data.Second=Current_T0CR0/1105920%60;        //每次来车后-秒
			data.milHigh=(Current_T0CR0/1106%1000)/256;       //每次来车后-毫秒
			data.milLow =(Current_T0CR0/1106%1000)%256;        //每次来车后-毫秒

			data.speedHigh=552960000/(delta_time+1)/256;//车速-毫米/秒-高字节
			data.speedLow =552960000/(delta_time+1)%256; //车速-毫米/秒-低字节

			data.uCartNum=compartment;//车位,机车 = 0位

			data.uAxisHigh=axles/256;//车轴高
			data.uAxisLow =axles%256;//车轴低 
			
			
    		UART0_SendByte(data.ulHead);
			UART0_SendByte(data.ulHead1);
			UART0_SendByte(data.ulHead2);
			UART0_SendByte(data.uStartStop);
			UART0_SendByte(data.Pulse1);
			UART0_SendByte(data.Pulse2);
			UART0_SendByte(data.Minute);
			UART0_SendByte(data.Second);
			UART0_SendByte(data.milHigh);
			UART0_SendByte(data.milLow);
			UART0_SendByte(data.speedHigh);
			UART0_SendByte(data.speedLow);
			UART0_SendByte(data.uCartNum);
			UART0_SendByte(data.uAxisHigh);
			UART0_SendByte(data.uAxisLow); 
			Write_Position(1,7); D_char(0x30+1990656/(delta_time+1)/100%10);
			Write_Position(1,8); D_char(0x30+1990656/(delta_time+1)/10%10);
			Write_Position(1,10);D_char(0x30+1990656/(delta_time+1)%10);
			
			Write_Position(1,14);D_char(0x30+compartment/100%10);
			Write_Position(1,15);D_char(0x30+compartment/10%10);
			Write_Position(1,16);D_char(0x30+compartment%10);
			
			Write_Position(2,3);D_char(0x30+data.Minute/10%10);
			Write_Position(2,4);D_char(0x30+data.Minute%10);
			Write_Position(2,6);D_char(0x30+data.Second/10%10);
			Write_Position(2,7);D_char(0x30+data.Second%10);
			Write_Position(2,9);D_char(0x30+Current_T0CR0/1106/100%10);
			Write_Position(2,10);D_char(0x30+Current_T0CR0/1106/10%10);
			
			Write_Position(2,14);D_char(0x30+axles/100%10);
			Write_Position(2,15);D_char(0x30+axles/10%10);
			Write_Position(2,16);D_char(0x30+axles%10);   
     	 
     	 //DelayMS(1000);
     	// IO3CLR=0x800;
     	}
     else 
     	{
     	IO3CLR=0x800;
     	
     	if(reflash!=1)
     	{
     	 Write_Position(1,1); D_char('W'); 
     	 Write_Position(1,2); D_char('a');  
  	     Write_Position(1,3); D_char('i'); 
   	     Write_Position(1,4); D_char('t'); 
  	     Write_Position(1,5); D_char('t'); 
     	 Write_Position(1,6); D_char('i');		
     	 Write_Position(1,7); D_char('n'); 	
     	 Write_Position(1,8); D_char('g'); 	
     	 Write_Position(1,9); D_char(' '); 	
     	 Write_Position(1,10); D_char(' ');	
     	 Write_Position(1,11); D_char(' ');  	
     	 Write_Position(1,12); D_char(' ');  	
     	 Write_Position(1,13); D_char(' ');    
     	 Write_Position(1,14); D_char(' ');   	
     	 Write_Position(1,15); D_char(' ');    
     	 Write_Position(1,16); D_char(' ');   
     	 Write_Position(2,1); D_char(' '); 	
    	 Write_Position(2,2); D_char(' ');  	
         Write_Position(2,3); D_char(' ');		
         Write_Position(2,4); D_char(' ');	 	
         Write_Position(2,5); D_char(' '); 	
     	 Write_Position(2,6); D_char('f'); 	
     	 Write_Position(2,7); D_char('o'); 	
     	 Write_Position(2,8); D_char('r'); 	
     	 Write_Position(2,9); D_char(' ');   	
     	 Write_Position(2,10); D_char('t');    
     	 Write_Position(2,11); D_char('r');  	
     	 Write_Position(2,12); D_char('a');  	
     	 Write_Position(2,13); D_char('i');    
     	 Write_Position(2,14); D_char('n');   	
     	 Write_Position(2,15); D_char(' ');    
     	 Write_Position(2,16); D_char(' ');}
      reflash=0;    
     	} //DelayMS(1000); 
   }
   return(0);
}


/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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