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