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

📄 main.c

📁 使用LPC2214的测控系统
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************Copyright (c)**************************************************
**                              			LEADOO
**                                      wide_zhang@163.com
**                                 http://www.leadoo.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2006-05-12
** Last Version:		1.0
** Descriptions:		The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:			WideZhang
** Created date:		2006-05-12
** Version:				1.0
** Descriptions:		The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.h"

uint8 reflash;        //刷行lcd的控制标记
uint8 reflash1;
uint8 sleep ;        //等待火车到来标志
uint8 axle_aft_compartment; //计节中断结束后 轴轧过磁钢的数量
uint16 axles;         //火车的轴数
uint16 compartment;   //火车的节数
uint16 pulse;         //发送uart帧的序号
uint32 delta_time;    //前后磁钢的间隔时间
uint32 Pre_T0CR0;     //上一次前磁钢的时间
uint32 Current_T0CR0;     //本次前磁钢的时间
uint32 delta[4];
struct package
{
	unsigned char ulHead; //0xaa
	unsigned char ulHead1;//0xaa
	unsigned char ulHead2;//0xaa

	unsigned char uStartStop;//0xaa=start, 0xbb=stop, other 
	unsigned char Pulse1;//每次来车后测量板发送的数据序号
	unsigned char Pulse2;//每次来车后测量板发送的数据序号

	unsigned char Minute;//每次来车后-分
	unsigned char Second;//每次来车后-秒
	unsigned char milHigh;//每次来车后-毫秒
	unsigned char milLow; //每次来车后-毫秒

	unsigned char speedHigh;//车速-毫米/秒-高字节
	unsigned char speedLow; //车速-毫米/秒-低字节

	unsigned char uCartNum;//车位,机车 = 0位

	unsigned char uAxisHigh;//车轴高
	unsigned char uAxisLow; //车轴低


}data;               //发送帧的结构
void   __irq IRQ_EINT1(void);
void   __irq IRQ_EINT3(void);
void   __irq IRQ_Timer0(void);
void   __irq IRQ_Timer1(void);
/****************************************************************************
* 名称:DelayMS()
* 功能:长软件延时
* 入口参数:dly		延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void  DelayMS(uint32  dly)
{  uint32  i;

   for(; dly>0; dly--) 
      for(i=0; i<7000; i++);
}
/****************************************************************************
* 名称:LCD_RS(int x)
* 功能:set or clr rs
****************************************************************************/
void LCD_RS(uint8 x)
{
	if (x==0)IO0CLR=0x10;
	else	IO0SET=0x10;		
}
/****************************************************************************
* 名称:LCD_RS(int x)
* 功能:set or clr E
****************************************************************************/
void LCD_E(uint8 x)
{
	if (x==0)IO0CLR=0x20;
	else	IO0SET=0x20;		
}
/****************************************************************************
* 名称:LCD_DATA()
(int x)
* 功能:set or clr E
****************************************************************************/
void LCD_DATA(uint32 Data)
{
	Data&=0xff;
	Data=Data<<6;
	IO0CLR=0x3fc0;
	IO0SET=Data;
}

void LCD_Enable(void)
{
	LCD_RS(0);
	LCD_E(1);
	DelayMS(1);
	LCD_E(0);

}
void Write_Position(int8 row,int8 colum)
{
unsigned char p;
	if(row==1)
	{
		p=0x80+colum-1;
		LCD_DATA(p);
		LCD_Enable();
	}
	else
	{
		p=0xc0+colum-1;
		LCD_DATA(p);
		LCD_Enable();
	}
}
	
void D_char(unsigned char a)
{
	LCD_DATA(a);
	LCD_RS(1);
	LCD_E(1);
	DelayMS(1);
	LCD_E(0);
	
}
			
#define  UART_BPS	9600			/* 定义通讯波特率 */
/****************************************************************************
* 名称:UART0_Ini()
* 功能:初始化串口0。设置为8位数据位,1位停止位,无奇偶校验,波特率为115200
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  UART0_Init(void)
{  uint16 Fdiv;

   U0LCR = 0x83;		            // DLAB = 1,可设置波特率
   Fdiv = (Fpclk / 16) / UART_BPS;  // 设置波特率
   U0DLM = Fdiv / 256;							
   U0DLL = Fdiv % 256;						
   U0LCR = 0x03;
}
				

/****************************************************************************
* 名称:UART0_SendByte()
* 功能:向串口发送字节数据,并等待发送完毕。
* 入口参数:data		要发送的数据
* 出口参数:无
****************************************************************************/
void  UART0_SendByte(uint8 data)
{  U0THR = data;				    // 发送数据

   while( (U0LSR&0x40)==0 );	    // 等待数据发送完毕
}


/****************************************************************************
* 名称:UART0_SendStr()
* 功能:向串口发送一字符串
* 入口参数:srt		要发送的字符串的指针
* 出口参数:无
****************************************************************************/
void  UART0_SendStr(uint8 const *str)
{  while(1)
   {  if( *str == '\0' ) break;
      UART0_SendByte(*str++);	    // 发送数据
   }
}


