📄 main.c
字号:
//----------------------------------------------------------------------------
// Demo Application for MSP430/CC1100-2500 Interface Code Library v1.0
//08年7月29日,弄了Lpm3中断响应,TI_CC_RF_FREQ 2400还是只能接收一次,
//TI_CC_RF_FREQ 弄了Lpm3中断响应401还是能接收多次,不能保证每时都收到东西
//7月30日-wor状态成功,没有弄状态转换
//10-23,菜单基本没有问题,注意0减1变负的情况,要用'signed'标示
//----------------------------------------------------------------------------
#include "include.h"
//#define _TRANSMITTER
//#define _RECEIVER
//#define _lcd
extern char paTable[]; //功率能量
extern char paTableLen;
static signed char Hour_1,hour_1,min_1;
static signed char Hour_2,hour_2,min_2;
static signed char bai_1,ten_1,num_1;
static signed char bai_2,ten_2,num_2;
static signed char Add_1,add_1;
static signed char Add_2,add_2;
static signed char Add_3,add_3;
int buff[20]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20};
//extern uchar txBuffer1[] = {0x08,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08}; //第一个字节是发送的数据长度,第二个字节是地址
int ww=0;
uchar TxBuff485[31]; //发送数据缓冲区一组 数据
char RxBuff485[N_XY_BAO]; //接收数据缓冲区rx_pc
uchar NRxBuff; //从pc收到数据长度,
uchar re_tx; //重发次数
char next;
char k=0;
char m=0;
char rxBuffer[8];
char rxbuffer485[27];
uint arc,crc;
uchar bWaitRe; //1:发送数据包后等待PC返回对数据包的校验结果;0:不等待
uchar Command=NONE_COMMAND; //收到的指令
uint SendByte=0; //准备发送的字节数
uchar bUartRxErr; //1:接收数据出错,如帧错、奇偶校验错等;0:没错
uchar NTxBuff;
extern char txBuffer2500[]; //第一个字节是发送的数据长度,第二个字节是地址
extern char rxBuffer2500[];
int coll_tim;//采集时间间隔小时位,最大为6个小时coll_tim_h;coll_tim_m;
int ret_tim;//返回时间间隔小时位 ret_tim_h;ret_tim_m;
int pre_tem;//预警温度
int ann_tem;//报警温度
char rtu_addr;//下位机地址
char temp_addr; //测温点地址
/****************************6个点的温度存储数组****************************/
char site1[24] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
char site2[24] ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
char site3[24] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
char site4[24] ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
char site5[24] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
char site6[24] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
uint receive10m ; //10分钟标志
uint receive20s ; // 20s标志
uchar flag;
uchar menu_open; //轮显任务运行程序标志
uchar key_code;
uchar rtu_view; //单点温度显示任务运行程序标志
uchar buf;
void turn_show_task(void);
/**************************************/
extern task task_pri[] = { //为任务优先级标志,
{0x00,null}, //
{0x00,null},
{0x00,menu_task}, //menu_task
{0x00,rtu_view_task}, ///rtu_view_task
{0x00,turn_show_task}
};
uchar curr_pos2 ; //功能菜单,光标位置
uchar curr_pos;//光标位置行号
uchar curr_menu_id;//当前菜单下标
uchar alt;
//uchar set_time[] = {'0','0',':','0','0'};
uchar set_time = ':';
uchar set_code[] = {'0','0','0'};
uchar ret_err[] = {"错误"};
uchar ret_ok[] = {"成功"};
uchar alt_view1[] = {"上隔离开关(上)"};//08-09-22
uchar alt_view2[] = {"上隔离开关(下)"};//08-09-22
uchar view_a[] = {'A','B','C'}; //字母显示
uchar view_tem[] = {"相温度: 度"};
uchar rtu_head1[] = {"隔离开关上"};//08-09-26
uchar rtu_head2[] = {"隔离开关下"};//08-09-26
menu menu_table[] = {
{"",null,0,0,0,0},//定义一个不存在的菜单
{"设置采集时间间隔",null,0,2,0,8},//1
{"设置返回时间间隔",null,1,3,0,9},//2
{"设置预警温度 ",null,2,4,0,10},//3
{"设置报警温度 ",null,3,5,0,11},//4
{"采集测温点温度 ",null,4,6,0,12},//5
{"设置设备地址 ",null,5,7,0,13},//6
{"查询 ",null,6,0,0,14},//7
{"设置采集时间间隔",null,0,0,1,0},//8
{"设置返回时间间隔",null,0,0,2,0},//9
{"设置预警温度 ",null,0,0,3,0},//10
{"设置报警温度 ",null,0,0,4,0},//11
{"请输入测温点地址",null,0,0,5,0},//12
{"设置设备地址 ",null,0,0,6,0},//13
{"查询测温点温度 ",null,0,0,7,0}//14
};
/* CRC 高位字节值表 */
static uchar auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40
};
/* CRC低位字节值表*/
static uchar auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4,
0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,
0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,
0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE,
0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2,
0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB,
0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,
0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88,
0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,
0x40
};
/*****************************************************************************
CRC计算子程序
usDataLen; 消息中字节数
*pushMsg; 要进行CRC校验的消息
******************************************************************************/
uint CRC16(uchar *pushMsg,uint usDataLen)
{
uchar uchCRCHi=0xFF; /*高CRC字节初始化*/
uchar uchCRCLo=0xFF; /*低CRC 字节初始化*/
uint uIndex; /*CRC循环中的索引*/
while (usDataLen--) /*遍历消息缓冲区*/
{
uIndex = uchCRCHi ^ *pushMsg++; /* 计算CRC */
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex];
uchCRCLo = auchCRCLo[uIndex] ;
}
return (uchCRCHi<< 8 | uchCRCLo);
}
/*****************************************************************************
向缓冲区中增加一个数据 预警温度和返回温度不一样
******************************************************************************/
void AddUsData(unsigned char sq0)
{
if(NRxBuff<N_XY_BAO)
{
RxBuff485[NRxBuff]=sq0;
NRxBuff++; //确定装到缓冲的位置
}
else
{
NRxBuff=0;
RxBuff485[NRxBuff]=sq0;
NRxBuff++;
}
}
void DoCommand(uchar ord)//
{
uchar i,j,addr;
switch(ord)
{
case 0x01: //读一次下位机温度 1组温度值命令
case 0x02: //读一次传感器温度 1个温度值
txBuffer2500[0] = cc_xy_bao - 1;
txBuffer2500[1] = RxBuff485[3];//测温点地址
txBuffer2500[2] = RxBuff485[2];//柜地址
txBuffer2500[3] = RxBuff485[4];//功能码
RFSendPacket(txBuffer2500, cc_xy_bao);
//temp_addr = RxBuff485[1]; //测温点地址
//串口返回数据到pc
break;
case 0x04:
ann_tem = RxBuff485[5]; //报警不用传到测温点,只做声光报警,RxBuff485[5]为数据
break;
case 0x05:
pre_tem = RxBuff485[5];//预警用传到测温点,当温度到达预警值后,每个采集间隔测温点都会回传温度
case 0x06: //采集间隔<=24
if( ord == 0x06)
coll_tim = RxBuff485[5];
txBuffer2500[0] = cc_xy_bao ;
txBuffer2500[1] = RxBuff485[2];//柜地址
txBuffer2500[2] = RxBuff485[3];//测温点地址
txBuffer2500[3] = RxBuff485[4];//功能码
txBuffer2500[4] = RxBuff485[5];//预警温度值或采集时间间隔
RFSendPacket(txBuffer2500, cc_xy_bao+1);
break;
case 0xf1://当测温点上来的是一组,24个数据
TxBuff485[1] = l_bao;//一组数据字节数
j = l_bao;
send_pc_data(j); //向pc返回数据
addr = rxBuffer2500[1];
if (addr ==1) //1号测温点24个数据
{
for(i = 0;i < 24;i++)
{
site1[i] = rxBuffer2500[i+3];
}
}
if (addr == 2) //2号测温点
{
for(i = 0;i < 24;i++)
{
site2[i] = rxBuffer2500[i+3];
}
}
if (addr == 3) //3号测温点
{
for(i = 0;i < 24;i++)
{
site3[i] = rxBuffer2500[i+3];
}
}
if (addr == 4) //4号测温点
{
for(i = 0;i < 24;i++)
{
site4[i] = rxBuffer2500[i+3];
}
}
if (addr == 5) //5号测温点
{
for(i = 0;i < 24;i++)
{
site5[i] = rxBuffer2500[i+3];
}
}
if (addr == 6) //6号测温点
{
for(i = 0;i < 24;i++)
{
site6[i] = rxBuffer2500[i+3];
}
}
break;
case 0xf3: //当测温点上来的是一个预警数据时
case 0xf2: //当测温点上来的是一个数据时,存储的方法要考虑一下
TxBuff485[1] = n_bao;//一个数据字节数
j = n_bao;
send_pc_data(j);
if (addr == 1) //1号测温点??
{
site1[7] = rxBuffer2500[3];
}
else if (addr == 2) //2号测温点
{
site2[7] = rxBuffer2500[3];
}
else if (addr == 3) //3号测温点
{
for(i = 0;i < 24;i++)
{
site3[i] = rxBuffer2500[i+3];
}
}
else if (addr == 4) //4号测温点
{
for(i = 0;i < 24;i++)
{
site4[i] = rxBuffer2500[i+3];
}
}
else if (addr == 5) //5号测温点
{
for(i = 0;i < 24;i++)
{
site5[i] = rxBuffer2500[i+3];
}
}
else if(addr == 6) //6号测温点
{
for(i = 0;i < 24;i++)
{
site6[i] = rxBuffer2500[i+3];
}
}
if (ord == 0xf3)
{
if(rxBuffer2500[3] >ann_tem)//判断预警温度值是否超过报警温度值
alarm(); /////////报警设置
for(i = 0;i < 400;i++) //200s
{
TI_CC_LED1_PxOUT ^= TI_CC_LED1; //开报警灯
delay_n_ms(500);
}
}
break;
case 0xf4:
send_pc_com(ord,ann_tem);//下位机报警温度设置,要发到pc和
send_cc2500(ord,temp_addr,ann_tem);//发到测温点
break;
case 0xf5:
send_pc_com(ord,pre_tem);//下位机预警温度设置只发到pc
break;
case 0xf6:
send_pc_com(ord,coll_tim);//下位机采集时间间隔设置要发到pc和测温点
send_cc2500(ord,temp_addr,coll_tim);//发到测温点
break;
case 0xf7:
send_pc_com(ord,ret_tim);//下位机返回时间间隔设置只发到pc
break;
default:
break;
}
/* for(i = 1;i < cc2500_bao;i++)
{
txBuffer2500[i] = RxBuff485[i+1]; //测温点地址txBuffer2500[i]为测温点发送缓冲,RxBuff485[]为pc的接收缓冲
}
RFSendPacket(txBuffer2500, cc2500_bao); //通过cc2500向测温点发送命令 */
}
/****************************************************************************
其他模块检测到数据包有错时通知本模块数据通讯有错
****************************************************************************/
void SetBaoErr()
{
bUartRxErr=1;
}
/*****************************************************************************
处理Uart数据包,主要用来回复pc
p0: 用来返回发送的数据的字节数
返回值:指向发送缓冲区的指针
******************************************************************************/
void DoUart()
{
//uchar i;
uchar Command; //接收的命令
//uint iq0; //判断接收数据
if(NRxBuff!=0)
{
if(RxBuff485[0]==HAND_OK&&bWaitRe==1&&bUartRxErr==0) //发送数据后得接收等待
//HAND_OK 0x0A 收到数据校验正确;
{ //bWaitRe=0;1:发送数据包后等待PC返回对数据包的校验结果;0:不等待
// bUartRxErr=0; 1:接收数据出错,如帧错、奇偶校验错等;0:没错
bWaitRe=0;
NRxBuff=0; //接收字节长度
//nTX1_Len=0;
SetAddMod(); //切换到只有地址字符使URXIFG置位的状态
//re_tx = 0; 重发次数
}
else if(RxBuff485[0]==HAND_ERR&&bWaitRe==1&&bUartRxErr==0&&re_tx!=0 ) //发送数据后得接收等待
{//HAND_ERR 0xA4 pc收到数据校验错误 重新发数据
//发送完数据包,等待PC校验结果,?应该有次数要求
//nTX1_Len= SendByte; //N_XY_BAO 5 通讯包的字节数
NRxBuff=0;
//re_tx--;//////
//重发
}
else if(RxBuff485[0]==HAND_BAO&&bWaitRe==0&&bUartRxErr==0)//HAND_BAO 0xA0 后跟数据的数据包头
{
if(NRxBuff==N_XY_BAO)
{//数据包接收完毕 crc算法
crc = 0xffff; //2008-9-21
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -