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

📄 main.c

📁 用单片机实现(载波监听/冲突检测)的功能
💻 C
📖 第 1 页 / 共 5 页
字号:
/***********************************************************************************
*宁波不良品程序操作说明: 上电--按ENT键启动程序--按1-8键选择不良品类型--按ENT确认不良品
*
*  功能键:  一、按9键+mode键    设置波特率     
*            二、按9键+CLR键     清零不良品数据
*            三、EXIT键          退出闪烁状态
             四。本机地址        ‘_'

************************************************************************************/

//#include "io430.h"
#include "io430x13x.h"
#include "in430.h"
#include <stdlib.h>




#define  Address        '_'                     //本机地址
//#define  _Project1                              // 工数= number
#define  _Project2                               工数= number*Target/ConvertCode
unsigned char const AddressIndex[] ={'1','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 char const LedCode[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X00};      //数码管显示代码



unsigned char const DisplayCode[11] = {0X00,0X01,0X02,0X03,0X04,0X05,0X06,0X07,0X08,0X09,0X0A};
unsigned char const KeyCode[16]     = {0X07,0X08,0X09,0X0F,0X04,0X05,0X06,0X0E,0X01,0X02,0X03,0X0D,0X00,0X0A,0X0B,0X0C};
unsigned char const SelectLed[8]    = {0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};
unsigned char const CodeTable[][8]  = {{Address,Address, '<','{','?',':','+','~'},                  //握手指令
                                       {Address,Address, '<','z','?',':','*','~'},                  // 读不良品数据指令
                                       {Address,Address, '<','b','?',':','"','~'},                  //不良品数据清零指令
                                       {Address,Address, '>','z'},                                  //写不良品数据指令
                                       {Address,Address, '0','~'},                                  //数据发送错误指令
                                       {'|','|','?',':','*','~'},                                   //主控端通信忙 
                                       {Address,Address, '<','{','?',':','+','~'},                  //下位机1请求通信
                                       {Address,Address, 'B','U','S','E','N','~'},                  //总线申请允许 
                                       {Address,Address, 'B','U','S','F','R','~'}                   //总线空闲,可以允许总线申请
                                      };                

unsigned char const AsciiTable[]     = {0X30,0X31,0X32,0X33,0X34,0X35,0X36,0X37,0X38,0X39};    //ASCII编码表

unsigned char       ProtoCodeCon[]  = {'<','{','?',':','*','~'};
unsigned char       ProtoCodeCon1[]  = {/*Address,*/ '=','{','?',':','+','~'};                    //单片机回送握手指令
unsigned char       ProtoCode[3]     = {Address, '=','z'};                                        //本机地址
unsigned char       CorrectCode[3]   = {/*Address,*/ '1','~'};                                    //接受到正确的指令字
unsigned char       ReTxdData[3]     = {/*Address,*/ '0','~'};                                    //要求重发指令

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       ReceviceBuff[51];                         //数据接收缓冲器  
unsigned char       TransmitBuff[51];                         //数据包打包格式数组缓冲器
unsigned char       TotalProTemp[9][4];                       //用于数据拆包临时变量

unsigned char       DisplayKeyCode[12];                       //段显示变量

unsigned int        TotalPro[10];                             //不良品数累计数
unsigned int        TimeSec1[25][2];                          //第一时间段数组
unsigned int        TimeSec2[9][2];                           //第二时间段数组]
unsigned char       TimeSectionIndex;                         //时间段索引
unsigned char       SecIndex;                                 //段索引
unsigned char       TimeIndex;                                //时间索引          
unsigned int        CovertVar;                                //段显码转换变量
unsigned char       Key;                                      //按键                 
unsigned char       KeyTemp;                                  //临时按键
unsigned int        Flag;                                     //标志变量
unsigned int        UartFlag;                                  //标志变量
signed   char       i;                                        //变量i 
unsigned char       count;                                    //记数
unsigned char       Index;                                    //波特率选择
unsigned char       UartCount=0;                              //波特率记数
unsigned char       UartCounter=0;                            //用于波特率记数1
unsigned char       CheckSum;                                 //校验和
unsigned char       TimerCount;                               //定时器记数
unsigned char       CommunicationErr;                         //通信错误变量

unsigned char       ClockCount;                               //定时时钟记数
unsigned char       Second;                                   // 秒
unsigned char       Min;                                      //分
unsigned char       Hour;                                     //小时
unsigned char       DisplayCodeTemp[4];                       //临时数据数组
unsigned long       DisplayFlg;                               //用于显示的标志
unsigned int        ConvertCode=0;
unsigned int        Plan;                                     //计划
unsigned int        Target;                                   //目标
unsigned int        Real;                                     //实绩
unsigned int        Number;                                   //工数
unsigned int        SelfAddress;                              //本机地址变量
signed   int        ScaleClock;                               //时钟设定标尺

unsigned int       temp;                                      //临时变量
unsigned char      temp1;                                     //临时变量
unsigned int       CounterForNumber;                          //工数记数器                            
unsigned char      Counter;                                   //时钟记数器
signed   char      SearchIndex;                               //查询索引

unsigned char      ConflictFlag;                              // 冲突标志



                              



#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  Key0      0X0C                        //数字键0
#define  Key1      0X08                        //数字键1
#define  Key2      0X09                        //数字键2
#define  Key3      0X0A                        //数字键3
#define  Key4      0X04                        //数字键4
#define  Key5      0X05                        //数字键5
#define  Key6      0X06                        //数字键6
#define  Key7      0X00                        //数字键7
#define  Key8      0X01                        //数字键8
#define  Key9      0X02                        //数字键9
#define  MODE      0X0D                        //功能键 MODE 用于波特率的设定
#define  EXIT      0X0E                        //功能键 EXIT 用于程序的退出
#define  ENT       0X0F                        //功能键 ENT  用于确认
#define  CLR       0X0B                        //功能键 CLR  用于清除
#define  DOWN      0X07                        //功能键 DOWN 用于点减
#define  UP        0X03                        //功能键 UP   用于增加


 

#define  ShrinkFlg      0X01                    //显示需要闪烁的标志
#define  EntFlg         0X02                    //不良品数量确认的标志
#define  ResetFlg       0X04                    //复位状态的标志
#define  KeyFlg         0X08                    //获取按键标志
#define  FunKey         0X10                    //功能按键
#define  BandSetFlg     0X20                    //波特率设定标志
#define  StartFlg       0X40                    //启动不良品检测标志
#define  BaudSet        0X80                    //指令错误
#define  LCJ            0X100                   //闪烁标志1
#define  ShrinkFlg_2    0X200                   //闪烁标志2
#define  FunClrFlg      0X400                   //启动功能键
#define  ReceiveFinish  0X800                   //接受指令字完成标志
#define  RUNFlg         0X1000                  //CLR键被按下的标志
#define  LowPowerFlg    0X2000                  //闪烁标志3
#define  ReceiveDataFlg 0X4000                  //接收数据标志
#define  LOWFlg         0X8000                  //低位转换标志

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

#define  BusyState      0X01                    //通信繁忙
#define  FreeState      0X02                    //通信空闲
#define  NolinkState    0X04                    //接收乱码
#define  WaitFlg        0X08                    //等待接收
#define  ContinueBusy   0X10                    //总线继续 繁忙
#define  ErrCodeFlg     0X20                    //总线上乱码

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


#define  ReSendErr      0X01                    //发送重发指令丢失
#define  SendDataErr    0X02                    //发送数据指令丢失
#define  ConfirmErr     0X03                    //发送正确接收指令丢失
#define  LinkHandErr    0X04                    //发送握手指令丢失


//新加入的宏定义
#define  MaxCount     9999                       //显示的最大值
#define  ShiftCode    0X80                       //串行转换码

//用于显示标志位
#define  DShrSetFlg          0X01                     //第二行闪烁标志
#define  DShrinkFlg          0x02                     //数据超范围闪烁标志
#define  DClockFlg           0X04                     //设置时钟标志
#define  PlanSetFlg          0X08                     //计划设定标志
#define  NumSetFlg           0X10                     //工数设定标志
#define  FirstFlg            0X20                     //闪烁处理标志
#define  ClockSetFlg         0X40                     //时钟设定标志
#define  ErrFlg              0X80                     //出错标志
#define  AddressSetFlg       0X100                    //本机地址设定标志
#define  StartShrinkFlg      0X200                    //启动闪烁标志
#define  TimeSection1SetFlg  0X400                    //第一班时间设定
#define  TimeSection2SetFlg  0X800                    //第二班时间设定
#define  TimeIndexFlg        0X1000                   //时间检索标志
#define  AutoCounterFlg      0X2000                   //自动时间检测标志
#define  ChangeWorkFlg       0X4000                   //换班标志
#define  CheckTimeFlg        0X8000                   //比较标志
#define  TimeFirstFlg        0X10000                  // 时间第一次标志

#define  P15DelayFlg         0X20000                  //实绩开关延时标志
#define  P16DelayFlg         0X40000                  //启动开关延时标志




#define  ShrinkFlg_1         0X00ff                     //无效标记
  


void Init(void);                                                   //初始化
void SysInit(void);                                                //系统初始化
void Delay10ms(int num);                                           //延时程序
void Clock();
void SetBaud(int baud);                                            //波特率设定
void Disper(void);                                                 //高位0消隐
void Disapper(void);
void DisplayLed(void);                                                //显示LED
void SendData(unsigned char * ,unsigned char );                    //发送数据
unsigned char  DataPack(void);                                     //数据打包处理
unsigned char  CovertToAsc(void);                                  //转换到ASCII
void FlashWrite(unsigned int TotalPro[]);                          //保存数据到闪存
void FlashRead(void);
unsigned char FlashBusy(void);                                                             
void FlashErase(unsigned int);                                  
void ConvertData(int data);
void ConfirmData();                                                 //确认数据的合法性



void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                                         //关闭看门狗
  FlashRead();                                                      //读地址为0X1080的数据
  for(i=0; i<12; i++)
  {
    DisplayKeyCode[i] =LedCode[0];                                  //初始显示为0   
  }
  for(i=0; i<10; i++)
    TotalPro[i] = 0;
  Init();
  
  while(1)
  {
    //TotalPro[1] = Plan;
    //TotalPro[2] = Target;
    //TotalPro[3] = Real;
    if((P6IN & P6IN_4) != P6IN_4)        //如果掉电进入掉电处理        
   {
     Flag |= LowPowerFlg;
     DisplayFlg &= ~FirstFlg; 
     if((DisplayFlg & FirstFlg) == FirstFlg)
     {
        TACCTL0 &= ~CCIE;                                   //不允许定时器A中断
        TBCTL   = TBSSEL_1 + MC_1;                          //定时器B 32768HZ 中断
        TBCCTL0 = CCIE;                                     //定时器B 中断允许
        TBCCR0  = 32768;                                    //定时时间1s
       LPM3;
     }
   }
   
  
    
    if((Flag & ReceiveDataFlg) == ReceiveDataFlg)                        //接受上位机数据后,解包的处理
    {
      _DINT();
      unsigned char Counter;
      unsigned char ii=0;
      signed   char j=0;
      unsigned int  k=0;
      unsigned int  digital=0;
      CheckSum=0;
      for(ii=0; ii<9; ii++)
      {
        for(j=0; j<4; j++)
        {
          TotalProTemp[ii][j]=0;                                          //临时数组初始化
        }
      }
      while(ReceviceBuff[ii++] != '~') ;                                  //获取接收数据指令的长度
      j = 0;
      for(Counter=4; Counter<(ii-4); Counter++)                           //截取数据字符
      {
        CheckSum += ReceviceBuff[Counter];
        if((ReceviceBuff[Counter] != ','))                                //获取ASCII数据
        {            
          {
            TotalProTemp[k][j++] = ReceviceBuff[Counter];
          }
        }
        else
        {

⌨️ 快捷键说明

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