找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3214|回复: 1
打印 上一主题 下一主题
收起左侧

单片机条码扫描源码 已调试ok

[复制链接]
跳转到指定楼层
楼主
利用条码扫描,含源码,经过调试,可以使用

单片机源程序如下:
  1. //

  2. #include <STC12C2052AD.H>
  3. #include "string.h"
  4. #include "stdlib.h"
  5. //#include <no_hand.h>
  6. #define POLYNOMIAL_IDF 0x08408                  //crc16 多项式
  7. #define MAXUSERTIMERS 4
  8. #define MAXTIMERSTICK                        1000        //用户定时器最大时间长度(ms)
  9. #define UERTIMESTATUS_STOP                0                //用户定时器状态-停止
  10. #define UERTIMESTATUS_RUN                  1                //用户定时器状态-运行
  11. #define UERTIMESTATUS_RINING        2                //用户定时器状态-到时
  12. #define UERTIMESTATUS_ERROR                3                //用户定时器状态-到时

  13. #define Tid_SendTimer           1
  14. #define Tcn_SendTimer    2//20//       2

  15. #define Tid_pcrTimer           2
  16. #define Tcn_pcrTimer           20

  17. #define Tid_tiaomarTimer           3
  18. #define Tcn_tiaomarTimer           20

  19. #define Tid_TiaomaYingQing    0
  20. #define Tcn_TiaomaYingQing    500


  21. typedef struct _TiaoMaDataInfo
  22. {
  23.         unsigned char SerialNum; //接收条码的顺序号
  24.         unsigned char Sta;
  25.         unsigned char CheckData;//校验码
  26.         unsigned char TiaoMaBuf[10];       
  27. }TiaoMaDataInfo;

  28. typedef struct _TiaoMaBuf
  29. {
  30.         unsigned char Sta;//1:表示有 0:表示不存在
  31.         unsigned char TiaoMaBuf[6];       
  32. }TiaoMaBuf;

  33. typedef struct _ComuStaInfo
  34. {
  35.         unsigned char Sta;
  36.         unsigned char Cmd;
  37.         unsigned char Len;
  38.         unsigned char Num;
  39.         unsigned char Buf[8];
  40.         unsigned char Suc;
  41.         unsigned int  CRC;
  42. }ComuStaInfo;

  43. //定时器结构定义
  44. typedef struct _SUserTimer{
  45.         volatile int Deadline;
  46.         volatile int ReLoadTickNum;
  47. } SUserTimer;

  48. TiaoMaDataInfo gTiaoMaData;
  49. TiaoMaBuf TiaoMaBufData;
  50. ComuStaInfo idata ComuStaData;
  51. SUserTimer  UserTimer[MAXUSERTIMERS];

  52. sbit         pc_txd =P3^2;                  //模拟串口接收
  53. sbit         pc_rxd =P3^3;                  //模拟串口发送
  54. bit         byte_waiting_flag;        //接收字节时的等待时间,在未收到校验之前
  55. bit         Sendtopcflag;                                //模拟串口发送数据标志
  56. bit                Sendtopcendflag;                        //模拟串口发送数据字节结束标志
  57. bit                Revfrompcendflag;                        //模拟串口接收数据字节结束标志
  58. bit                Revfrompcflag;                                //模拟串口接收数据标志

  59. bit     YQflag =0;
  60. bit DelayScanFlag =0;

  61. unsigned char   Revfrompcdata,Sendtopcdata;
  62. unsigned char   T0timeouttimesR,T0timeouttimesT;
  63. unsigned char idata wait_receive_num;
  64. unsigned char idata SendToPc[12];
  65. unsigned int TimeTick =0;
  66. unsigned char Send_Flag =0;
  67. unsigned char idata Send_Len =0;
  68. //unsigned char DelayScanFlag =0;
  69. unsigned long idata DelayScanTime =0;
  70. void UART0_SendByte(unsigned char dat);

  71. //*--------------------------------------------------------------------------------------
  72. //* Function Name       : GetTickCount()
  73. //* Object              : Return the number of systimer tick
  74. //* Input Parameters    :
  75. //* Output Parameters   :
  76. //*--------------------------------------------------------------------------------------
  77. unsigned long GetTickCount(void)
  78. {
  79.         return TimeTick;
  80. }
  81. //*--------------------------------------------------------------------------------------
  82. //* Function Name       : ResetTickCount()
  83. //* Object              : systimer tick = 0
  84. //* Input Parameters    :
  85. //* Output Parameters   :
  86. //*--------------------------------------------------------------------------------------
  87. void ResetTickCount(void)
  88. {
  89.         int TimerID;
  90.         TimeTick = 0;
  91.         for(TimerID=0;TimerID<MAXUSERTIMERS;TimerID++)
  92.         {
  93.                 UserTimer[TimerID].Deadline = 0;
  94.         }
  95. }
  96. //*--------------------------------------------------------------------------------------
  97. //* Function Name       : CheckResetTickCount()
  98. //* Object              : systimer tick = 0
  99. //* Input Parameters    :
  100. //* Output Parameters   :
  101. //*--------------------------------------------------------------------------------------
  102. void CheckResetTickCount(void)
  103. {
  104.         int TimerID;
  105.         if(1)
  106.         {
  107.                 for(TimerID=0;TimerID<MAXUSERTIMERS;TimerID++)
  108.                 {
  109.                         if(UserTimer[TimerID].Deadline != 0)
  110.                         {
  111.                                 UserTimer[TimerID].Deadline -= 0x10000;
  112.                         }
  113.                 }
  114. //stop the timer0 int
  115.                 TimeTick -= 0x10000;
  116. //start the timer0 int
  117.         }
  118. }
  119. //*--------------------------------------------------------------------------------------
  120. //* Function Name       : BeginTimer()
  121. //* Object              : Begin a user timer with tick
  122. //* Input Parameters    :
  123. //* Output Parameters   :
  124. //*--------------------------------------------------------------------------------------
  125. unsigned int StartTimer(unsigned int TimerID, unsigned int TimerTickCount)//1 ticket =5ms
  126. {
  127.         if( TimerID > MAXUSERTIMERS)        return 0;
  128.         if(TimerTickCount == 0)
  129.                 TimerTickCount = UserTimer[TimerID].ReLoadTickNum;
  130.         if(TimerTickCount > MAXTIMERSTICK)
  131.                 TimerTickCount = MAXTIMERSTICK;       
  132.         UserTimer[TimerID].ReLoadTickNum = TimerTickCount;
  133.         UserTimer[TimerID].Deadline = TimeTick+TimerTickCount;
  134.         return TimerID;
  135. }

  136. //*--------------------------------------------------------------------------------------
  137. //* Function Name       : HaltTimer()
  138. //* Object              : Stop a user timer with tick
  139. //* Input Parameters    :
  140. //* Output Parameters   :
  141. //*--------------------------------------------------------------------------------------
  142. unsigned int HaltTimer(unsigned int TimerID)
  143. {
  144.         if( TimerID > MAXUSERTIMERS)        return UERTIMESTATUS_ERROR;
  145.         UserTimer[TimerID].Deadline = 0;
  146.         return TimerID;
  147. }

  148. //*--------------------------------------------------------------------------------------
  149. //* Function Name       : GetTimerStatus()
  150. //* Object              : Begin a user timer with tick
  151. //* Input Parameters    :
  152. //* Output Parameters   :
  153. //*--------------------------------------------------------------------------------------
  154. unsigned int GetTimerStatus( unsigned int TimerID,const int AutoStop)                //反绕问题
  155. {
  156.         unsigned int retcode;
  157.        
  158.         if(TimerID > MAXUSERTIMERS)
  159.                 retcode = UERTIMESTATUS_ERROR;
  160.        
  161.         else if(UserTimer[TimerID].Deadline == 0)
  162.                 retcode = UERTIMESTATUS_STOP;               
  163.         else if(UserTimer[TimerID].Deadline > TimeTick)
  164.         {
  165.                 if((UserTimer[TimerID].Deadline - TimeTick) > TimeTick+UserTimer[TimerID].ReLoadTickNum)
  166.                         StartTimer(TimerID,0);
  167.                 else
  168.                         retcode = UERTIMESTATUS_RUN;
  169.         }
  170.         else
  171.         {
  172.                 if(AutoStop)
  173.                         UserTimer[TimerID].Deadline = 0;
  174.                 else
  175.                         UserTimer[TimerID].Deadline = TimeTick+UserTimer[TimerID].ReLoadTickNum;
  176.                        
  177.                 retcode = UERTIMESTATUS_RINING;
  178.         }
  179.         return retcode;
  180. }


  181. //#include <reg52.h>/**************THIS IS A 模拟串口接收中 定时器0初始化**************/
  182. void board_init(void)
  183. {
  184.         //  unsigned char test;
  185.                 SCON =0x050;
  186.                 TMOD =0x22;
  187.                 TH1 =0xfa;                    //9600baud,11.0592m
  188.                 TL1 =0xfa;
  189.                 PCON =0x80;
  190.                 TCON =0x01;
  191.                 //////////
  192.                 WDT_CONTR =0x3e;
  193.                 CMOD =80;   //在空闲模式下停止PCA计时器工作
  194.                 CCON =0;
  195.             CCAPM0 =0x49;        //CCAPM1用作软件定时器。当CCF1和ECCF1都置位时中断,CCF1和ECCF1必须由软件清零
  196.             CL =0;
  197.             CH =0;
  198.             CCAP0L =0x00;
  199.             CCAP0H =0x12;
  200.            // CCAP0L =0xb8;//200us
  201.            // CCAP0H =0x00;
  202.             EPCA_LVD =1;
  203.             CR =1;
  204.           ////////////
  205.         //        AUXR &=0x3f;
  206.                 //TH0 =0x7f;// 给定时器0赋初值255-11059200/12/4800+1=40
  207.                 //TL0 =0x7f;
  208.                 EA =1;
  209.                 ES =1;
  210.         //        ES =1;
  211.                 TR1 =1;
  212.                 EX0 =1;
  213.                    //EX1 =1;
  214.                    ET0  =1;
  215.                    IP =0;
  216.                    PT0   =1;    //TEST ,T0 IS PRIVATY
  217.                    IT0  =1; //the edge interrupt
  218.                 pc_txd =1;
  219.                    pc_rxd =1;
  220.         //TX_EN =1;
  221. }
  222. /////////
  223. void DataInit(void)
  224. {
  225.         memset(&gTiaoMaData,0,sizeof(TiaoMaDataInfo));
  226.         memset(&TiaoMaBufData,0,sizeof(TiaoMaBuf));
  227.         memset(&ComuStaData,0,sizeof(ComuStaInfo));
  228.         Revfrompcendflag =0;
  229.         Sendtopcflag =0;
  230. }
  231. void externint0 (void) interrupt 0
  232. {
  233.                   TR0 =0;
  234.                   TH0 =0x0A0;
  235.                 TL0 =0x0A0;
  236.                  T0timeouttimesR =8;
  237.                 Revfrompcflag =1;
  238.                 ET0=1;
  239.                 TR0 =1;
  240.                 EX0 =0;
  241.                 //wait_receive_num =0;
  242.                 byte_waiting_flag =0;
  243. }
  244. /************************************************************
  245. timer0 interrupt subprogram
  246. *************************************************************/
  247. void t0int(void) interrupt 1
  248. {
  249.         if( Sendtopcflag==1)
  250.            {
  251.                            if( Sendtopcdata & 0x01)
  252.                               pc_rxd =1;                                        //T1=P1.6
  253.                         else
  254.                       pc_rxd =0;
  255.                     Sendtopcdata =Sendtopcdata >> 1;        //右移
  256.                     Sendtopcdata =Sendtopcdata |0x80;
  257.                         T0timeouttimesT--;
  258.                         if( T0timeouttimesT==0)
  259.                          {
  260.                                    Sendtopcflag =0;
  261.                                    pc_rxd =1;                                //停止位
  262.                                    Sendtopcendflag =1;
  263.                                   // TR0 =0;
  264.                                    EX0 =1;
  265.                          }
  266.                    }

  267.          if ( Revfrompcflag==1)
  268.            { //test =~test;     //test
  269.                      Revfrompcdata = Revfrompcdata >> 1;
  270.                      if (pc_txd ==1)                                        //PC_txd=P3^2
  271.                        Revfrompcdata =Revfrompcdata | 0x80;
  272.                      T0timeouttimesR--;
  273.                      if(T0timeouttimesR==0)
  274.                       {
  275.                                                    Revfrompcflag =0;
  276.                                                   Revfrompcendflag =1;
  277.                                                    IE0 =0;
  278.                                                   EX0 =1;
  279.                                                   byte_waiting_flag =1;
  280.                                                    TR0 =0;
  281.                                                    TH0 =0;
  282.                                                    TL0 =0;
  283.                                                    TR0 =1;
  284.                           }
  285.            }
  286. }
  287. ///////////////
  288. /************************************************************
  289. PCA interrupt subprogram
  290. *************************************************************/
  291. void pcaint(void) interrupt 6
  292. {
  293.          //int i;
  294.          //static int i;
  295.          CCF0 =0;
  296.         // i =(CCAP0H*256)+CCAP0L;
  297.          //i +=0xb8;
  298.          //CCAP0H =(unsigned char )(i>>8);
  299.          //CCAP0L =(unsigned char )i;

  300.          //  CL =0;
  301.          //  CH =0;
  302.          CCAP0L +=0x00;
  303.          CCAP0H +=0x12;
  304.           //         UART0_SendByte(CCAP0H);
  305.           //UART0_SendByte(CCAP0L);
  306.           //CCAP0L +=0xb8;
  307.          // CCAP0H +=0x00;
  308.          TimeTick++;
  309. }
  310. /*********************sending a byte of  simulate serial port**********/

  311. void sendbyte(unsigned char simdata)
  312. {
  313.            // txd_sel =1;
  314.                   Sendtopcdata =simdata;
  315.        
  316.                 EX0=0;                                                //模拟串口接收
  317.                 TR0=0;                                                //定时器0停止计数
  318.                 TH0=0x0A0;                                        //给定时器0赋初值255-11.0592/12/9600+1=A0
  319.                  TL0=0x0A0;
  320.                 TR0=1;
  321.                 ET0=1;                                                //定时器0开始计数
  322.                 pc_rxd=0;                                                //串口传输数据的开始BIT=0
  323.                  T0timeouttimesT=0x0a;                //    //1 start bit ;8 bit data ,1 stop bit
  324.                 Sendtopcflag=1;                        //在定时其中断中,根据该标志
  325.                 Sendtopcendflag=0;
  326.                 while(!Sendtopcendflag);       //waiting the simulate serial port sending end
  327.                 Sendtopcendflag=0;
  328.         //                                                        //允许模拟串口接收
  329. }

  330. void emulator_send_string(unsigned char *array,unsigned char array_length)
  331. {
  332.     unsigned int i;
  333.     for (i=0;i<array_length;i++)
  334.     {
  335.              sendbyte(array[i]);
  336.     }
  337. }

  338. /*
  339. *********************************************************************************************************
  340. ** 函数名称 :UART0_SendByte()
  341. ** 函数功能 :向串口0发送1字节数据
  342. ** 入口参数 :dat        要发送的数据
  343. ** 出口参数 :无
  344. *********************************************************************************************************
  345. */
  346. void UART0_SendByte(unsigned char dat)
  347. {
  348.         //TB8 =Even_Checkout(dat);
  349.         SBUF =dat;
  350.         //if(IcWayDefineFlag ==1)
  351.         //        TB8 =~TB8;
  352.         while(!TI);
  353.         TI =0;
  354. }

  355. /*
  356. *********************************************************************************************************
  357. ** 函数名称 :UART0_SendString()
  358. ** 函数功能 :向串口0发送一个字符串
  359. ** 入口参数 :aa 一个字符串的首地址,length,字符串的长度
  360. ** 出口参数 :无
  361. *********************************************************************************************************
  362. */
  363. void UART0_SendString(char *aa,unsigned int length)
  364. {
  365.         unsigned int i;
  366.         for (i=0;i<length;i++)
  367.         {
  368.                  UART0_SendByte(aa[i]);
  369.         }
  370. }

  371. void TiaoMaRev(void)
  372. ////////
  373. {
  374.         unsigned char temp;
  375.         temp =0;
  376.         if (Revfrompcendflag == 1)
  377.                 {
  378.                         Revfrompcendflag =0;
  379.                         temp =Revfrompcdata;
  380.                         //UART0_SendByte(temp);
  381.                         switch(gTiaoMaData.Sta)
  382.                                 {
  383.                                         case 0://开始位
  384.                                                 if(temp ==0x36)
  385.                                                         {
  386.                                                                 gTiaoMaData.Sta++;                       
  387.                                                                 //BeginTimer(uint8 TimerId,uint32 ValueCount)
  388.                                                                 //StartTimer(TID_TIAOMAREV1,TIN_TIAOMAREV1);
  389.                                                                 StartTimer(Tid_tiaomarTimer,Tcn_tiaomarTimer);//定义条码接收时间,超时状态归零
  390.                                                         }
  391.                                                 else
  392.                                                         {
  393.                                                                 gTiaoMaData.SerialNum =0;
  394.                                                         }
  395.                                                 break;
  396.                                         case 1://条码接收
  397.                                                         gTiaoMaData.TiaoMaBuf[gTiaoMaData.SerialNum]=(temp-0x30);
  398.                                                         gTiaoMaData.SerialNum++;
  399.                                                         if(gTiaoMaData.SerialNum==6)
  400.                                                                 {
  401.                                                                         gTiaoMaData.Sta++;
  402.                                                                         gTiaoMaData.SerialNum =0;
  403.                                                                 }
  404.                                                         break;
  405.                                         case 2://条码校验位
  406.                                                         gTiaoMaData.CheckData =(temp-0x30);
  407.                                                         gTiaoMaData.Sta++;
  408.                                         case 3://
  409.                                                         gTiaoMaData.Sta++;
  410.                                         case 4:
  411.                                                         gTiaoMaData.Sta++;
  412.                                                         HaltTimer(Tcn_tiaomarTimer);
  413.                                 }
  414.                 }
  415.                
  416. }
  417. //////////条码校验算法
  418. unsigned char TiaoMaCheck(void)
  419. {
  420.         unsigned char i=0;
  421.         unsigned char CheckDat1;
  422.         unsigned char CheckDat2;       
  423.         CheckDat1 =gTiaoMaData.TiaoMaBuf[5]+gTiaoMaData.TiaoMaBuf[3]+gTiaoMaData.TiaoMaBuf[1]+6;
  424.         CheckDat1 =CheckDat1*3;
  425.         CheckDat2 =gTiaoMaData.TiaoMaBuf[4]+gTiaoMaData.TiaoMaBuf[2]+gTiaoMaData.TiaoMaBuf[0];
  426.         CheckDat2 =CheckDat2+CheckDat1;
  427.         while(i*10 <CheckDat2)
  428.                 {
  429.                         i++;
  430.                 }
  431.         CheckDat1 =i*10-CheckDat2;
  432.         if(gTiaoMaData.CheckData ==CheckDat1)
  433.                 return 0;                //校验成功
  434.         else
  435.                 return 1;                //校验失败
  436. }
  437. //////////////
  438. void tiaomadis(void)
  439. {
  440.                 if(gTiaoMaData.Sta ==5)//表示收到了条码校验位
  441.                 {
  442.                         gTiaoMaData.Sta =0;
  443.                         //UART0_SendByte(0x99);
  444.                         //UART0_SendString(TiaoMaBufData.TiaoMaBuf,6);
  445.                         HaltTimer(Tid_tiaomarTimer);//条码接收完毕
  446.                         if(TiaoMaCheck() ==0)
  447.                                 {       
  448.                                        
  449.                                         //if(YQflag ==1)
  450.                                         //if(GetTimerStatus(Tid_TiaomaYingQing,1)!=UERTIMESTATUS_RUN)
  451.                                         if(DelayScanFlag ==0)
  452.                                                 {
  453.                                                         //UART0_SendByte(0x66);
  454.                                                         TiaoMaBufData.Sta =1;
  455.                                                         YQflag =0;
  456.                                                         DelayScanFlag =1;
  457.                                         //拷贝条码数据
  458.                                                         memcpy(TiaoMaBufData.TiaoMaBuf,gTiaoMaData.TiaoMaBuf,10);
  459.                                                         //StartTimer(Tid_TiaomaYingQing,Tcn_TiaomaYingQing);
  460.                                                 }
  461.                                         //UART0_SendString(TiaoMaBufData.TiaoMaBuf,6);
  462.                                 }
  463.                 }
  464. }
  465. /*********************************************************************************************************
  466. ** 函数名称 :GetCRC16
  467. ** 函数功能 :得到CRC16值
  468. ** 入口参数 : bufData:要进行CRC校验的串,sizeData:串的长度
  469. ** 出口参数 :无
  470. *********************************************************************************************************
  471. */
  472. unsigned int GetCRC16(unsigned char *bufData, unsigned int sizeData)
  473. {
  474.         unsigned int CRC_buf, i;
  475.         unsigned char j;
  476.         CRC_buf = 0;
  477.         for(i=0; i < sizeData; i++)
  478.         {
  479.                 CRC_buf ^= bufData[i];
  480.                 for(j=0; j < 8; j++)
  481.                 {
  482.                         if(CRC_buf & 0x0001) {CRC_buf >>= 1; CRC_buf ^= POLYNOMIAL_IDF;}
  483.                         else CRC_buf >>= 1;
  484.                 }
  485.         }
  486.         return CRC_buf;
  487. }

  488. /////////////////////////////
  489. //条码协议
  490. //为半双工,条码板被动,主板主动查询
  491. //协议格式为: SYNC(1 byte)  ADR(1 byte)  LNG(1 byte)  CMD(1 byte) DATA(0 to 250 bytes)  CRC2( bytes)
  492. ////条码回应时ADR: 0X10,空闲data:0X83H  
  493. //有条码dat:0X84H +6 HEX
  494. /////////////////////////////
  495. /////////////////////////////////////////////////////
  496. void serial (void) interrupt 4
  497. {
  498.         unsigned char serial_buf;
  499. //        unsigned char i;
  500.         if(RI ==1)
  501.         {
  502.                  RI =0;       
  503.                  
  504.                   serial_buf =SBUF;
  505.                 // UART0_SendByte(serial_buf);
  506.                 //sendbyte(serial_buf);
  507.                  switch(ComuStaData.Sta)
  508.                          {
  509.                                  case 0:
  510.                                         {
  511.                                                 if(serial_buf ==0x02)
  512.                                                         {                                                               
  513.                                                                 ComuStaData.Buf[ComuStaData.Sta]=serial_buf;
  514.                                                                 ComuStaData.Sta++;
  515.                                                                 ComuStaData.Num =0;
  516.                                                                 StartTimer(Tid_pcrTimer,Tcn_pcrTimer);
  517.                                                         }
  518.                                                 else
  519.                                                         ComuStaData.Sta =0;
  520.                                          }
  521.                                         break;
  522.                                 case 1://adr
  523.                                         {
  524.                                                 ComuStaData.Buf[ComuStaData.Sta]=serial_buf;
  525.                                                 ComuStaData.Sta++;
  526.                                         }
  527.                                         break;
  528.                                 case 2://lng
  529.                                         {
  530.                                                 //if(serial_buf ==6)
  531.                                                         {
  532.                                                                 ComuStaData.Buf[ComuStaData.Sta]=serial_buf;
  533.                                                                 ComuStaData.Sta++;
  534.                                                                 ComuStaData.Len =serial_buf;
  535.                                                                
  536.                                                         }
  537.                                                 //UART0_SendByte(0xcc);
  538.                                                 //else
  539.                                                 //        ComuStaData.Sta =0;
  540.                                                 if(ComuStaData.Len>7)
  541.                                                         ComuStaData.Sta =0;
  542.                                         }
  543.                                         break;
  544.                                         /*
  545.                                 case 3://cmd
  546.                                         {                       
  547.                                                 ComuStaData.Buf[ComuStaData.Sta]=serial_buf;
  548.                                                 ComuStaData.Sta++;
  549.                                                 ComuStaData.Cmd =serial_buf;
  550.                                         }
  551.                                         break;
  552.                                         */
  553.                                 case 3:
  554.                                         {
  555.                                                         ComuStaData.Buf[ComuStaData.Num+3]=serial_buf;
  556.                                                         ComuStaData.Num++;
  557.                                                         if(ComuStaData.Num ==(ComuStaData.Len-3))
  558.                                                                 {
  559.                                                                         ComuStaData.Suc =1;
  560.                                                                         //UART0_SendByte(0xaa);
  561.                                                                         ComuStaData.CRC=((ComuStaData.Buf[ComuStaData.Len-1]<<8)+ComuStaData.Buf[ComuStaData.Len-2]);
  562.                                                                         ComuStaData.Sta =0;
  563.                                                                         HaltTimer(Tid_pcrTimer);
  564.                                                                 }
  565.                                         }
  566.                                 break;
  567.                          }
  568.         }
  569. }
  570. ///////
  571. void pcdis(void)
  572. {
  573.         int crc;
  574.         unsigned char i;
  575.         if(ComuStaData.Suc ==1)
  576.                 {
  577.                         ComuStaData.Suc =0;
  578.                         if(ComuStaData.CRC ==GetCRC16(ComuStaData.Buf,(ComuStaData.Len-2)))
  579.                                 {
  580.                                         //if(ComuStaData.Buf[1] ==0x10)//ADR为条码
  581.                                                 {
  582.                                                         if(ComuStaData.Buf[3]==0x33)//polling
  583.                                                                 {
  584.                                                                         if(TiaoMaBufData.Sta ==0)//空闲位,表示没有扫描值
  585.                                                                                 {
  586.                                                                                         SendToPc[0] =0x02;//head
  587.                                                                                         SendToPc[1] =0x10;//adr
  588.                                                                                         SendToPc[2] =0x6;//len
  589.                                                                                         SendToPc[3] =0x83;//dat
  590.                                                                                         crc =GetCRC16(SendToPc,4);
  591.                                                                                         SendToPc[4] =(unsigned char)crc;
  592.                                                                                         SendToPc[5] =(unsigned char)(crc>>8);
  593.                                                                                         Send_Flag =1;
  594.                                                                                         Send_Len =6;
  595.                                                                                         //UART0_SendString(SendToPc,6);
  596.                                                                                         StartTimer(Tid_SendTimer,Tcn_SendTimer);
  597.                                                                                 }
  598.                                                                         else if(TiaoMaBufData.Sta ==1)//为1,表示有扫描值
  599.                                                                                 {
  600.                                                                                         SendToPc[0] =0x02;//head
  601.                                                                                         SendToPc[1] =0x10;//adr
  602.                                                                                         SendToPc[2] =0x0c;//len
  603.                                                                                         SendToPc[3] =0x84;//dat
  604.                                                                                         for(i =0;i<6;i++)
  605.                                                                                                 SendToPc[i+4]=TiaoMaBufData.TiaoMaBuf[i];
  606.                                                                                         crc =GetCRC16(SendToPc,10);
  607.                                                                                         SendToPc[10] =(unsigned char)crc;
  608.                                                                                         SendToPc[11] =(unsigned char)(crc>>8);
  609.                                                                                         Send_Flag =1;
  610.                                                                                         Send_Len =12;
  611.                                                                                         StartTimer(Tid_SendTimer,Tcn_SendTimer);
  612.                                                                                         //UART0_SendString(SendToPc,12);
  613.                                                                                 }
  614.                                                                                
  615.                                                                 }
  616. ……………………

  617. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

全部资料下载地址:
code_saomiaoban.zip (111.36 KB, 下载次数: 34)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:138443 发表于 2017-11-20 20:36 | 只看该作者
真的可以吗?谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表