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

📄 main.c

📁 基于MSP430单片机的菜单级无限通信程序
💻 C
📖 第 1 页 / 共 5 页
字号:
//----------------------------------------------------------------------------
//  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 + -