/****************************************************************************
* 名称:GPIO_Init()
* 功能:引脚初始化函数
****************************************************************************/
void GPIO_Init(void)
{
	PINSEL0=0x000000c5;//设置P0.0 P0.1 为uart0 P0.3为EINT1 
	//0x          8              0              0              0              0             0             c           5
	//        P0.15 P0.14   P0.13 P0.12   P0.11 P0.10     P0.9 P0.8       P0.7 P0.6     P0.5 PO.4     PO.3 P0.2    P0.1 P0.0
	//         00    00       00   00       00   00        00   00         00   00       00   00       11   00      01   01
	//                                                                                                EINT1        RxD TxD
	
	IO0DIR=0x3ff0; //设置P0.4~P0.13为lcd的控制端口 p0.4为RS p0.5为E p0.6~p0.13为d0~d7
	
	
	PINSEL1=0x20000003;//设置p0.16为CAP0.2 p0.30为EINT3
	//0x          2              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
	
	
	IO3DIR=0x800;//设置P3.11为输出
	IO0DIR=0x3ff0;//设置LCD_RS LCD_E LCD_D0~D7为输出
}

/****************************************************************************
* 名称:VIC_Init()
* 功能:中断管理器初使化函数
****************************************************************************/

void VIC_Init(void)
{
 
  //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
  
  
  
  
  VICIntSelect = 0x00000000;		           //设置所有中断分配为IRQ中断

  VICVectCntl0 = 0x31;
  
  VICVectAddr0 = (int)IRQ_EINT3;	   // 设置中断3的地址
  
  VICVectCntl1 = 0x25;				   //设置定时器1
  VICVectAddr1 = (int)IRQ_Timer1;

  VICVectCntl2 = 0x24;				   //设置定时器0
  VICVectAddr2 = (int)IRQ_Timer0;

  VICVectCntl3 = 0x2F;
  VICVectAddr3 = (int)IRQ_EINT1;	   // 设置中断1的地址
	
 

  VICIntEnable = 0x20000;//使能EINT3中断	

}
/****************************************************************************
* 名称:LCD_Init()
* 功能:外部中断初使化函数
****************************************************************************/
void LCD_Init()
{
	LCD_E(0);
	LCD_RS(1);
	LCD_DATA(0x38);
	LCD_Enable();
	LCD_DATA(0x06);
	LCD_Enable();
	LCD_DATA(0x0c);
	LCD_Enable();
	LCD_DATA(0x01);
	LCD_Enable();
}

/****************************************************************************
* 名称:EINT_Init()
* 功能:外部中断初使化函数
****************************************************************************/

void EINT_Init(void)
{
 

 EXTMODE=0x0F;   //外部中断极性寄存器0
                 //对应位为0时EINT0使用电平激活 该位为1时EINT0使用边沿激活
                 //                                  8   4   2   1                //                                  E3  E2  E1  E0
 

 EXTPOLAR=0x00;   //外部中断方式寄存器
                 //对应位为0时EINT0低电平或下降沿有效由EXTMODE0决定
                 //对应位为1时EINT0高电平或上升沿有效由EXTMODE0决定
                 //                                  8   4   2   1
                 //                                  E3  E2  E1  E0
 
 
 EXTINT=0xf;     //外部中断标志寄存器  
                 //低4位写入1表示清中断 高4位不要写   8   4   2   1 
                 //                                   E3  E2  E1  E0

}


/****************************************************************************
* 名称:TIMER_Init()
* 功能:外部中断初使化函数
****************************************************************************/

void TIMER_Init(void)
{

T0PR=9;   //预分频为9+1

T0CCR=0x182;//CCR为捕获控制
		    //0x  f        f       f
            //0b  000  000  000  000
            //    c3   c2   c1   c0 
            //000 ~ cba  c 事件中断     1 使能
            //           b 下降沿捕获   1 使能
            //           a 上升沿捕获   1 使能
            //cap0.0 下降沿捕获 cap0.2下降沿捕获并且产生中断
            //所以为 0b 000 110 000 010 即为0x182;  
T0IR=0xff;//清除以前产生的中断
T1PR=110591; //预分频为110591+1 产生10ms的节拍

T1MCR=0x07;  //MCR为匹配控制
             //0x f        f       f
             //0b 000  000  000  000
             //   M3   M2   M1   M0
             //000 ~ cba  c 匹配中断     1 使能
             //           b TC复位       1 使能
             //           a 计数器禁止   1 使能
             //MR0产生中断 并复位TC 禁止计数器 
             //所以为 0b 000 000 000 111 即为0x7;

T1MR0=1000;  //匹配寄存器 30s产生匹配

T1IR=0xff;//清除以前产生的中断
}

/****************************************************************************
* 名称:IRQ_EINT3(void)      开启中断
* 功能:使系统由等待火车到来状态转换为 火车检测状态

⌨️ 快捷键说明

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