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

📄 main1.c

📁 用单片机实现(载波监听/冲突检测)的功能
💻 C
字号:
/*
    无线通信协议服务器端  (SEVER)
    
*/

#include "in430.h"
#include "io430x13x.h"

//服务器端通信协议栈
#define  COMMUNICATION_OK      1             //握手信号连接正常
#define  COMMUNICATION_FAIL    2             //握手信号连接异常
#define  RESEND_DATA           3             //要求重新发送
#define  SEND_DATA             4             //要求发送
#define  RECEIVE_CONFLICT      5             //接收冲突
#define  LINK_REQ              6             //连接请求来自客户端

#define  LinkHandFlg    0X01                     //通信握手标志
#define  ResetDataFlg   0X02                     //读指令字
#define  WriteFlg       0X04                     //读指令字
#define  Format_1       0X08                     //指令结束格式 ?
#define  Format_2       0X10                     //指令结束格式 :
#define  Format_3       0X20                     //指令结束格式 ~
#define  CheckOk        0X40                     //指令校验正确标志
#define  SendDataFlg    0X80                     //发送数据指令

//波特率定义
#define  Baud1                 115200        //波特率12
#define  Baud2                 76800         //波特率2 
#define  Baud3                 57600         //波特率2
#define  Baud4                 38400         //波特率3
#define  Baud5                 19200         //波特率4
#define  Baud6                 9600          //波特率5
#define  Baud7                 4800          //波特率6

#define  BaudDefault           0X05          //设定默认波特率为 9600bps

//地址段一
#define  GroupNumber           20            //通信组号
#define  Address               0X5F          //服务器地址,终端接收均要处理

//常量定义     
unsigned char const ADDRESS[100] ={'A','B','C','D','E','F','G','H','I','J','K','L','M','N',
                                   'O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b',
                                   'c','d','e','f','g','h','i','j','k','l','m','n','o','p',
                                   'q','r','s','t','u','v','w','x','y','z'
                                  };

unsigned long const Baud[]           = {115200,76800,57600,38400,19200,9600,4800};
unsigned char const BaudRate[][3]    = {{0x22,0x00,0xED}, {0x34,0x00,0x40}, {0x45,0x00,0x4A}, {0x68,0x00,0x40},
                                       {0xD0,0x00,0x40}, {0xA0,0x01,0xC0}, {0x41,0x03,0x00}};

unsigned char const CodeTable[][8]   = {{Address,Address, '<','{','?',':','+','~'},                  //握手指令
                                        {Address,Address, '<','z','?',':','*','~'},                  // 读不良品数据指令
                                        {Address,Address, '<','b','?',':','"','~'},                  //不良品数据清零指令
                                        {Address,Address, '>','z'},                                  //写不良品数据指令
                                        {Address,Address, '0','~'}                                   //数据发送错误指令
                                       };
unsigned char const AsciiTable[]     = {0X30,0X31,0X32,0X33,0X34,0X35,0X36,0X37,0X38,0X39};          //ASCII编码表
//变量定义
unsigned char ClientID;                           //终端地址
unsigned char ReceiveBuff[100];                   //接收缓冲
unsigned char TransmitBuff[100];                  //发送缓冲
unsigned char TotalProTemp[9][4];                 //用于数据拆包临时变量
unsigned int  TotalPro[10];                       //数据存放数组
unsigned int  Flag;                               //标志


//函数的声明
void Init();                                     
void SysInit();
void Send(char* buff, unsigned char counter);    //发送函数
void DataPack();                                 //数据转换函数


int main( void )
{
  return 0;
}


void Init()
{
  //利用P2、P3口实现按键扫描
     _DINT();
     SysInit();                        //打开主震荡器
     P1IE  = 0X70;                     //允许P1.4中断
     P1SEL = 0X00;                 
     P1IES = 0X70;                     //下降沿触发
     P1IFG = 0X00;
     P1DIR = 0X80;                     //P1口设置为键盘输入口,可中断
     P1OUT |= P1OUT_7;                 //  八脚拉高。置位输出
     
     P3DIR = 0X1F;                     //输出端口驱动LED
     P3OUT = 0X1F;
     P3SEL = 0X30;                     //使用外部模块用于UART串行口通信
   
     P5DIR = 0XFF;                     //输出端口驱动LED 
     P5OUT = 0X00;
     
     P6DIR = 0X00;                     //监测p6.4电源端状态
     
                           
     TACTL   = TASSEL_1 + MC_1;                          //定时器A 32768HZ 中断
     TACCTL0 = CCIE;                                     //允许定时器A中断
     TACCR0  = 3276;                                     //定时时间为100ms  

     U0CTL  &= ~SWRST;                                   // Release USART
     ME1    |= UTXE0 + URXE0;                            //使能RX TX
     U0CTL   = 0; 
     U0CTL   = CHAR+PENA;                                //一位停止位\8位数据位\奇校验允许
     U0TCTL  = 0;
     U0TCTL  = SSEL1;                                    //主时钟选择MCLK, 4MHZ  
     U0RCTL  = URXEIE;                                   //发送错误允许中断 
     IE1    |= URXIE0 ;                                  //允许RX TX中断
     U0BR0   = BaudRate[BaudDefault][0];                 //默认波特率为 19200
     U0BR1   = BaudRate[BaudDefault][1];
     UMCTL0  = BaudRate[BaudDefault][2];
     
     _EINT();  
}

void SysInit()
{
   unsigned int iq0;
   BCSCTL1 &= ~XT2OFF;     				//打开XT2振荡器
   do
   {
      IFG1 &= ~OFIFG;				        // 清除振荡器失效标志
      for(iq0=0xFF; iq0>0; iq0--);    	                // 延时,等待XT2起振
   }
   while((IFG1 & OFIFG) != 0);			        // 判断XT2是否起振
   BCSCTL2 = SELM_2 + SELS;		                //选择MCLK为XT2
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -