📄 main.c
字号:
****************************************************************************/
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 + -