标题: STM32仿三菱PLC开源代码+电路图 [打印本页]

作者: cshmotor    时间: 2019-4-18 11:49
标题: STM32仿三菱PLC开源代码+电路图
三菱PLC源码,提供给大家参考。


电路原理图如下:


单片机源程序如下:
  1. /*
  2. UART 后台处理程序
  3. */

  4. /*************Both Uart Used Variable Define *********************/
  5. unsigned char crc1,crc2;
  6. unsigned char crc3,crc4;

  7. /*************** Uart 0 Used Variable Define *********************/
  8. unsigned char uart0_rxbuf[127];                        //接受数据包缓冲
  9. unsigned char uart0_txbuf[127];                        //发送数据包缓冲
  10. unsigned char uart0_rxptr;                                //接受数据包当前指针
  11. unsigned char uart0_txptr;                                //发送数据包当前指针
  12. unsigned char uart0_txall;                          //发送数据包总长度
  13. unsigned char uart0_time;                                //接受数据包分割计时参数


  14. /*************** Uart 1 Used Variable Define *********************/
  15. unsigned char uart1_rxbuf[127];                        //接受数据包缓冲
  16. unsigned char uart1_txbuf[127];                        //发送数据包缓冲
  17. unsigned char uart1_rxptr;                                //接受数据包当前指针
  18. unsigned char uart1_txptr;                                //发送数据包当前指针
  19. unsigned char uart1_txall;                          //发送数据包总长度
  20. unsigned char uart1_time;                                //接受数据包分割计时参数


  21. /*************  Genernal Uart Function Predefine ***************/
  22. extern void uart_crc(unsigned char* , unsigned char);

  23. /***********  Two Uart Disposal Function Predefine **************/
  24. extern void uart0_dispose(void);
  25. extern void uart1_dispose(void);

  26. /************  Two Uart Setup Function Predefine ***************/
  27. extern void UART0_setup(void);
  28. extern void UART1_setup(void);


  29. /*******************************************************************************
  30. * Function Name  : UART1_Setup
  31. * Description    : Configures the uart1
  32. * Input          : None
  33. * Output         : None
  34. * Return         : None
  35. *******************************************************************************/
  36. void UART1_setup(void)
  37. {
  38.   USART_InitTypeDef USART_InitStructure;

  39.   USART_InitStructure.USART_BaudRate = 57600;
  40.   USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  41.   USART_InitStructure.USART_StopBits = USART_StopBits_1;
  42.   USART_InitStructure.USART_Parity = USART_Parity_No ;
  43.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  44.   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  45.   /* Configure the USART1*/
  46.   USART_Init(USART1, &USART_InitStructure);

  47.   /* Enable USART1 Receive and Transmit interrupts */
  48.   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  49.   USART_ITConfig(USART1, USART_IT_TC, ENABLE);

  50.   /* Enable the USART1 */
  51.   USART_Cmd(USART1, ENABLE);

  52.   USART1->CR1 = 0x0000206C;
  53.   
  54. // 初始化 串口输入输出缓冲
  55.   uart0_time = 0;
  56.   uart0_txall = 0;
  57.   uart0_txptr = 0;
  58.   uart0_rxptr = 0;
  59.   USART1->CR1 |= 0x00002000;
  60. }


  61. /****************************************************************************  F!
  62. * 名称:uart0_setup()
  63. * 功能:串口UART1 初始化以及变更格式程序
  64. * 入口参数:无
  65. * 出口参数:无
  66. ****************************************************************************/
  67. /*第二通讯口 通讯参数更新函数*/
  68. void UART0_setup(void)         
  69. {
  70. USART_InitTypeDef USART_InitStructure;

  71. switch(program[0x1C])
  72.         {

  73. //=============无校验通讯设置区域========================
  74.         case(0x01):
  75.         /* 设置UART串口波特率  4800bps */
  76.         USART_InitStructure.USART_BaudRate = 4800;
  77.           USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  78.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  79.         USART_InitStructure.USART_Parity = USART_Parity_No ;
  80.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  81.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  82.         break;

  83.         case(0x02):
  84.         /* 设置UART串口波特率  9600bps */
  85.         USART_InitStructure.USART_BaudRate = 9600;
  86.           USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  87.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  88.         USART_InitStructure.USART_Parity = USART_Parity_No ;
  89.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  90.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  91.         break;

  92.         case(0x03):
  93.         /* 设置UART串口波特率 14400bps */
  94.         USART_InitStructure.USART_BaudRate = 14400;
  95.           USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  96.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  97.         USART_InitStructure.USART_Parity = USART_Parity_No ;
  98.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  99.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  100.         break;

  101.         case(0x04):
  102.         /* 设置UART串口波特率  19200bps*/
  103.         USART_InitStructure.USART_BaudRate = 19200;
  104.           USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  105.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  106.         USART_InitStructure.USART_Parity = USART_Parity_No ;
  107.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  108.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  109.         break;

  110.         case(0x05):
  111.         /* 设置UART串口波特率  38400bps */
  112.         USART_InitStructure.USART_BaudRate = 38400;
  113.           USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  114.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  115.         USART_InitStructure.USART_Parity = USART_Parity_No ;
  116.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  117.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  118.         break;

  119.         case(0x06):
  120.         /* 设置UART串口波特率  57600bps */
  121.         USART_InitStructure.USART_BaudRate = 57600;
  122.           USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  123.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  124.         USART_InitStructure.USART_Parity = USART_Parity_No ;
  125.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  126.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  127.         break;

  128. //=============奇校验通讯设置区域========================
  129.         case(0x11):
  130.         /* 设置UART串口波特率 4800bps */
  131.         USART_InitStructure.USART_BaudRate = 4800;
  132.           USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  133.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  134.         USART_InitStructure.USART_Parity = USART_Parity_Odd;
  135.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  136.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  137.         break;

  138.         case(0x12):
  139.         /* 设置UART串口波特率 9600bps */
  140.         USART_InitStructure.USART_BaudRate = 9600;
  141.           USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  142.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  143.         USART_InitStructure.USART_Parity = USART_Parity_Odd;
  144.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  145.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  146.         break;

  147.         case(0x13):
  148.         /* 设置UART串口波特率 14400bps */
  149.         USART_InitStructure.USART_BaudRate = 14400;
  150.           USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  151.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  152.         USART_InitStructure.USART_Parity = USART_Parity_Odd;
  153.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  154.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  155.         break;

  156.         case(0x14):
  157.         /* 设置UART串口波特率  19200bps*/
  158.         USART_InitStructure.USART_BaudRate = 19200;
  159.           USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  160.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  161.         USART_InitStructure.USART_Parity = USART_Parity_Odd;
  162.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  163.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  164.         break;

  165.         case(0x15):
  166.         /* 设置UART串口波特率 38400bps */
  167.         USART_InitStructure.USART_BaudRate = 38400;
  168.           USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  169.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  170.         USART_InitStructure.USART_Parity = USART_Parity_Odd;
  171.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  172.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  173.          break;

  174.         case(0x16):
  175.         /* 设置UART串口波特率   57600bps */
  176.         USART_InitStructure.USART_BaudRate = 57600;
  177.           USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  178.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  179.         USART_InitStructure.USART_Parity = USART_Parity_Odd;
  180.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  181.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  182.          break;


  183. //=============偶校验通讯设置区域========================
  184.         case(0x21):
  185.         /* 设置UART串口波特率4800bps */
  186.         USART_InitStructure.USART_BaudRate = 4800;
  187.           USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  188.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  189.         USART_InitStructure.USART_Parity = USART_Parity_Even;
  190.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  191.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  192.         break;

  193.         case(0x22):
  194.         /* 设置UART串口波特率  9600bps*/
  195.         USART_InitStructure.USART_BaudRate = 9600;
  196.           USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  197.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  198.         USART_InitStructure.USART_Parity = USART_Parity_Even;
  199.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  200.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  201.           break;

  202.         case(0x23):
  203.         /* 设置UART串口波特率 14400bps*/
  204.         USART_InitStructure.USART_BaudRate = 14400;
  205.           USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  206.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  207.         USART_InitStructure.USART_Parity = USART_Parity_Even;
  208.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  209.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  210.          break;

  211.         case(0x24):
  212.         /* 设置UART串口波特率  19200bps */
  213.         USART_InitStructure.USART_BaudRate = 19200;
  214.           USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  215.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  216.         USART_InitStructure.USART_Parity = USART_Parity_Even;
  217.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  218.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  219.         break;

  220.         case(0x25):
  221.         /* 设置UART串口波特率 38400bps */
  222.         USART_InitStructure.USART_BaudRate = 38400;
  223.           USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  224.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  225.         USART_InitStructure.USART_Parity = USART_Parity_Even;
  226.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  227.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  228.         break;

  229.         case(0x26):
  230.         /* 设置UART串口波特率 57600bps */
  231.         USART_InitStructure.USART_BaudRate = 57600;
  232.           USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  233.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  234.         USART_InitStructure.USART_Parity = USART_Parity_Even;
  235.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  236.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  237.         break;


  238. //==============出现异常后的处理  9600bps 8 N 1
  239.         default:
  240.         /* 设置UART串口波特率 38400bps */
  241.         USART_InitStructure.USART_BaudRate = 38400;
  242.           USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  243.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  244.         USART_InitStructure.USART_Parity = USART_Parity_No;
  245.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  246.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  247.         break;

  248.         }

  249.   /* Configure the USART2*/
  250.   USART_Init(USART2, &USART_InitStructure);

  251.   /* Enable USART1 Receive and Transmit interrupts */
  252.   USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
  253.   USART_ITConfig(USART2, USART_IT_TC, ENABLE);

  254.   /* Enable the USART1 */
  255.   USART_Cmd(USART2, ENABLE);


  256. // 初始化 串口输入输出缓冲
  257.   uart1_time = 0;
  258.   uart1_txall = 0;
  259.   uart1_txptr = 0;
  260.   uart1_rxptr = 0;

  261. }

  262. //=================================================================================================================



  263. //=================================================================================================================
  264. //=================================================================================================================
  265. //=================================================================================================================
  266. /****************************************************************************  F
  267. * 名称:uart1_dispose()
  268. * 功能:串口uart1数据处理。          专用编程接口
  269. * 入口参数:无
  270. * 出口参数:无
  271. ****************************************************************************/
  272. void uart1_dispose(void)
  273. {
  274. unsigned char bitres;
  275. unsigned short address;
  276. unsigned short length;
  277. unsigned short counter;

  278. unsigned char  ta;
  279. //
  280. unsigned short tc;


  281. if((uart1_rxptr > 4) && (uart1_time > 10))
  282. {

  283. if((uart1_rxbuf[0] == 0x00) || (uart1_rxbuf[0] ==  program[0x1b]) ) //通讯地址判断机制——8位模式         #### 以后用数据表参数代替
  284.         {
  285.         crc3 = uart1_rxbuf[uart1_rxptr - 2];
  286.         crc4 = uart1_rxbuf[uart1_rxptr - 1];

  287.         uart_crc(uart1_rxbuf , (uart1_rxptr - 2));


  288.            if((crc3 == crc1)&&(crc4 == crc2))
  289.                 {

  290.         /*********@@@@@@@@@@@@@@@@解释执行程序 begin @@@@@@@@@@@@@@@***********/
  291.         switch(uart1_rxbuf[1])
  292.                 {
  293.                 //+++++++++++++++++++++++++++++++++++++++++++++++
  294.                 case(0x01):
  295.                 address = uart1_rxbuf[2];
  296.                 address = address << 8;
  297.                 address |= uart1_rxbuf[3];
  298.                 bitres = address & 0x0f;
  299.                 address = address >> 4;
  300.                
  301.                 length = uart1_rxbuf[4];
  302.                 length = length << 8;
  303.                 length |= uart1_rxbuf[5];
  304.                
  305.                 if(length == 0) length = 1;

  306.                 ta = 0;
  307.                 uart1_txbuf[0] = uart1_rxbuf[0];
  308.                 uart1_txbuf[1] = uart1_rxbuf[1];
  309.                 //uart1_txbuf[2] =
  310.                 counter = 3;
  311.                 uart1_txbuf[counter] = 0;

  312.                 while(length)
  313.                         {
  314.                         if(memory[address] & (1<<bitres))
  315.                                 {
  316.                                 uart1_txbuf[counter] |= (1<<ta);
  317.                                 }
  318.                         else
  319.                                 {
  320.                                 uart1_txbuf[counter] &= ~(1<<ta);
  321.                                 }
  322.                         bitres++;
  323.                         if(bitres == 16)
  324.                                 {
  325.                                 bitres = 0;
  326.                                 address ++;
  327.                                 }
  328.                         ta++;
  329.                         length--;
  330.                         if((ta == 8)&(length != 0))
  331.                                 {
  332.                                 ta = 0;
  333.                                 counter ++;
  334.                                 uart1_txbuf[counter] = 0;
  335.                                 }
  336.                         
  337.                         }
  338.                 uart1_txbuf[2] = counter - 2;
  339.                 uart_crc(uart1_txbuf,(counter + 1));
  340.                 uart1_txbuf[counter+1] = crc1;
  341.                 uart1_txbuf[counter+2] = crc2;
  342.                 uart1_txall = counter+2;

  343.                 uart1_txptr = 0;
  344.                 COM1_OUT;
  345.                 USART2->DR = uart1_txbuf[0];

  346.                 break;
  347.                 //+++++++++++++++++++++++++++++++++++++++++++++++
  348.                 //+++++++++++++++++++++++++++++++++++++++++++++++
  349.                 case(0x05):
  350.                 address = uart1_rxbuf[2];
  351.                 address = address << 8;
  352.                 address |= uart1_rxbuf[3];
  353.                 bitres = address & 0x0f;
  354.                 address = address >> 4;
  355.                
  356.                 if((uart1_rxbuf[4] == 0xff) && (uart1_rxbuf[5] == 0x00))
  357.                 {
  358.                 memory[address] |= (1<< bitres);
  359.                 }
  360.                 else if((uart1_rxbuf[4] == 0x00) && (uart1_rxbuf[5] == 0x00))
  361.                 {
  362.                 memory[address] &= ~(1<< bitres);
  363.                 }

  364.                 uart1_txbuf[0] = uart1_rxbuf[0];
  365.                 uart1_txbuf[1] = uart1_rxbuf[1];
  366.                 uart1_txbuf[2] = uart1_rxbuf[2];
  367.                 uart1_txbuf[3] = uart1_rxbuf[3];
  368.                 uart1_txbuf[4] = uart1_rxbuf[4];
  369.                 uart1_txbuf[5] = uart1_rxbuf[5];
  370.                 uart1_txbuf[6] = uart1_rxbuf[6];
  371.                 uart1_txbuf[7] = uart1_rxbuf[7];
  372.                 uart1_txall = 7;

  373.                 //-----------------

  374.                 uart1_txptr = 0;
  375.                 COM1_OUT;
  376.                 USART2->DR = uart1_txbuf[0];
  377.                 break;



  378.                 //+++++++++++++++++++++++++++++++++++++++++++++++
  379.                 case(0x03):        
  380.                 address = uart1_rxbuf[2];
  381.                 address = address << 8;
  382.                 address |= uart1_rxbuf[3];

  383.                 length = uart1_rxbuf[4];
  384.                 length = length << 8;
  385.                 length |= uart1_rxbuf[5];
  386.                 if(length == 0) length = 1;

  387.                 counter = 2;
  388.                 uart1_txbuf[0] = uart1_rxbuf[0];
  389.                 uart1_txbuf[1] = uart1_rxbuf[1];
  390.                
  391.                   while(length)
  392.                           {
  393.                           counter ++;
  394.                           uart1_txbuf[counter] = memory[address] >> 8;
  395.                           counter ++;
  396.                           uart1_txbuf[counter] = memory[address] & 0x00ff;
  397.   
  398.                           length --;
  399.                           address ++;
  400.                           }
  401.                   
  402.                 uart1_txbuf[2]= counter -2;
  403.                 uart_crc(uart1_txbuf,(counter + 1));
  404.                 uart1_txbuf[counter+1] = crc1;
  405.                 uart1_txbuf[counter+2] = crc2;
  406.                 uart1_txall = counter+2;

  407.                 uart1_txptr = 0;
  408.                 COM1_OUT;
  409.                 USART2->DR = uart1_txbuf[0];
  410.                 break;
  411.                 //+++++++++++++++++++++++++++++++++++++++++++++++
  412.             /*
  413.                 //+++++++++++++++++++++++++++++++++++++++++++++++
  414.                 case(0x0F):
  415.                 address = uart1_rxbuf[2];
  416.                 address = address << 8;
  417.                 address |= uart1_rxbuf[3];
  418.                 bitres = address & 0x0f;
  419.                 address = address >> 4;
  420.                
  421.                 length = uart1_rxbuf[4];
  422.                 length = length << 8;
  423.                 length |= uart1_rxbuf[5];

  424.                 uart1_txbuf[0] = uart1_rxbuf[0];
  425.                 uart1_txbuf[1] = uart1_rxbuf[1];
  426.                 uart1_txbuf[2] = uart1_rxbuf[2];
  427.                 uart1_txbuf[3] = uart1_rxbuf[3];
  428.                 uart1_txbuf[4] = uart1_rxbuf[4];
  429.                 uart1_txbuf[5] = uart1_rxbuf[5];

  430.                 ta  = 0;
  431.                 counter = 7;

  432.                 //-----------------
  433.                         while(length)
  434.                                 {
  435.                                 if(uart1_rxbuf[counter] & (1<<ta))
  436.                                         {
  437.                                         memory[address] |= (1<<bitres);
  438.                                         }
  439.                                 else
  440.                                         {
  441.                                         memory[address] &= ~(1<<bitres);
  442.                                         }
  443.                                 bitres++;
  444.                                 if(bitres == 8)
  445.                                         {
  446.                                         bitres = 0;
  447.                                         address ++;
  448.                                         }
  449.                                 ta++;
  450.                                 length--;
  451.                                 if(ta == 8)
  452.                                         {
  453.                                         ta = 0;
  454.                                         counter ++;
  455.                                         }
  456.                         
  457.                                 }


  458.                 uart_crc(uart1_txbuf,6);
  459.                 uart1_txbuf[6] = crc1;
  460.                 uart1_txbuf[7] = crc2;
  461.                 uart1_txall = 7;

  462.                 //-----------------


  463.                 uart1_txptr = 0;
  464.                 COM1_OUT;
  465.                 USART2->DR = uart1_txbuf[0];
  466.                 break;
  467.             */
  468.                 //+++++++++++++++++++++++++++++++++++++++++++++++
  469.                 case(0x10):
  470.                 address = uart1_rxbuf[2];
  471.                 address = address << 8;
  472.                 address |= uart1_rxbuf[3];

  473.                 length = uart1_rxbuf[4];
  474.                 length = length << 8;
  475.                 length |= uart1_rxbuf[5];
  476.                 if(length == 0) length = 1;

  477.                 counter = 7;
  478.                 uart1_txbuf[0] = uart1_rxbuf[0];
  479.                 uart1_txbuf[1] = uart1_rxbuf[1];
  480.                 uart1_txbuf[2] = uart1_rxbuf[2];
  481.                 uart1_txbuf[3] = uart1_rxbuf[3];
  482.                 uart1_txbuf[4] = uart1_rxbuf[4];
  483.                 uart1_txbuf[5] = uart1_rxbuf[5];

  484.                 while(length)
  485.                         {
  486.                         tc = uart1_rxbuf[counter];
  487.                         tc = tc << 8;
  488.                         tc |= uart1_rxbuf[counter +1];
  489.                         memory[address] = tc;

  490.                         counter +=2;
  491.                         address ++;
  492.                         length --;
  493.                         }

  494.                 uart_crc(uart1_txbuf,6);
  495.                 uart1_txbuf[6] = crc1;
  496.                 uart1_txbuf[7] = crc2;
  497.                 uart1_txall = 7;


  498.                 uart1_txptr = 0;
  499.                 COM1_OUT;
  500.                 USART2->DR = uart1_txbuf[0];
  501.                 break;


  502.                 }                                 
  503.         /*********@@@@@@@@@@@@@@@@解释执行程序 end @@@@@@@@@@@@@@@***********/
  504.             uart1_rxptr = 0;          //清空uart1的缓冲计数 以及 定时
  505.                 uart1_time = 0;
  506.                 }
  507.         else
  508.                 {
  509.                 uart1_rxptr = 0;          //清空uart1的缓冲计数 以及 定时
  510.                 uart1_time = 0;
  511.                 }
  512.         }
  513. else
  514.         {
  515.         uart1_rxptr = 0;                  //清空uart1的缓冲计数 以及 定时
  516.         uart1_time = 0;
  517.         }
  518. }



  519. if((uart1_rxptr <= 4) && (uart1_time > 15))
  520.     {
  521.         uart1_rxptr = 0;                  //清空uart1的缓冲计数 以及 定时
  522.         uart1_time = 0;
  523.     }



  524. }


  525. /****************************************************************************  F
  526. * 名称:uart0_dispose()
  527. * 功能:串口uart0数据处理。
  528. * 入口参数:无
  529. * 出口参数:无
  530. ****************************************************************************/
  531. void uart0_dispose(void)
  532. {
  533. unsigned short address;

  534. unsigned char  ta;
  535. //
  536. unsigned short tt,tc;
  537. if((uart0_rxptr > 4) && (uart0_time > 9))
  538. {

  539. if((uart0_rxbuf[0] == 0x01)&&(uart0_rxbuf[1] == 0x55)&&(uart0_rxbuf[2] == 0xaa)&&(uart0_rxbuf[11] == 0x12)&&(uart0_rxbuf[12] == 0xef)&&(uart0_rxbuf[13] == 0xff))
  540.     {
  541.       /*********@@@@@@@@@@@@@@@@编程口解释执行程序 begin @@@@@@@@@@@@@@@***********/
  542.       if(uart0_rxbuf[3] == 0x00)          //读参数系统
  543.              {
  544.           address = uart0_rxbuf[5];
  545.           address = address << 8;
  546.           address |= uart0_rxbuf[6];
  547.                switch(uart0_rxbuf[4])
  548.             {
  549.                     //=====================================================================
  550.             case(0x00):   
  551.                     uart0_txbuf[7] = memory[address];
  552.                     uart0_txbuf[8] = memory[address] >> 8;
  553.                     uart0_txbuf[9] = memory[address + 1];
  554.                     uart0_txbuf[10] = memory[address + 1] >> 8;
  555.             break;
  556.                     //=====================================================================
  557.             case(0x11):
  558.                     uart0_txbuf[7] = program[address];

  559.                     uart0_txbuf[8] = program[address + 1];

  560.                     uart0_txbuf[9] = program[address + 2];

  561.                     uart0_txbuf[10] = program[address + 3];
  562.             break;

  563.             }
  564.           uart0_txbuf[0] = 0x02;
  565.           uart0_txbuf[1] = 0xAA;
  566.           uart0_txbuf[2] = 0x55;

  567.           uart0_txbuf[3] = 0x00;
  568.           uart0_txbuf[4] = uart0_rxbuf[4];
  569.           uart0_txbuf[5] = uart0_rxbuf[5];
  570.           uart0_txbuf[6] = uart0_rxbuf[6];

  571.           uart0_txbuf[11] = 0x34;
  572.           uart0_txbuf[12] = 0xcd;
  573.           uart0_txbuf[13] = 0xff;

  574.           uart0_txall = 13;
  575.           uart0_txptr = 0;
  576.           USART1->DR = uart0_txbuf[0];
  577.             }
  578.       else if(uart0_rxbuf[3] == 0x11)         //写参数系统
  579.              {
  580.           address = uart0_rxbuf[5];
  581.           address = address << 8;
  582.           address |= uart0_rxbuf[6];
  583.           switch(uart0_rxbuf[4])
  584.             {
  585.                     //=====================================================================
  586.             case(0x00):
  587.               tc = uart0_rxbuf[8];
  588.               tc = tc << 8;
  589.               tc |= uart0_rxbuf[7];
  590.               memory[address] = tc;
  591.               tc = uart0_rxbuf[10];
  592.               tc = tc << 8;
  593.               tc |= uart0_rxbuf[9];
  594.               memory[address + 1] = tc;
  595.             break;
  596.                     //=====================================================================
  597.                     //=====================================================================
  598.             case(0x11):
  599.               if(address == 0)
  600.               {
  601.                   FLASH_Unlock();
  602.                   FLASH_ErasePage(0x0800C000);
  603.                   FLASH_ErasePage(0x0800C400);
  604.                   FLASH_ErasePage(0x0800C800);
  605.                   FLASH_ErasePage(0x0800CC00);
  606.                   
  607.                   FLASH_ErasePage(0x0800D000);
  608.                   FLASH_ErasePage(0x0800D400);
  609.                   FLASH_ErasePage(0x0800D800);
  610.                   FLASH_ErasePage(0x0800DC00);
  611.                   
  612.                   FLASH_ErasePage(0x0800E000);
  613.                   FLASH_ErasePage(0x0800E400);
  614.                   FLASH_ErasePage(0x0800E800);
  615.                   FLASH_ErasePage(0x0800EC00);
  616.                   
  617.                   FLASH_ErasePage(0x0800F000);
  618.                   FLASH_ErasePage(0x0800F400);
  619.                   FLASH_ErasePage(0x0800F800);
  620.                   FLASH_ErasePage(0x0800FC00);
  621.               }
  622.               
  623.               tc = uart0_rxbuf[8];
  624.               tc = tc << 8;
  625.               tc |= uart0_rxbuf[7];
  626.               FLASH_ProgramHalfWord( (0x0800C000 + address), tc);
  627.               
  628.               tc = uart0_rxbuf[10];
  629.               tc = tc << 8;
  630.               tc |= uart0_rxbuf[9];
  631.               FLASH_ProgramHalfWord( (0x0800C000 + address + 2), tc);
  632.               
  633.             break;
  634.             }     

  635.           uart0_txbuf[0] = 0x02;
  636.           uart0_txbuf[1] = 0xAA;
  637.           uart0_txbuf[2] = 0x55;

  638.           uart0_txbuf[3] = 0x11;
  639.           uart0_txbuf[4] = uart0_rxbuf[4];
  640.           uart0_txbuf[5] = uart0_rxbuf[5];
  641.           uart0_txbuf[6] = uart0_rxbuf[6];
  642.   
  643.           uart0_txbuf[7] = uart0_rxbuf[7];
  644.           uart0_txbuf[8] = uart0_rxbuf[8];
  645.           uart0_txbuf[9] = uart0_rxbuf[9];
  646.           uart0_txbuf[10] = uart0_rxbuf[10];

  647.           uart0_txbuf[11] = 0x34;
  648.           uart0_txbuf[12] = 0xCD;
  649.           uart0_txbuf[13] = 0xFF;

  650.           uart0_txall = 13;
  651.           uart0_txptr = 0;
  652.           USART1->DR = uart0_txbuf[0];
  653.              }
  654.       else if(uart0_rxbuf[3] == 0x30)         //特殊指令
  655.              {
  656. ……………………

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

工程是IAR编译的51hei附件下载:
STM32仿三菱PLC开源代码.7z (500.17 KB, 下载次数: 1167)
STM32F103RBT6_开源PLC原理图.pdf (897.25 KB, 下载次数: 1048)



作者: 1056247163    时间: 2019-4-19 21:25
its = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_Odd;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_
作者: looksave    时间: 2019-5-26 20:37
下载学习
作者: hyp018    时间: 2019-5-27 11:26
下载学习,可是没有硬件也是理解不了的
作者: 583703056A    时间: 2019-5-27 20:23
留个脚印!以后有需要来下载
作者: xyzdh    时间: 2019-6-8 11:46
完整资源开源,楼主好样的,佩服!找了好久了,感谢楼主和我们这个交流学习平台
作者: 1424376352    时间: 2019-6-10 18:48
能下载梯形图吗
作者: 维超    时间: 2019-8-16 17:13
不错。先记下了。
作者: 微笑的小小    时间: 2019-8-17 12:44

留个脚印!
作者: zhengguo_wang    时间: 2019-8-19 10:24
这个很NB,谢谢了
作者: 77408187    时间: 2019-8-23 18:27
谁有开发板试试能行不告知一声
作者: 话说什么呢    时间: 2019-8-26 16:35
楼主牛逼 ,这个东西可以好好参考参考了
作者: yupengwei    时间: 2019-9-4 18:05
谢谢分享
作者: yupengwei    时间: 2019-9-5 08:39
谢谢分享
作者: wcs1668    时间: 2019-10-12 14:37
请问楼主梯形图用什么软件编译,编译完成后代码下载到单片机,和编译软件怎么通信。
作者: pzwyf    时间: 2019-10-13 14:01
谢谢分享
作者: chb2122    时间: 2019-10-24 21:47
怎么打开文件,找不到工程文件啊,各位大虾指导下新人
作者: jingboxu    时间: 2019-11-12 06:06
感谢分享,下载学习
作者: sskk888999    时间: 2019-11-17 22:37
下载学习学习
作者: ztsos123    时间: 2019-11-23 14:47
不错的东东.感谢楼主分享
作者: 大漠落日    时间: 2019-11-30 20:34
谢谢分享,学习一下
作者: msyeh    时间: 2019-12-1 16:51
感谢大大的分享,收下學習!
作者: qhpqqq    时间: 2019-12-13 22:11
谢谢大佬分享,我找个开发板下进去试试看
作者: dwh96    时间: 2019-12-29 23:46
谢谢分享,学习一下
作者: toolgou    时间: 2019-12-31 15:34
完整资源开源,楼主好样的,佩服!
作者: YUGYUG    时间: 2020-3-6 18:32
下载学习
作者: 天罡北斗    时间: 2020-3-10 12:11
下载学习中,谢谢LZ分享
作者: fengyu1352    时间: 2020-3-10 15:15
这个很NB,谢谢了,能不能在线仿真调试梯形图?
作者: 黎明初至    时间: 2020-3-11 10:46
谢谢,正在寻找仿PLC的内容
作者: HWL0541    时间: 2020-3-11 13:06
直接梯形图串口传程序吗
作者: ykr12    时间: 2020-3-31 14:57
仿PLC的资料有用过的吗
作者: ykr12    时间: 2020-3-31 14:58
谢谢。下载学习
作者: ykr12    时间: 2020-3-31 15:00
有用吗?有试过的吗
作者: ykr12    时间: 2020-4-1 13:35
下载来看看有没用
作者: lgz1860    时间: 2020-4-9 09:26
感谢分享,我有硬件原理图,这个程序先mark 一下,哪天想动手做一块了,来学习研究。
作者: cooleaf    时间: 2020-4-9 11:51
非常棒啊!完整资源开源,楼主好样的,佩服!
作者: chywpp    时间: 2020-4-12 00:10
下载学习,谢谢楼主
作者: ruiboxu    时间: 2020-4-16 10:32
谢谢分享
作者: htzsz    时间: 2020-4-16 16:16
感谢楼主分享,下载学习学习。
作者: jubaolun    时间: 2020-5-1 08:49
下载学习,谢谢楼主
作者: zx9330    时间: 2020-5-10 20:25
下载一个看看
作者: shenchaobiao    时间: 2020-5-10 22:58
mark,留用
作者: xuezc    时间: 2020-5-14 23:38
强!!!  下载学习
作者: SDMCU51    时间: 2020-5-18 22:53
mark,留用
作者: techjian    时间: 2020-5-22 10:40
研究下看看
作者: abcdefbcdef    时间: 2020-5-23 12:41
我靠,好东西
作者: libojp    时间: 2020-6-15 14:34
下载学习,谢谢楼主
作者: hzd530    时间: 2020-6-16 10:32
学习学习,电路不错,谢谢!
作者: et_boY    时间: 2020-7-2 19:40
楼主有试过吗,能完整应用吗?
作者: zy123agd    时间: 2020-7-17 16:21
目前在学习单片机PLC,下载从头学起
作者: xiexugang    时间: 2020-7-22 05:59
先下载,有空时,试一试.
作者: xyllovezuu    时间: 2020-7-24 21:53
学习了解PLC的好资料,楼主威武
作者: xw0755    时间: 2020-7-27 07:48
用keil打不开
作者: huaishang    时间: 2020-7-30 12:01
这个很NB,谢谢了
作者: 温柔的郎    时间: 2020-10-1 12:47
keil打不开啊!!什么软件打开编辑呢??
作者: perseverance51    时间: 2020-10-2 09:04
这是通过什么软件编译的,反正不是keil软件。
作者: qq603599910    时间: 2020-10-2 10:28
我目前也正好做这个,不过都是自己一点点啃代码,串口数据转坐标脉冲算法我至少花了一周,伺服电机的S型启动和停止我至少用了3个算法方案,最后勉强用数组写固定式缓冲才勉强撑住.
作者: langeliu    时间: 2020-10-7 21:58
有人做成成品试过吗?
作者: lhp2003    时间: 2020-11-11 17:07
谢谢分享,mark下!
作者: sdfeee    时间: 2020-12-14 09:56
学习下可惜积分不够 属于单片机二次编程吧
作者: dzforum    时间: 2021-1-7 21:01
看着不错的样子,应该有用哦!
作者: eastsnow001    时间: 2021-1-9 08:03
好资料,不错,谢谢楼主,对我学习帮助很大。
作者: munuc_w    时间: 2021-1-15 08:46
这个工程是IAR的,可以移植到KEIL下试试。但不知二次开发(梯图)如何搞。
作者: useridqq    时间: 2021-1-27 11:20
说明在详细点就OK了


作者: johnsonxjq    时间: 2021-2-7 00:33
ztsos123 发表于 2019-11-23 14:47
不错的东东.感谢楼主分享

好东西有帮助。
作者: zlrong    时间: 2021-2-19 22:39
这个能用三菱软件下载梯形图吗
作者: chinajhgjhg    时间: 2021-2-20 15:58
程序直接能用stm32做吗?

作者: useridqq    时间: 2021-2-28 10:45
STM32仿三菱PLC开源代码+电路图, mark 一下
作者: brightsm    时间: 2021-2-28 16:22
三菱哪个软件可以对其组态调试?
作者: brightsm    时间: 2021-2-28 16:24
能用三菱的组态软件进行调试吗?
作者: 陆菲青    时间: 2021-3-18 16:21
究竟是怎么弄个的我特别想知道
作者: myw1999    时间: 2021-3-18 20:05
这个顶啊 干一些电机控制能用到吗
作者: zhangxiaozi    时间: 2021-3-19 00:23
刚才下载看了一下,无PCB图,是用IAR FOR ARM开发的
作者: CHENJIAN633    时间: 2021-5-17 11:34
找不到图纸,下载来学习一下。
作者: SimonLu007    时间: 2021-5-24 17:02
正在学习单片机,感谢楼主分享!
作者: yayayunyun    时间: 2021-5-28 16:19
怎么打开文件,找不到工程文件啊,各位大虾指导下新人
作者: oste    时间: 2021-6-19 08:08
谢谢分享,mark留用!
作者: shjine    时间: 2021-10-7 20:51
感谢分享,最近开始要做类似的东西了
作者: yf_2010    时间: 2021-10-18 20:37
有没有做成功的?
作者: like123    时间: 2021-11-10 11:27
下载了解压不了
作者: heicad    时间: 2021-11-11 16:18
like123 发表于 2021-11-10 11:27
下载了解压不了

我刚用7zip 成功解压了
作者: he200312    时间: 2021-12-9 14:21
谢谢大佬分享,我找个开发板下进去试试看
作者: yinds5092    时间: 2021-12-14 20:48
51黑有你更精彩
作者: dhbt2021    时间: 2021-12-15 22:56
先留脚印,有时间再看!
作者: tatachaoren    时间: 2021-12-16 17:26
留个脚印,后面回来下载,感谢楼主
作者: leewheel    时间: 2022-2-28 10:05
非常感谢分享这类干货!!
作者: 923692369    时间: 2022-3-2 19:00
下载研究下,谢谢楼主分享
作者: wuwangyuan    时间: 2022-3-14 14:52
谢谢分享,不知用什么梯图软件
作者: li357919    时间: 2022-3-23 13:58
能否 仿真通讯
作者: lig806    时间: 2022-3-29 21:36
下载学习,可是没有硬件也是理解不了的
作者: mick32    时间: 2022-3-30 21:54
IAR as compiler and what kind of Mitsubishi software as ladder designer  ?
Thank you for code and schematic
作者: wwfan    时间: 2022-3-31 11:55
围观和学习
作者: jing794926058    时间: 2023-12-14 08:56
   差评   原理图不完整  
作者: sanlaixue    时间: 2024-1-14 15:38
我也是刚刚想学习一下的。
作者: yuer04    时间: 2025-6-14 13:36
正好需要,感谢分享




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1