找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4474|回复: 4
收起左侧

8051F340单片机MODBUS源程序

[复制链接]
ID:282833 发表于 2018-3-9 16:05 | 显示全部楼层 |阅读模式
8051F340MODBUS程序,学习学习

单片机源程序如下:
  1. #include"C8051F120.h"
  2. #include"VVVF.h"
  3. #include"UART.h"
  4. #include"DataProcess.h"
  5. sbit S_SL=P5^5;
  6. /*------------------------------------------------------------------------------------
  7. 函数名:Send485Data()
  8. 函数功能:发送一个字节485数据
  9. 参数:uchar dat;
  10. 返回:void
  11. -------------------------------------------------------------------------------------*/
  12. void Send485Data(uchar xdata dat){
  13.     uchar  xdata old_SFRPAGE;
  14.     old_SFRPAGE=SFRPAGE;
  15.     SFRPAGE   = CONFIG_PAGE;
  16.         UART0_Init(9600);
  17.     S_SL=1;/////关闭485发送 防止在不需要的时候数据写
  18.         UART0SendOneByte(dat);
  19.   //P4&=0xEF;/////关闭485发送 防止在不需要的时候数据写,???????????影响串口中断
  20.     UART0_End();
  21.         S_SL=0;
  22.     SFRPAGE=old_SFRPAGE;
  23. }
  24. void SendVVVFCommand(uchar xdata comm, uint xdata StartAddr,uint xdata para){
  25.    uchar xdata commstr[8],i;
  26.    uint xdata CRC;
  27.    commstr[0]=0x01;//命令机号
  28.    commstr[1]=comm;//命令
  29.    commstr[2]=StartAddr/256;//起始地址高在前地在后
  30.    commstr[3]=StartAddr%256;
  31.    commstr[4]=para/256;
  32.    commstr[5]=para%256;//参数
  33.    CRC=VVVF_CRC_CHK(commstr,6);
  34.    commstr[6]=CRC%256;
  35.    commstr[7]=CRC/256;
  36.    for(i=0;i<8;i++){
  37.      Send485Data(commstr[i]);
  38.    }
  39. }   
  40. /*------------------------------------------------------------------------------------
  41. 函数名:MotorRun()
  42. 函数功能:启动电机 即启动变频器
  43. 参数: void
  44. 返回:void
  45. -------------------------------------------------------------------------------------*/
  46. void MotorRun(){
  47.     SendVVVFCommand(0x06,0x2000,0x0002);
  48. }
  49. /*------------------------------------------------------------------------------------
  50. 函数名:MotorStop()
  51. 函数功能:停止电机 即停止变频器
  52. 参数: void
  53. 返回:void
  54. -------------------------------------------------------------------------------------*/
  55. void MotorStop(){
  56.     SendVVVFCommand(0x06,0x2000,0x0001);
  57. }
  58. /*------------------------------------------------------------------------------------
  59. 函数名:MotorFWD()
  60. 函数功能:电机正转命令
  61. 参数: void
  62. 返回:void
  63. -------------------------------------------------------------------------------------*/
  64. void MotorFWD(){
  65.     SendVVVFCommand(0x06,0x2000,0x0010);
  66. }
  67. /*------------------------------------------------------------------------------------
  68. 函数名:MotorREV()
  69. 函数功能:电机反转命令
  70. 参数: void
  71. 返回:void
  72. -------------------------------------------------------------------------------------*/
  73. void MotorREV(){
  74.     SendVVVFCommand(0x06,0x2000,0x0020);
  75. }
  76. /*------------------------------------------------------------------------------------
  77. 函数名:SetFrequnce()
  78. 函数功能:设置频率
  79. 参数: float xdata freq
  80. 返回:void
  81. -------------------------------------------------------------------------------------*/
  82. void SetFrequence(float xdata  freq){
  83.     SendVVVFCommand(0x06,0x2001,freq*100);
  84. }

  85. // MotorStop();
  86. /*SetFrequence(40);
  87.    MotorFWD();
  88.    MotorREV();
  89.    SetFrequence(60);
  90.     SetFrequence(50);
  91.     SetFrequence(45);
  92.          SetFrequence(61);
  93.           SetFrequence(65);
  94.            SetFrequence(66);
  95.     SetFrequence(150);
  96.          SetFrequence(180);*/
  97.   // SendVVVFCommand(0x06,0x2001,5000);
  98.    //SendVVVFCommand(0x06,0x2000,0x0002);
  99.    //SendVVVFCommand(0x06,0x2000,0x0001);
  100.    //Num=UART0ReceiveOneByte();
复制代码
  1. //modbus通信协议实现
  2. //

  3. #include <c8051f340.h>            
  4. #include <intrins.h>
  5. //-----------------------------------------------------------------------------
  6. // Global CONSTANTS
  7. //-----------------------------------------------------------------------------
  8. #define BaudRate       19200//9600,14400,19200,38400,56000可选        
  9. #define SYSCLK         12000000   
  10. //#define BAUDRATE     9600         
  11. //#define SYSCLK       11059200     
  12. sbit GREEN = P2^2;
  13. sbit RED   = P2^1;
  14. sbit PF    = P2^0;
  15. //-----------------------------------------------------------------------------
  16. // Function PROTOTYPES
  17. //-----------------------------------------------------------------------------

  18. #define u16 unsigned int
  19. #define u8 unsigned char
  20. #define   MAXNByte  15   //最大字节数
  21. //#define  time0      30000
  22. #define  MAXREG     100   //最大寄存器数量

  23. //void SYSCLK_Init (void);
  24. void PORT_Init (void);   //IO口初始化
  25. void UART0_Init (void);   //uart0初始化

  26. void readRegisters(void) ;//读寄存器,功能码03
  27. void beginSend(void) ;    //发送子程序
  28. void presetMultipleRegisters(void);//设置多个寄存器,功能码16
  29. void FLASH_ByteWrite(u16 addr, u8 byte);//flash写
  30. void FLASH_PageErase (u16 addr);        //flash页擦写
  31. //void Receive_timeout(void);             //超时子程序
  32. u16 crc_chk(u8 *dat,u8 length);         //CRC校验
  33. u8 FLASH_ByteRead (u16 addr);           //flash读
  34. //void presetSingleRegisters(void);       //设置单个寄存器,功能码06
  35. void send_err(u8 err,u8 err_code);       //发送错误
  36. void Timer0_Init(void);                  //定时器0初始化
  37. void PCA_Init();
  38. u16 flag;
  39. u8 temp;
  40. u8 count_receiveNByte;//接收字节数
  41. u8 mod_buf[20];       //modubs 数据接收缓冲区
  42. u8 sendBuf[20];       //发送缓冲区
  43. u8 sendCount;         //发送字节数
  44. u8 localAddr = 3;     //单片机控制板的地址
  45. //u16 Receivetimeout;    //定时初值
  46. //bit ReceiveBit;   

  47. //unsigned int  code  baud_code[8] = {};
  48. /*?????*/
  49. /*void delay(unsigned int m)
  50. {
  51. unsigned int n;
  52. n=0;
  53. while(n < m)
  54. {n++;}
  55. return;
  56. }  */
  57. //-----------------------------------------------------------------------------
  58. // MAIN Routine
  59. //-----------------------------------------------------------------------------

  60. void main(void)
  61. {
  62.    u16 dat;
  63.    u16 tempData;
  64.    u16 crcData;
  65.    PCA0MD    &= ~0x40;                    
  66.    OSCICN    |= 0x03;

  67.    //SYSCLK_Init ();                     
  68.     PORT_Init ();                       
  69.     UART0_Init ();
  70.     PCA_Init();                    
  71. //         Timer0_Init();
  72.     EA=1;
  73.     ES0=1;
  74.         PS0=1;
  75.         GREEN=1;     
  76.     RED=0;
  77. while(1){
  78.   if (mod_buf[0]==localAddr)
  79.   {
  80.      if(count_receiveNByte>4)
  81.         {


  82.     switch(mod_buf[1])
  83.         {
  84.        case 0x03:
  85.                             if(count_receiveNByte>=8)
  86.                                            {
  87.                                           crcData = crc_chk(mod_buf,6);  //CRC校验
  88.                           dat=mod_buf[7];
  89.                           if(crcData==mod_buf[6]+(dat<<8)) //CRC校验结果比较
  90.                         
  91.                               readRegisters();         // 如果检验正确,那么就回应数据
  92.                                                           count_receiveNByte=0;     //接受数据指针归零   
  93.                                                  
  94.                          }
  95.                     break;
  96.                     
  97.                  
  98. /*            case 0x06:
  99.                if(count_receiveNByte>=8)
  100.                                        {
  101.                                      crcData = crc_chk(mod_buf,6);  //CRC校验
  102.                                          dat=mod_buf[7];
  103.                    if(crcData==mod_buf[6]+(dat<<8)) //CRC校验结果比较
  104.                      
  105.                             presetSingleRegisters();
  106.                     count_receiveNByte=0;     //接受数据指针归零  
  107.                                }
  108.                    break;*/
  109.             case 0x10:
  110.                            dat=mod_buf[4];
  111.                    tempData = (dat<<8) + mod_buf[5];
  112.                    tempData = tempData * 2; //数据个数
  113.                    tempData += 9;
  114.                 if(count_receiveNByte >= tempData)
  115.                  {
  116.                   
  117.                      crcData = crc_chk(mod_buf,tempData-2);
  118.                      dat=mod_buf[tempData-1];
  119.                     if(crcData == (dat<<8)+ mod_buf[tempData-2])
  120.                      
  121.                                 presetMultipleRegisters();
  122.                                                 count_receiveNByte=0;     //接受数据指针归零   
  123.                                        
  124.                                  }
  125.                                   break;
  126.                  default:
  127.                   break;
  128.          }
  129.                                

  130.    }
  131.    
  132.          
  133.   }
  134.   else
  135.     count_receiveNByte=0;     //接受数据指针归零
  136.   _nop_();
  137. //    Receive_timeout();
  138.    PCA0CPH4 = 0x00;
  139. }
  140. }

  141. //-----------------------------------------------------------------------------
  142. // SYSCLK_Init
  143. //-----------------------------------------------------------------------------
  144. //
  145. // This routine initializes the system clock to use an 22.1184MHz crystal
  146. // as its clock source.
  147. //
  148. //void SYSCLK_Init (void)
  149. //{
  150. //   int i;                              

  151. //   OSCXCN = 0x67;                     
  152. //  for (i=0; i < 256; i++) ;         

  153. //   while (!(OSCXCN & 0x80)) ;         

  154. //   OSCICN = 0x88;                     
  155. //}

  156. //-----------------------------------------------------------------------------
  157. // PORT_Init
  158. //-----------------------------------------------------------------------------
  159. //
  160. // Configure the Crossbar and GPIO ports
  161. //

  162. void PCA_Init()
  163. {
  164.     PCA0CN     =  0x40;                // PCA counter enable
  165.     PCA0MD    &= ~0x40 ;               // Watchdog timer disabled-clearing bit 6
  166.     PCA0MD    &=  0xF1;                // timebase selected - System clock / 12
  167.     PCA0CPL4   =  0xFF;                // Offset value
  168.     PCA0MD  |= 0x40;
  169.     PCA0L    = 0x00;                          // Set lower byte of PCA counter to 0  
  170.     PCA0H    = 0x00;
  171. }

  172. void PORT_Init (void)
  173. {
  174.    XBR0    = 0x01;                      //UART TX0, RX0连到端口引脚P0.4和P0.5
  175.    XBR1    = 0x40;
  176.    XBR2    = 0x00;                     //UART1的I/O不连到端口引?
  177.    P0MDOUT |= 0x01;                    //TX0输出为推挽方式
  178.    P2MDOUT |= 0x3f;                  
  179.    P1MDOUT |= 0xff;
  180. //   P0SKIP  |= 0xc0;
  181. }

  182. //-----------------------------------------------------------------------------
  183. // UART0_Init
  184. //-----------------------------------------------------------------------------
  185. //
  186. // Configure the UART0 using Timer1, for <baudrate> and 8-N-1.
  187. //
  188. void UART0_Init (void)
  189. {
  190.     SCON0   = 0x50;                    
  191.     TMOD    = 0x20;                    
  192.         if(BaudRate > 38400)                 
  193.         {
  194.                 CKCON  = 0x08;                      //定时器使用系统时钟
  195.                 TH1    = 256-SYSCLK/2/BaudRate;
  196.         }
  197.         if(BaudRate <= 38400)
  198.         {
  199.                 CKCON  = 0x01;                      //定时器时钟用系统时钟的4分频
  200.                 TH1    = 256-SYSCLK/4/2/BaudRate;
  201.         }
  202.    TL1=TH1;
  203.    TR1    = 1;                        
  204.    CKCON |= 0x01;                      //定时器时钟用系统时钟的4分频
  205.    PF=0;
  206. }

  207. /*void Timer0_Init(void)
  208. {
  209. TMOD |= 0x01;        // 定时器0: 方式1,16位定时器
  210. TF0=0;        
  211. TR0=1;// TR0
  212. CKCON |= 0x10;        //
  213. TH0 = 0xf1; //256 -((60*SYSCLK/1000/12)/256);
  214. TL0 = 0xc2;//256 -((60*SYSCLK/1000/12)%256);
  215. ET0=1;
  216. }

  217. void timer0() interrupt 1 using 2 //定时器中断
  218. {   
  219.     TF0=0;
  220.     TR0=0;
  221.     TH0=0xf1;    //3.646ms interrupt
  222.     TL0=0xc2;
  223.     flag++;
  224.         if(flag==15)
  225.          {
  226.            flag=0;
  227.        if(count_receiveNByte<=2)    //超时后,若接收缓冲区有数则判断为收到一帧
  228.        {
  229.               count_receiveNByte=0;     //接受数据指针归零   ;
  230.        }
  231.           }
  232.         TR0=1;
  233. }
  234. /***********************************************************
  235. CRC校验
  236. ***************************************************************/
  237. u16 crc_chk(u8 *pData,u8 nLen)
  238. {
  239. u16 temp=0xffff,temp1,i,j;
  240. for(i=0;i<nLen;i++)
  241.     {
  242.     temp^=*(pData+i);
  243.         for(j=0;j<8;j++)
  244.                 {
  245.                 temp1=temp;
  246.                 temp>>=1;
  247.                 if(temp1&0x0001)
  248.                         temp^=0xa001;
  249.         }
  250.     }
  251. return(temp);
  252. }

  253. /*功能码03读*/
  254. void readRegisters(void)
  255. {
  256.    u16 addr;
  257.    u16 tempAddr;
  258. // u16 result;
  259.    u16 crcData;
  260.    u8 readCount;
  261.    u8 byteCount;

  262. // u8  finsh; //
  263.    u8 i;
  264.    u16 tempData = 0;
  265.    tempData=mod_buf[2];
  266.    addr = (tempData<<8) + mod_buf[3];
  267.    tempAddr = addr ;//& 0xfff;
  268.    //addr = mod_buf[3];
  269.    //tempAddr = addr;

  270. //readCount = (receBuf[4]<<8) + receBuf[5];
  271.    readCount  = mod_buf[5];
  272.    if(readCount<MAXREG)
  273.    {
  274.        byteCount = readCount* 2 ;//;

  275.       for(i=0;i<byteCount;i++,tempAddr++)
  276.       {
  277.           tempData=FLASH_ByteRead(tempAddr);
  278.           //getRegisterVal(tempAddr,&tempData);   
  279.           sendBuf[i+3] = tempData;// & 0xff;
  280.   
  281.        }

  282.        sendBuf[0] = localAddr;
  283.        sendBuf[1] = 3;
  284.        sendBuf[2] = byteCount;
  285.        byteCount += 3;
  286.        crcData = crc_chk(sendBuf,byteCount);
  287.        sendBuf[byteCount] = crcData & 0xff;
  288.        byteCount++;
  289.        sendBuf[byteCount] =  crcData >> 8;

  290.        sendCount = byteCount + 1;
  291.        beginSend();
  292.    }
  293.    else
  294.         {

  295.             send_err(0x83,0x03);
  296.     }
  297. }//void readRegisters(void)

  298. /*****************************************************************
  299. 功能码6 设置单个寄存器
  300. ******************************************************************
  301. void presetSingleRegisters(void)
  302. {
  303. u16 addr;
  304. u16 tempAddr;


  305. u16 crcData;
  306. u16 tempData;
  307. // uint8  finsh; //为1时完成 为0时出错

  308. tempData=mod_buf[2];
  309. addr = (tempData<<8) + mod_buf[3];
  310.   tempAddr = addr;// & 0xfff;
  311.   //addr = mod_buf[3];
  312.   //tempAddr = addr & 0xff;

  313.   //setCount = (receBuf[4]<<8) + receBuf[5];
  314.   //setCount = mod_buf[5];
  315.   //byteCount = mod_buf[6];

  316.      FLASH_PageErase (tempAddr);

  317. //    tempData = (modbuf[i*2+7]<<8) + modbuf[i*2+8];
  318.       tempData=mod_buf[4];
  319. //    setRegisterVal(tempAddr,tempData);
  320.       FLASH_ByteWrite (tempAddr, tempData);
  321.           sendBuf[4] = tempData ;
  322.           tempData=mod_buf[5];
  323.           FLASH_ByteWrite (tempAddr+1, tempData);         
  324.       sendBuf[5] = tempData;


  325. sendBuf[0] = localAddr;
  326. sendBuf[1] = 6;
  327. sendBuf[2] = addr >> 8;
  328. sendBuf[3] = addr & 0xff;
  329. crcData = crc_chk(sendBuf,6);
  330. sendBuf[6] = crcData & 0xff;
  331. sendBuf[7] = crcData >> 8;
  332. sendCount = 8;
  333. beginSend();
  334. }

  335. /****************************************************************
  336. 功能码16,设置多个功能寄存器
  337. ******************************************************************/
  338. void presetMultipleRegisters(void)
  339. {

  340. u16 addr;
  341. u16 tempAddr;
  342. u8 byteCount;
  343. u8 setCount;
  344. u16 crcData;
  345. u16 tempData;
  346. // uint8  finsh; //为1时完成 为0时出错
  347. u8 i;

  348. //addr = mod_buf[3];
  349. tempData=mod_buf[2];
  350. addr = (tempData<<8) + mod_buf[3];
  351. tempAddr = addr;// & 0xfff;

  352. //tempAddr = addr & 0xff;

  353. //setCount = (receBuf[4]<<8) + receBuf[5];
  354. setCount = mod_buf[5];
  355. if(setCount<=0x78)
  356. {
  357.   byteCount = mod_buf[6];


  358. sendBuf[0] = localAddr;
  359. sendBuf[1] = 16;
  360. sendBuf[2] = addr >> 8;
  361. sendBuf[3] = addr & 0xff;
  362. sendBuf[4] = setCount >> 8;
  363. sendBuf[5] = setCount & 0xff;
  364. crcData = crc_chk(sendBuf,6);
  365. sendBuf[6] = crcData & 0xff;
  366. sendBuf[7] = crcData >> 8;
  367. sendCount = 8;
  368. beginSend();

  369.     FLASH_PageErase (0x7c00);

  370.    for(i=0;i<byteCount;i++,tempAddr++)
  371.    {
  372. //    tempData = (modbuf[i*2+7]<<8) + modbuf[i*2+8];
  373.       tempData=mod_buf[7+i];
  374. //    setRegisterVal(tempAddr,tempData);

  375.       FLASH_ByteWrite (tempAddr, tempData);
  376.    }

  377. }
  378. else//寄存器数量>120
  379.    {

  380.      send_err(0x90,0x03);

  381.    }

  382. }//void presetMultipleRegisters(void)




  383. /*UART0中断处理*/
  384. void UART0_ISR (void) interrupt 4
  385. {
  386. ES0=0;
  387. if(!TI0)              
  388.    {
  389. //    Receivetimeout=time0;
  390.     RI0 = 0;  
  391.     mod_buf[count_receiveNByte] = SBUF0; //获取数据
  392.    count_receiveNByte++;       //接收字节数目
  393. //   Receivetimeout=350;  
  394.   if(count_receiveNByte >= MAXNByte)   //如果接收满
  395.    count_receiveNByte = 0;     //接受满 归0  
  396.    
  397.    }
  398.   TI0 = 0;   
  399.   ES0=1;
  400. }
  401. //发送子程序
  402. void beginSend(void)
  403. {        u8 i;
  404.         ES0=0;
  405.         GREEN=0;
  406.                 RED=1;
  407.                 PF=1;          //485允许发送
  408.          for(i=0;i<sendCount;i++)
  409.        {
  410.         SBUF0 = sendBuf[i];
  411.         while(TI0==0);
  412.         TI0=0;
  413.        }
  414.            PF=0;           //485允许接收
  415.            GREEN=1;
  416.            RED=0;
  417.            ES0=1;
  418. }

  419. void send_err(u8 err,u8 err_code)//发送错误
  420. {
  421.   u16 crc_tmp;
  422.        
  423.   sendBuf[0]=localAddr;
  424.   sendBuf[1]=err;
  425.   sendBuf[2]=err_code;
  426.   crc_tmp=crc_chk(mod_buf,3);
  427.   sendBuf[3]=crc_tmp;
  428.   sendBuf[4]=crc_tmp>>8;
  429.   sendCount=5;
  430.   beginSend();       
  431.   
  432. }
  433. /*****************************************************
  434. 接收超时判断
  435. 调用条件:
  436. ((Receivetime_flag=1)&&(count_receiveNByte>0))  1ms定时时间到
  437. 并且 有接收到的字符,调用此模块,判定是否接收超时
  438. *****************************************************
  439. void Receive_timeout(void)
  440. {
  441. Receivetimeout--;
  442. if((Receivetimeout==0)&&(count_receiveNByte>0)) //说明接收超时
  443.   {
  444.    count_receiveNByte=0;     //接受数据指针归零
  445.    SCON0|=0x10;       //允许UART0接收,REN0=1;
  446.   }
  447. }*/
  448. void FLASH_PageErase (u16 addr)
  449. {
  450.    bit EA_SAVE = EA;                   // Preserve EA
  451.    char xdata * data pwrite;           // FLASH write pointer

  452.    EA = 0;                             // Disable interrupts
  453.    // change clock speed to slow, then restore later

  454.    VDM0CN = 0x80;                      // Enable VDD monitor
  455.        
  456.    RSTSRC |= 0x02;                      // enable VDD monitor as a reset source

  457.   
  458.    FLKEY  = 0xA5;                      // Key Sequence 1
  459.    FLKEY  = 0xF1;                      // Key Sequence 2
  460.    PSCTL |= 0x03;                      // PSWE = 1; PSEE = 1


  461.    VDM0CN = 0x80;                      // Enable VDD monitor

  462.    RSTSRC |= 0x02;                      // Enable VDD monitor as a reset source

  463.    pwrite = (char xdata *) addr;

  464.    VDM0CN = 0x80;                      // Enable VDD monitor
  465.        
  466.    *pwrite = 0;                        // Initiate page erase

  467.    PSCTL &= ~0x03;                     // PSWE = 0; PSEE = 0

  468.    EA = EA_SAVE;                       // Restore interrupts
  469. }
  470. /********************************************************************
  471. 读寄存器值
  472. ********************************************************************/
  473. u8 FLASH_ByteRead (u16 addr)
  474. {
  475.    bit EA_SAVE = EA;                   // Preserve EA
  476.    char code * data pread;             // FLASH read pointer
  477.    unsigned char byte;

  478.    EA = 0;                             // Disable interrupts

  479.    pread = (char code *) addr;

  480.    byte = *pread;                      // Read the byte

  481.    EA = EA_SAVE;                       // Restore interrupts

  482.    return byte;
  483. }
  484. /************************************************************
  485. Flash写
  486. ************************************************************/
  487. void FLASH_ByteWrite (u16 addr, u8 byte)
  488. {
  489.    bit EA_SAVE = EA;                   // Preserve EA
  490.    char xdata * data pwrite;           // FLASH write pointer

  491.    EA = 0;                             // Disable interrupts

  492.    // change clock speed to slow, then restore later

  493.    VDM0CN = 0x80;                      // Enable VDD monitor

  494.    RSTSRC |= 0x02;                      // Enable VDD monitor as a reset source

  495.    pwrite = (char xdata *) addr;

  496.    PFE0CN &= 0XFE;                //设定单字节写入FLASH方式

  497.    PSCTL |= 0x01;                      // PSWE = 1
  498.    FLKEY  = 0xA5;                      // Key Sequence 1
  499.    FLKEY  = 0xF1;                      // Key Sequence 2

  500.    VDM0CN = 0x80;                      // Enable VDD monitor


  501.    RSTSRC |= 0x02;                      // Enable VDD monitor as a reset source

  502.    VDM0CN = 0x80;                      // Enable VDD monitor

  503.    *pwrite = byte;                     // Write the byte

  504.    PSCTL &= ~0x01;                     // PSWE = 0

  505.    EA = EA_SAVE;                       // Restore interrupts
  506. }

复制代码

0.png

所有资料51hei提供下载:
340.zip (51.69 KB, 下载次数: 52)
回复

使用道具 举报

ID:171556 发表于 2018-7-12 01:14 | 显示全部楼层
正好需要。。。。。。。。。。。。。。。。。。。。。。。。。
回复

使用道具 举报

ID:368583 发表于 2018-8-12 10:31 | 显示全部楼层
需要。。。。。。。。。。。。。。。。。。。。。。。
回复

使用道具 举报

ID:63317 发表于 2018-8-12 12:07 | 显示全部楼层
谢谢分享资料
回复

使用道具 举报

ID:33455 发表于 2020-10-29 14:42 | 显示全部楼层
请问这个怎么能移植到c51单片机上用来控制变频器
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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