找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 29343|回复: 93
收起左侧

STM32仿三菱PLC开源代码+电路图

  [复制链接]
ID:27919 发表于 2019-4-18 11:49 | 显示全部楼层 |阅读模式
三菱PLC源码,提供给大家参考。
0.png

电路原理图如下:
0.png 0.png

单片机源程序如下:
  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, 下载次数: 1147)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:71883 发表于 2019-10-12 14:37 | 显示全部楼层
请问楼主梯形图用什么软件编译,编译完成后代码下载到单片机,和编译软件怎么通信。
回复

使用道具 举报

ID:795427 发表于 2020-10-2 09:04 | 显示全部楼层
这是通过什么软件编译的,反正不是keil软件。
回复

使用道具 举报

ID:272119 发表于 2020-10-2 10:28 | 显示全部楼层
我目前也正好做这个,不过都是自己一点点啃代码,串口数据转坐标脉冲算法我至少花了一周,伺服电机的S型启动和停止我至少用了3个算法方案,最后勉强用数组写固定式缓冲才勉强撑住.
回复

使用道具 举报

ID:77110 发表于 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_
回复

使用道具 举报

ID:74303 发表于 2019-5-26 20:37 | 显示全部楼层
下载学习
回复

使用道具 举报

ID:415096 发表于 2019-5-27 11:26 | 显示全部楼层
下载学习,可是没有硬件也是理解不了的
回复

使用道具 举报

ID:82419 发表于 2019-5-27 20:23 来自手机 | 显示全部楼层
留个脚印!以后有需要来下载
回复

使用道具 举报

ID:557411 发表于 2019-6-8 11:46 | 显示全部楼层
完整资源开源,楼主好样的,佩服!找了好久了,感谢楼主和我们这个交流学习平台
回复

使用道具 举报

ID:113936 发表于 2019-6-10 18:48 | 显示全部楼层
能下载梯形图吗
回复

使用道具 举报

ID:46999 发表于 2019-8-16 17:13 | 显示全部楼层
不错。先记下了。
回复

使用道具 举报

ID:240452 发表于 2019-8-17 12:44 | 显示全部楼层

留个脚印!
回复

使用道具 举报

ID:166646 发表于 2019-8-19 10:24 | 显示全部楼层
这个很NB,谢谢了
回复

使用道具 举报

ID:69421 发表于 2019-8-23 18:27 来自手机 | 显示全部楼层
谁有开发板试试能行不告知一声
回复

使用道具 举报

ID:603960 发表于 2019-8-26 16:35 | 显示全部楼层
楼主牛逼 ,这个东西可以好好参考参考了
回复

使用道具 举报

ID:606788 发表于 2019-9-4 18:05 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:606788 发表于 2019-9-5 08:39 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:482794 发表于 2019-10-13 14:01 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:629247 发表于 2019-10-24 21:47 | 显示全部楼层
怎么打开文件,找不到工程文件啊,各位大虾指导下新人
回复

使用道具 举报

ID:52896 发表于 2019-11-12 06:06 | 显示全部楼层
感谢分享,下载学习
回复

使用道具 举报

ID:383657 发表于 2019-11-17 22:37 | 显示全部楼层
下载学习学习
回复

使用道具 举报

ID:492919 发表于 2019-11-23 14:47 | 显示全部楼层
不错的东东.感谢楼主分享
回复

使用道具 举报

ID:195496 发表于 2019-11-30 20:34 | 显示全部楼层
谢谢分享,学习一下
回复

使用道具 举报

ID:128391 发表于 2019-12-1 16:51 | 显示全部楼层
感谢大大的分享,收下學習!
回复

使用道具 举报

ID:164036 发表于 2019-12-13 22:11 | 显示全部楼层
谢谢大佬分享,我找个开发板下进去试试看
回复

使用道具 举报

ID:658136 发表于 2019-12-29 23:46 | 显示全部楼层
谢谢分享,学习一下
回复

使用道具 举报

ID:292577 发表于 2019-12-31 15:34 | 显示全部楼层
完整资源开源,楼主好样的,佩服!
回复

使用道具 举报

ID:693370 发表于 2020-3-6 18:32 | 显示全部楼层
下载学习
回复

使用道具 举报

ID:369697 发表于 2020-3-10 12:11 | 显示全部楼层
下载学习中,谢谢LZ分享
回复

使用道具 举报

ID:574873 发表于 2020-3-10 15:15 | 显示全部楼层
这个很NB,谢谢了,能不能在线仿真调试梯形图?
回复

使用道具 举报

ID:697917 发表于 2020-3-11 10:46 | 显示全部楼层
谢谢,正在寻找仿PLC的内容
回复

使用道具 举报

ID:91165 发表于 2020-3-11 13:06 | 显示全部楼层
直接梯形图串口传程序吗
回复

使用道具 举报

ID:719527 发表于 2020-3-31 14:57 | 显示全部楼层
仿PLC的资料有用过的吗
回复

使用道具 举报

ID:719527 发表于 2020-3-31 14:58 | 显示全部楼层
谢谢。下载学习
回复

使用道具 举报

ID:719527 发表于 2020-3-31 15:00 | 显示全部楼层
有用吗?有试过的吗
回复

使用道具 举报

ID:719527 发表于 2020-4-1 13:35 | 显示全部楼层
下载来看看有没用
回复

使用道具 举报

ID:716711 发表于 2020-4-9 09:26 | 显示全部楼层
感谢分享,我有硬件原理图,这个程序先mark 一下,哪天想动手做一块了,来学习研究。
回复

使用道具 举报

ID:430492 发表于 2020-4-9 11:51 | 显示全部楼层
非常棒啊!完整资源开源,楼主好样的,佩服!
回复

使用道具 举报

ID:254011 发表于 2020-4-12 00:10 | 显示全部楼层
下载学习,谢谢楼主
回复

使用道具 举报

ID:313434 发表于 2020-4-16 10:32 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:142383 发表于 2020-4-16 16:16 | 显示全部楼层
感谢楼主分享,下载学习学习。
回复

使用道具 举报

ID:105206 发表于 2020-5-1 08:49 | 显示全部楼层
下载学习,谢谢楼主
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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