📄 main.c
字号:
/**************************************
*main函数
*Author:echo
*Start Date:2008.4.23
*End Date:
*内容:实现各部分功能
*进度:2008.4.24对接收数据进行处理:丢失,移动,低电压
**************************************/
/**************************************
*头文件
**************************************/
#include "main.h"
#include "SCI.h"
#include "pub_def.h"
#include "wait.h"
/**************************************
*全局变量定义
**************************************/
/*和zigbee模块通信波特率为38400,和PC通信波特率为9600
**晶振频率为.......,总线频率为。。。*/
extern UINT8 SciRxBufZb[SCI_RX_BUF_ZB];
extern UINT8 SciRxBuf[SCI_RX_BUF_TC];
extern UINT8 SciTxBuf[SCI_TX_BUF_TC];
extern char Rx2Status;
extern UINT8 SciRxPtr;
extern UINT8 Sci2RxPtr;
extern UINT8 SciTxFlag;
extern UINT8 RxTimeoutFlag;
extern UINT8 SciRxPtr;
extern UINT8 SciTxPtr;
extern UINT8 SciTxLen;
extern UINT8 PrepareTime;
extern UINT8 PrepareTimeFlag;
extern UINT8 GoTime;
extern UINT8 GoTimeFlag;
extern UINT8 RingTime;
extern UINT8 RingTimeFlag;
extern UINT8 HangTime;
extern UINT8 HangTimeFlag;
extern UINT8 LostCount;
extern UINT8 LostAlarmBuff[15];
extern UINT8 PowerCount;
extern UINT8 PowerAlarmBuff[15];
extern UINT8 MoveCount;
extern UINT8 MoveAlarmBuff[15];
extern UINT8 MasterCount;
extern UINT8 MasterPowerLoss;
extern UINT8 AlarmTime;
extern UINT8 first;
extern UINT8 FLASHBUFFER[20];
//RAM子机存储、操作
SLAVE_INFO Slave_Ram_Buff[15]={0}; //结构数组,放2个子机,包括子机ID和子机状态2bytes。
MASTER_INFO Master_Ram_Buff={0};
//UINT8 Slave_Num=0; //子机个数
//FLASH操作
UINT8 *p1_rom=(UINT8*)0x1080; //flash第一页指针
UINT8 *p2_rom=(UINT8*)0x1200; //flash第二页指针,pc
UINT8 *p2_rom_z=(UINT8*)0x1210; //flash第二页指针,zigbee
UINT8 *p3_rom=(UINT8*)0x1400; //flash第三页指针
UINT8 *p4_rom=(UINT8*)0x1600; //flash第四页指针
int FAddr; //向汇编传递flash的地址
char FCont; //向汇编传递写入flash的内容
UINT8 Flag_P = 0;
UINT8 Flag_S = 0;
//各结构体变量
rx_packet_t rx_packet={0}; //定义一个用于接受的数据对象
RXFRAME_S rx_data_buffer={0}; //接收有效数据缓存
Date_Time Date_Time_Buff={0}; //存放时间
//char Receive_DeviceID; //接收到的子机命令帧的子机地址
char LOST_DeviceID=0; //上报的丢失的子机ID
char Move_DeviceID=0; //移动子机ID
char Low_DeviceID=0; //低电压子机ID
char Normal_DeviceID=0; //正常子机ID
//定时器计数器
UINT16 timer_count1 = 0; //定时器1计数,用于统计是否丢失
UINT8 timer_count2 = 0; //定时器2计数,1S中断,用于计时
//标志位
char NORMAL_Flag=0; //正常收到标志位
char MOVE_Flag=0; //移动报警标志位
char LOST_Flag=0; //丢失报警标志位
char LOW_BATT_Flag=0; //低电压报警标志位
char COMMU_ERROR_Flag=0; //子机和座机通信错误标志位
char commu_error_finishflag=0; //子机和座机通信错误报警结束标志位
int commu_error_finishtime=0;
char MasterPower_Flag=0;//主机交流电掉电标志位
//watchdog flag
UINT8 commu_watchdog=0;
UINT8 LOST_NUM=0;
UINT8 LOW_BATT_NUM=0;
UINT8 MOVE_NUM=0;
//上层可以配置的子机数目
UINT8 SlaveNumber = 0;
//writealarm函数
ALARM_INFO Slave_Alarm_Info;
//从WRITECONFIG和WRITEALARMINFO函数里面出来的变量
flashunion FlashUnion;
//TC35i计数程序的变量
UINT16 AlarmTimeCount=0;
UINT16 RingTimeCount=0;
UINT16 HangTimeCount=0;
UINT16 PrepareTimeCount=0;
UINT16 GoTimeCount=0;
UINT8 CommuErrorCount=0;
UINT8 CellPhone =1;
//UINT8 godown=0;
/******************************************
*主函数
******************************************/
void main(void){
UINT8 transmit_data[7]={0x80,0x00,0x00,0x00,0x01,0xAB,0x2A};
UINT8 i;
DisableInterrupts; //Disable Interrupts
//变量初始化 ,防止变量随机变化
/****************************************************************/
LOST_DeviceID=0; //上报的丢失的子机ID
Move_DeviceID=0; //移动子机ID
Low_DeviceID=0; //低电压子机ID
Normal_DeviceID=0; //正常子机ID
timer_count1 = 0; //定时器1计数,用于统计是否丢失
timer_count2 = 0; //定时器2计数,1S中断,用于计时
NORMAL_Flag=0; //正常收到标志位
MOVE_Flag=0; //移动报警标志位
LOST_Flag=0; //丢失报警标志位
LOW_BATT_Flag=0; //低电压报警标志位
COMMU_ERROR_Flag=0; //子机和座机通信错误标志位
commu_watchdog=0;
Date_Time_Buff.year=8;
Date_Time_Buff.month=5;
Date_Time_Buff.day=27;
Date_Time_Buff.hour=14;
Date_Time_Buff.minute=19;
LOW_BATT_NUM=0;
MOVE_NUM=0;
LOST_NUM=0;
p2_rom = (UINT8*)0x1200;
p2_rom_z=(UINT8*)0x1210;
AlarmTimeCount=0;
RingTimeCount=0;
PrepareTimeCount=0;
GoTimeCount=0;
CommuErrorCount=0;
/*****************************************************************/
//开始主程序
SoftDog_Init(); //软初始化,可以开启或者关闭软狗
App_Init(); //应用初始化,以及上电后从flash库里将内容考到RAM中,包括子机ID,电话号码
GPIOConfigInit(); //初始化IO管脚
SCIInit(); //初始化串口
TimeInterrupt_Init() ; //定时中断初始化
IRQ_Init(); //交流掉电检测初始化
EnableInterrupts; /* enable interrupts */
//Feed_SoftDog();
Feed_HardDog();//喂硬狗
DelayMS(7000);//等待清除tc35模块的sysstart
RxTimeoutFlag =0;
for(i=0;i<SCI_TX_BUF_TC;i++)
{
SciTxBuf[i]=0;
}
for(i=0;i<SCI_RX_BUF_TC;i++)
{
SciRxBuf[i]=0;
}
SciTxPtr=1;
SciRxPtr=0;
/* include your code here */
for(;;)
{
Feed_HardDog();//喂硬狗
if(AlarmTime) //报警轮询500ms定时到,读取报警包
{
AlarmTime = 0;
Transmit_SCI2_Str(transmit_data,7);
DelayMS(350);
/*有开始命令
if(Flag_S) //PC控制端允许监控,才进入报警循环
{
ProcessReceiveDataLoop();
}
*/
ProcessReceiveDataLoop();//有子机就可以进入报警循环
//Feed_SoftDog(); //喂软狗
}
for(i=0;i<100;i++)//方便喂狗而写的循环
{
if(first) //只有在发短信打电话的循环完成以后,即MCU空闲的时候可以配置
{
ProcessPcLoop(); //PC配置、读取轮询
LED10OFF();//指示单片机处于非报警状态
}
}
//Feed_SoftDog(); //喂软狗
}
}//主函数结束
void SoftDog_Init(void)
{
SOPT = 0x53; //关闭软狗
//SOPT = 0xD3; //开启软狗,长周期模式30ms喂狗
}
void Feed_SoftDog(void)
{
SRS = 0;//对此寄存器写任意的值都会清除软狗计数器
}
void Feed_HardDog(void)
{
PTAD_PTAD4 = 0;
PTAD_PTAD4 = 1; //DOG脚置1喂硬狗
DelayMS(1); //满足100ns的脉冲宽度要求
PTAD_PTAD4 = 0;
}
/**************************************************************
* Function name: App_Init()
* Parameters: none
* Return: none
* Actions: application initial
**************************************************************/
void App_Init(void) {
UINT8 i=0;
UINT8 j=0;
// Slave_Num=0;
/* flash指针初始化 */
p1_rom = (UINT8*)0x1080; //第一页flash,0x1080~0x11ff,共404bytes,存放子机ID
p2_rom = (UINT8*)0x1200; //第二页flash,0x1200~0x13ff,共512bytes,存放报警记录
p2_rom_z=(UINT8*)0x1210; //flash第二页指针,zigbee
p3_rom = (UINT8*)0x1400; //第三页flash,0x1400~0x15ff,共512bytes,存放报警电话
p4_rom = (UINT8*)0x1600; //第四页flash,0x1600~0x17ff,共512bytes,存放密码
FAddr = 0; //向汇编传递flash的地址
FCont = 0; //向汇编传递写入flash的内容
/* 初始化RAM子机信息 */
for(i=0;i<15;i++){
Slave_Ram_Buff[i].SlaveID = 0;
Slave_Ram_Buff[i].Status = 0;
Slave_Ram_Buff[i].move_count=0;
Slave_Ram_Buff[i].low_batt_count=0;
Slave_Ram_Buff[i].move_finishflag=0; //报警结束标志位,0为结束,1为正在报警,时间5分钟
Slave_Ram_Buff[i].move_finishtime=0; //报警计时标志位,从finishflag置为1开始计时,计5分钟后将finishflag置为0
Slave_Ram_Buff[i].low_batt_finishflag=0;
Slave_Ram_Buff[i].low_batt_finishtime=0;
Slave_Ram_Buff[i].lost_finishflag=0;
Slave_Ram_Buff[i].lost_finishtime=0;
// Slave_Ram_Buff[i].
}
/*写Flash2中的End位,以免在无报警信息时,读报警信息产生乱码*/
WriteAlarm(0,0);
}
/**************************************************************
* Function name: Data_Evalate()
* Parameters: none
* Return: none
* Actions: 将从SCI中断接收来的数据进行数值传递
**************************************************************/
void Data_Evalate(void){
UINT8 i;
/* 收到zigbee发送到数据包分析 */
rx_packet.dataLength = Sci2RxPtr; //收到的数据长度
rx_packet.data = (UINT16 *)&rx_data_buffer; //收到的数据
rx_packet.maxDataLength = BUFLEN; //最大长度
rx_packet.status = Rx2Status; //报告状态
//接收到的数据包赋值
rx_data_buffer.Head[0] = SciRxBufZb[0];
rx_data_buffer.Head[1] = SciRxBufZb[1];
rx_data_buffer.Head[2] = SciRxBufZb[2];
rx_data_buffer.Head[3] = SciRxBufZb[3];
rx_data_buffer.Head[4] = SciRxBufZb[4];
rx_data_buffer.Head[5] = SciRxBufZb[5];
rx_data_buffer.End = SciRxBufZb[108];
for (i=0;i<SlaveNumber;i++){
rx_data_buffer.TAG[i].Mac_AddH =SciRxBufZb[6*(i+1)];
rx_data_buffer.TAG[i].Mac_AddL = SciRxBufZb[6*(i+1)+1];
rx_data_buffer.TAG[i].Link_Quality = SciRxBufZb[6*(i+1)+2];
rx_data_buffer.TAG[i].RSSI = SciRxBufZb[6*(i+1)+3];
rx_data_buffer.TAG[i].Check_SlaveH = SciRxBufZb[6*(i+1)+4];
rx_data_buffer.TAG[i].Check_SlaveL = SciRxBufZb[6*(i+1)+5];
}
}
/**************************************************************
* Function: Interrupt_Init()
* Parameters: none
* Return: none
* Actions: interrupt initial,这里只定义了定时中断
**************************************************************/
void TimeInterrupt_Init(void){
// Timer1中断初始化,用于检测判断超出范围报警,同时用作看门狗
TPM1SC = 0x4F; //开定时器1中断,使用总线频率8M,128分频
TPM1MOD = 0x2B6; //每隔1/(8888832/128) *(0x2B6)= 10ms 中断一次
TPM1CNT = 0x00;
// Timer2中断初始化,用于时间计时
TPM2SC = 0x4F; //开定时器2中断,使用总线频率8M,128分频
TPM2MOD = 0xFE4F; //64.0007次中断是一分钟
TPM2CNT = 0x00;
}
void IRQ_Init(void){
IRQSC = 0x13; //选择了下降沿低电压检测方式,使能中断
//IRQSC = 0x03; //关主机交流掉电中断
}
/**********************************************************
* 函数名: VTimer1
* 作者: zgq
* 时间: 2007.12.7
* 版本号: 1.0
* 功能:
* 修改时间
*
*************************************************************/
interrupt void VTimer1(){
UINT16 time1 = 80;
UINT16 time2 = 800;
UINT16 time3 = 300;
UINT16 time4 = 500;
DisableInterrupts;
TPM1SC_TOIE = 0;
/******AlarmTime的计时********/
if(AlarmTimeCount == time1){
AlarmTime = 1;
AlarmTimeCount = 0; //归零
}
if(AlarmTime==0){
AlarmTimeCount++;
}
/*****************************/
/************gotime计时***********/
if(GoTimeCount==time2){
GoTime=1;
GoTimeCount = 0;
GoTimeFlag = 0;
}
if(GoTimeFlag==1){
GoTimeCount++;
}
/***********************************/
/***preparing计时****************/
if(PrepareTimeCount==time3){
PrepareTime=1;
PrepareTimeCount=0;
PrepareTimeFlag=0;
}
if(PrepareTimeFlag ==1){
PrepareTimeCount++;
}
/**********************************/
/***********************************/
/***HangTime计时****************/
if(HangTimeCount==time4){
HangTime=1;
HangTimeCount=0;
HangTimeFlag=0;
}
if(HangTimeFlag ==1){
HangTimeCount++;
}
/**********************************/
////////////添加时钟中断处理代码//////
if((RxTimeoutFlag > 0)&&(RxTimeoutFlag <200))
{
RxTimeoutFlag++;
}
TPM1SC_TOF = 0;
TPM1SC_TOIE = 1;
EnableInterrupts;
return;
}
void Check_data_indication(rx_packet_t *rx_packet_rx) //分析接收到的数据
{
UINT8 i;
UINT8 j=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -