久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7527|回復: 3
收起左側

STC單片機ISP-Demo-使用Y-Modem協議源碼與庫函數分享

  [復制鏈接]
ID:342442 發表于 2018-10-13 15:50 | 顯示全部樓層 |閱讀模式
0.png
0.png
MCU的ISP程序完全用C語言編寫,接收Ymodem協議時忽略CRC16 校驗,用戶可以向己加上。當然,用戶可以完全自己定義協議,更改接收程序來獲得自己獨一無二的下載協議。關于Ymodem協議的相關知識,用戶可以向己上網搜索,資料很多。
原則上,用戶程序不需要知道具體ISP程序的實際地址,滿足一定條件時復位到用戶入口即可。但是用戶程序的長度不可以超過ISP占用的部分。 本例程,ISP定位在0xE400用戶程序可以寫到57K-3字節。0xE3FD、0xE30xE3FF這3個字節,被ISP存放用戶程序的入口指令。用超級終端下載時, 如果用戶程序超過0xE3FC, ISP會停止執行下載。
本文以宏晶科技的IAP12C5A60S2和IAP15F2K61S2為例,詳細說明使用宏晶科技的IAP單片機開發用戶自己的ISP程序的方法,并給出了基于keil的匯編和c源代碼
0.png

FLASH空間中,從地址0000H開始的連續57K-3字節的空間為用戶程序區。當滿足特定的下載條件時,需要用戶將MCU復位到用戶如成入口,執行IAP_CONTR=0x20即可,此時可對用戶程序區進行擦除和改寫,以達到更新用戶程序的目的。
0.png
三.下位機固件程序說明

下位機固件程序包括兩部分:ISP(ISP代碼)和AP(用戶代碼)*ISP代碼向成一體,用戶不需要調用ISP,軟件復位總會先運行ISP。兩種方式進入ISP:
1、超級終端,鍵盤為小寫狀態,按下字母d鍵,給MCU上電,MCU檢測到10個字母(1,就會進入ISP。
2、用戶程序中,串口連續接收到字母d,超過10個就執行IAP_CONTR=0x20復位到ISP。

*用戶代碼

用戶代碼可以使用C或者匯編語言編寫,但對于匯編代碼需要注意一點:位于0000H的復位入口地址處的指令必須是一個長跳轉語句(類似LJMP START)。在用戶代碼中,需要設置好串口,并在串口連續接收到字母d,超過10個就執行IAP_CONTR=0x20復位到ISP。具體細節請參考附件中的代碼。


ISP程序在編譯時,要設置一下,見下閣:
0.png

0.jpg

STC_IAP_ISP監控程序
  1. #define MAIN_Fosc                22118400L        //定義主時鐘
  2. #define Baudrate0                115200UL        //串口0波特率600~115200

  3. #include        "STC15Fxxxx.H"
  4. #include        "ymodem.h"


  5. #define        WDT_Enable        0                        //1: 允許內部看門狗,        0: 禁止
  6. #define D_BRT0_1T_8bit                (256 - MAIN_Fosc / 32 / Baudrate0)        //計算波特率        1T  8bit



  7. #define        ISP_ADDRESS                0xE400                                //ISP開始地址, 高地址必須是偶數, 注意要預留ISP空間,本例程留3K
  8. #define        UserflashLenth         (ISP_ADDRESS-3)                //用戶FLASH長度, 保留個字節存放用戶地址程序的跳轉地址


  9. /*************        本地變量聲明        **************/

  10. typedef                void (*pFunction)(void);
  11. pFunction        Jump_To_Application;
  12. u16                        JumpAddress;

  13. u16                FileLength;
  14. u16                Y_TimeOut,WaitTime;
  15. u8                packets_received, session_begin;
  16. u8                idata file_name[FILE_NAME_LENGTH];
  17. u8                idata file_size[FILE_SIZE_LENGTH];
  18. u8                StartCode[3];
  19. u16                FlashDestination;
  20. u16                RxCnt;
  21. u8                HandCnt;
  22. u8        xdata        RxBuff[1024];
  23. u8        idata        RxBuff_10[10];

  24. u32                DownCheckSum,FlashCheckSum;

  25. /*************        本地函數聲明        **************/
  26. u8                Hex2Ascii(u8 dat);
  27. u8                UART_Download(void);
  28. u16                Str2Int(u8 *inputstr);
  29. void        ISP_WriteByte(u16 addr, u8 dat);
  30. void        ISP_EraseSector(u16 addr);
  31. u8        ISP_ReadByte(u16 addr);




  32. //========================================================================
  33. // 函數: void        TX1_write2buff(u8 dat)
  34. // 描述: 串口發送一個字節.
  35. // 參數: dat: 要發送的字節.
  36. // 返回: none.
  37. // 版本: V1.0, 2013-4-29
  38. //========================================================================
  39. void        TX1_write2buff(u8 dat)
  40. {
  41.         TI = 0;
  42.         SBUF = dat;
  43.         while(!TI);
  44. }

  45. //========================================================================
  46. // 函數: void        PrintString1(u8 *p)
  47. // 描述: 串口發送一個字符串.
  48. // 參數: *p: 要發送的字符串指針.
  49. // 返回: none.
  50. // 版本: V1.0, 2013-4-29
  51. //========================================================================
  52. void        PrintString1(u8 *p)
  53. {
  54.         for(; *p > 0; p++)        TX1_write2buff(*p);
  55. }

  56. //========================================================================
  57. // 函數: void        Tx_DEC_U16(u16 j)
  58. // 描述: 把一個16位整型數轉成十進制送串口發送.
  59. // 參數: j: 要處理的16位整型數.
  60. // 返回: none.
  61. // 版本: V1.0, 2013-4-29
  62. //========================================================================
  63. void        Tx_DEC_U16(u16 j)
  64. {
  65.         u8        i;
  66.         u8        tmp[10];
  67.         for(i=4; i<5; i--)        tmp[i] = j % 10 + '0',        j = j / 10;
  68.         for(i=0; i<4; i++)
  69.         {
  70.                 if(tmp[i] != '0')        break;
  71.                 tmp[i] = ' ';
  72.         }
  73.         for(i=0; i<5; i++)        TX1_write2buff(tmp[i]);
  74. }

  75. //========================================================================
  76. // 函數: void        Tx_HEX_U32(u32 j)
  77. // 描述: 把一個32位長整型數轉成十進制送串口發送.
  78. // 參數: j: 要處理的32位整型數.
  79. // 返回: none.
  80. // 版本: V1.0, 2013-4-29
  81. //========================================================================
  82. void        Tx_HEX_U32(u32 j)
  83. {
  84.         u8        i,k;
  85.         u8        tmp[10];
  86.         for(i=8; i>0; i--)
  87.         {
  88.                 k = ((u8)j) & 0x0f;
  89.                 if(k <= 9)        tmp[i] = k+'0';
  90.                 else                tmp[i] = k-10+'A';
  91.                 j >>= 4;
  92.         }
  93.         for(i=1; i<9; i++)        TX1_write2buff(tmp[i]);
  94. }


  95. //========================================================================
  96. // 函數: void        ReturnNameAndLength(void)
  97. // 描述: 返回程序的文件名和長度, 和累加校驗和.
  98. // 參數: none.
  99. // 返回: none.
  100. // 版本: V1.0, 2013-4-29
  101. //========================================================================
  102. void        ReturnNameAndLength(void)
  103. {
  104.         u16        i;
  105.         PrintString1("================================\r\n File name:     ");
  106.         for(i=0; i<FILE_NAME_LENGTH; i++)       
  107.         {
  108.                 if(file_name[i] == 0)        break;
  109.                 TX1_write2buff(file_name[i]);
  110.         }
  111.         PrintString1("\r\n File length:   ");
  112.         Tx_DEC_U16(FileLength);
  113.         PrintString1(" Bytes\r\n DownChexkSum:  ");
  114.         Tx_HEX_U32(DownCheckSum);
  115.         PrintString1("\r\n ISP Versiom:   2013-4-30 by Coody");
  116.         PrintString1("\r\n================================\r\n\r\n");
  117. }

  118. //========================================================================
  119. // 函數: void        UART1_RxPackage(void)
  120. // 描述: 串口接收一個數據塊.
  121. // 參數: none.
  122. // 返回: none.
  123. // 版本: V1.0, 2013-4-29
  124. //========================================================================
  125. void        UART1_RxPackage(void)
  126. {
  127.         u16        j;        //5ms超時
  128. //        RI = 0;
  129.         RxCnt = 0;
  130.         for(j = 0;        j < 5000; j++)        //最后收到一個字節5ms后,超時退出
  131.         {
  132.                 if(RI)
  133.                 {
  134.                         RI = 0;
  135.                         if(RxCnt < 1024)        RxBuff[RxCnt] = SBUF;
  136.                         else
  137.                         {
  138.                                 RxBuff_10[RxCnt-1024] = SBUF;
  139.                         }
  140.                         if(++RxCnt >= 1034)        RxCnt = 1033;
  141.                         j = 0;        //重新定時5ms
  142.                 }
  143.         }
  144.         #if (WDT_Enable > 0)
  145.                 WDT_reset(D_WDT_SCALE_256);
  146.         #endif
  147. }

  148. //========================================================================
  149. // 函數: void        main(void)
  150. // 描述: 主函數.
  151. // 參數: none.
  152. // 返回: none.
  153. // 版本: V1.0, 2013-4-29
  154. //========================================================================
  155. void        main(void)
  156. {
  157.         u8        i;

  158.         EA = 0;
  159.         Timer0_Stop();
  160.         Timer1_Stop();
  161.         #if (WDT_Enable > 0)
  162.                 WDT_reset(D_WDT_SCALE_256);
  163.         #endif

  164.         S1_8bit();
  165.         S1_RX_Enable();
  166.         S1_BRT_UseTimer1();
  167.         Timer1_AsTimer();
  168.         Timer1_1T();
  169.         Timer1_8bitAutoReload();
  170.         Timer1_InterruptDisable();
  171.         TH1 = D_BRT0_1T_8bit;
  172.         Timer1_Run();

  173. //        PrintString1("\r\n STC ISP Demo\r\n");
  174.        
  175.         while(1)
  176.         {
  177.         //        TX1_write2buff('A');
  178.                 HandCnt = 0;
  179.                 for(WaitTime = 0; WaitTime < 300; WaitTime++)                //1.5秒超時
  180.                 {
  181.                         UART1_RxPackage();
  182.                         if((RxCnt == 1) && (RxBuff[0] == 'd'))
  183.                         {
  184.                                 if(++HandCnt >= 10)
  185.                                 {
  186.                                         i = UART_Download();
  187.                                         WaitTime = 250;
  188.                                         if(i == 1)                        PrintString1("\r\n User abort!\r\n");
  189.                                         else if(i == 2)                PrintString1("\r\n PC Cancel!\r\n");
  190.                                         else if(i == 4)                PrintString1("\r\n Programming Error!\r\n");
  191.                                         else if(i == 0)
  192.                                         {
  193.                                                 PrintString1("\r\n\r\n Programming Completed Successfully!\r\n");
  194.                                                 ReturnNameAndLength();
  195.                                         }
  196.                                 }
  197.                         }
  198.                 //        else        HandCnt = 0;
  199.                 }

  200.                 if(ISP_ReadByte(ISP_ADDRESS-3) == 0x02)
  201.                 {
  202.             SCON = 0;
  203.                         AUXR = 0;
  204.             TMOD = 0;
  205.             TL0 = 0;
  206.             TH0 = 0;
  207.             TH1 = 0;
  208.             TL1 = 0;
  209.             TCON = 0;
  210.                         IAP_CMD = 0;

  211.                         JumpAddress = ISP_ReadByte(ISP_ADDRESS-2);
  212.                         JumpAddress = (JumpAddress << 8) | ISP_ReadByte(ISP_ADDRESS-1);        //Jump to user application
  213.                         Jump_To_Application = (pFunction) JumpAddress;
  214.                         Jump_To_Application();
  215.                 }
  216.                 PrintString1(" No AP\r\n");
  217.         }
  218. }



  219. //========================================================================
  220. // 函數: u16 Str2Int(u8 *inputstr)
  221. // 描述: 字符串轉整型.
  222. // 參數: *inputstr: 字符串指針.
  223. // 返回: 16位整型數.
  224. // 版本: V1.0, 2013-4-29
  225. //========================================================================
  226. u16 Str2Int(u8 *inputstr)
  227. {
  228.         u16        val;
  229.         u8        i;
  230.        
  231.         val = 0;
  232.         for (i = 0; i < 5; i++)
  233.         {
  234.                 if((inputstr[i] < '0') || (inputstr[i] > '9'))        break;
  235.                 val = val * 10 + inputstr[i] - '0';
  236.         }
  237.         return val;
  238. }

  239. //========================================================================
  240. // 函數: void        ISP_WriteByte(u16 addr, u8 dat)
  241. // 描述: 對一個地址寫FLASH一個字節.
  242. // 參數: addr: 16位FLASH地址.
  243. //       dat:  要寫入的一字節數據.
  244. // 返回: none.
  245. // 版本: V1.0, 2013-4-29
  246. //========================================================================
  247. void        ISP_WriteByte(u16 addr, u8 dat)
  248. {
  249.         IAP_CONTR = ISP_CONTR = (ISP_EN + ISP_WAIT_FREQUENCY);        //使能IAP功能
  250.         ISP_WRITE();                        //編程命令
  251.         IAP_ADDRL = addr;
  252.         IAP_ADDRH = addr >> 8;
  253.         IAP_DATA  = dat;                //將當前數據送IAP數據寄存器
  254.         ISP_TRIG();                                //觸發ISP命令
  255. }

  256. //========================================================================
  257. // 函數: u8        ISP_ReadByte(u16 addr)
  258. // 描述: 從一個地址讀FLASH一個字節.
  259. // 參數: addr: 16位FLASH地址.
  260. // 返回: 讀出的一字節數據.
  261. // 版本: V1.0, 2013-4-29
  262. //========================================================================
  263. u8        ISP_ReadByte(u16 addr)
  264. {
  265.         IAP_CONTR = ISP_CONTR = (ISP_EN + ISP_WAIT_FREQUENCY);        //使能IAP功能
  266.         ISP_READ();                        //編程命令
  267.         IAP_ADDRL = addr;
  268.         IAP_ADDRH = addr >> 8;
  269.         ISP_TRIG();                                //觸發ISP命令
  270.         return(IAP_DATA);
  271. }

  272. //========================================================================
  273. // 函數: void        ISP_EraseSector(u16 addr)
  274. // 描述: 對FLASH擦除一個扇區.
  275. // 參數: addr: 16位FLASH地址.
  276. // 返回: none.
  277. // 版本: V1.0, 2013-4-29
  278. //========================================================================
  279. void        ISP_EraseSector(u16 addr)
  280. {
  281.         IAP_CONTR = ISP_CONTR = (ISP_EN + ISP_WAIT_FREQUENCY);                //使能IAP功能
  282.         ISP_ERASE();                                //擦除命令
  283.         IAP_ADDRL = addr;
  284.         IAP_ADDRH = addr >> 8;
  285.         ISP_TRIG();                                //觸發ISP命令
  286. }

  287. //========================================================================
  288. // 函數: u8        UART_Download(void)
  289. // 描述: 按Ymodem接收文件數據并寫入用戶FLASH.
  290. // 參數: none.
  291. // 返回: none.
  292. // 版本: V1.0, 2013-4-29
  293. //========================================================================
  294. u8        UART_Download(void)
  295. {
  296.         u16        i;
  297.         u8        j;

  298.         PrintString1("\r\n\r\n Waiting for the file to be sent ... (press 'a' to abort)\r\n");
  299.        
  300.         Y_TimeOut = 0;
  301.         packets_received = 0;
  302.         session_begin = 0;
  303.         WaitTime = 40;
  304.         DownCheckSum = 0;
  305.        
  306.         while(WaitTime > 0)
  307.         {
  308.                 if(Y_TimeOut == 0)
  309.                 {
  310.                         TX1_write2buff(CRC16);
  311.                         Y_TimeOut = 300;
  312.                         if(WaitTime > 0) WaitTime--;
  313.                 }

  314.                 while(Y_TimeOut > 0)
  315.                 {
  316.                         UART1_RxPackage();
  317.                         if(RxCnt == 0)        Y_TimeOut--;
  318.                         else
  319.                         {
  320.                                 if(RxCnt == 1)
  321.                                 {
  322.                                         if(RxBuff[0] == EOT)
  323.                                         {
  324.                                                 TX1_write2buff(ACK);
  325.                                                 Y_TimeOut = 40;
  326.                                         }
  327.                                         else if((RxBuff[0] == ABORT1) || (RxBuff[0] == ABORT2))
  328.                                         {
  329.                                                 return 1;
  330.                                         }
  331.                                 }
  332.                                 else if(RxCnt <= 5)
  333.                                 {
  334.                                         if((RxBuff[0] == CANCEL) && (RxBuff[1] == CANCEL))
  335.                                         {
  336.                                                 return 2;
  337.                                         }
  338.                                 }
  339.                                 else if((RxCnt == 133) || (RxCnt == 1029))
  340.                                 {
  341.                                         if (RxBuff[PACKET_SEQNO_INDEX] != (RxBuff[PACKET_SEQNO_COMP_INDEX] ^ 0xff))
  342.                                         {
  343.                                                 TX1_write2buff(NAK);        //錯誤, 請求重發
  344.                                                 Y_TimeOut = 300;
  345.                                         }
  346.                                         else
  347.                                         {
  348.                                                 WaitTime = 5;
  349.                                                 if (packets_received == 0)        //發送序號為0, 為文件名數據包
  350.                                                 {
  351.                                                         if (RxBuff[PACKET_HEADER] != 0)  //文件名不為空
  352.                                                         {
  353.                                                                 for (i = 0; i < FILE_NAME_LENGTH; i++)        file_name[i] = 0;
  354.                                                                 for (i = 0; i < FILE_SIZE_LENGTH; i++)        file_size[i] = 0;
  355.                                                                 j = PACKET_HEADER;
  356.                                                                 for (i = 0; (i < FILE_NAME_LENGTH) && (RxBuff[j] != 0); i++)
  357.                                                                         file_name[i] = RxBuff[j++];                //保存文件名

  358.                                                                 for (i=0, j++; (RxBuff[j] != ' ') && (i < FILE_SIZE_LENGTH); i++)
  359.                                                                         file_size[i] = RxBuff[j++];        //保存文件長度
  360.                                                                 FileLength = Str2Int(file_size);        //文件長度由字符串轉成十六進制數據

  361.                                                                 if (FileLength >= UserflashLenth)        //長度過長錯誤
  362.                                                                 {
  363.                                                                         TX1_write2buff(CANCEL);        //錯誤返回2個 CA
  364.                                                                         TX1_write2buff(CANCEL);
  365.                                                                         return 3;                //長度過長
  366.                                                                 }
  367.                                                                
  368.                                                                 StartCode[0] = ISP_ReadByte(0);        //保存ISP跳轉地址
  369.                                                                 StartCode[1] = ISP_ReadByte(1);
  370.                                                                 StartCode[2] = ISP_ReadByte(2);
  371.                                                                 ISP_EraseSector(0);
  372.                                                                 ISP_WriteByte(0,StartCode[0]);        //回寫ISP跳轉地址
  373.                                                                 ISP_WriteByte(1,StartCode[1]);
  374.                                                                 ISP_WriteByte(2,StartCode[2]);
  375.                                                                 for(i=0x200; i < UserflashLenth; i+=0x200)        //擦除N頁
  376.                                                                         ISP_EraseSector(i);
  377.                                                        
  378.                                                                 TX1_write2buff(ACK);        //擦除完成, 返回應答
  379.                                                                 Y_TimeOut = 40;
  380.                                                                 packets_received ++;
  381.                                                                 session_begin = 1;
  382.                                                                 FlashDestination = 0;
  383.                                                                 DownCheckSum = 0;
  384.                                                         }
  385.                                                 }

  386.                                                 else if(session_begin == 1)        //收過文件名
  387.                                                 {
  388.                                                         if(RxBuff[PACKET_SEQNO_INDEX] == 0)        //全0數據幀
  389.                                                         {
  390.                                                                 ISP_WriteByte(ISP_ADDRESS-3,StartCode[0]);        //全部下載結束,最后寫用戶入口地址
  391.                                                                 ISP_WriteByte(ISP_ADDRESS-2,StartCode[1]);
  392.                                                                 ISP_WriteByte(ISP_ADDRESS-1,StartCode[2]);
  393.                                                                 TX1_write2buff(ACK);
  394.                                                                
  395.                                                                 FlashCheckSum  = ISP_ReadByte(ISP_ADDRESS-3);
  396.                                                                 FlashCheckSum += ISP_ReadByte(ISP_ADDRESS-2);
  397.                                                                 FlashCheckSum += ISP_ReadByte(ISP_ADDRESS-1);
  398.                                                                 for(i = 3;        i < FileLength; i++)        FlashCheckSum += ISP_ReadByte(i);        //計算FLASH累加和
  399.                                                                 if(FlashCheckSum == DownCheckSum)        return 0;        //正確
  400.                                                                 else
  401.                                                                 {
  402.                                                                         ISP_EraseSector(ISP_ADDRESS-0x200);
  403.                                                                         return 4;        //寫入錯誤
  404.                                                                 }
  405.                                                         }
  406.                                                         else        //數據幀
  407.                                                         {
  408.                                                                 for(i=0; i<1024; i++)        RxBuff[i] = RxBuff[i+3];
  409.                                                                 RxBuff[1021] = RxBuff_10[0];
  410.                                                                 RxBuff[1022] = RxBuff_10[1];
  411.                                                                 RxBuff[1023] = RxBuff_10[2];
  412.                                                                 RxCnt -= 5;
  413.                                                                 for(i = 0; (i < RxCnt) && (FlashDestination < FileLength); i++)
  414.                                                                 {
  415.                                                                         if(FlashDestination == 0)
  416.                                                                         {
  417.                                                                                 StartCode[0] = RxBuff[0];
  418.                                                                                 StartCode[1] = RxBuff[1];
  419.                                                                                 StartCode[2] = RxBuff[2];
  420.                                                                                 FlashDestination = 3;
  421.                                                                                 i += 3;
  422.                                                                                 DownCheckSum += RxBuff[0]; DownCheckSum += RxBuff[1]; DownCheckSum += RxBuff[2];
  423.                                                                         }
  424.                                                                         ISP_WriteByte(FlashDestination,RxBuff[i]);
  425.                                                                         DownCheckSum += RxBuff[i];
  426.                                                                         FlashDestination ++;
  427.                                                                 }
  428.                                                                 TX1_write2buff(ACK);        //保存完成, 返回應答
  429.                                                                 Y_TimeOut = 300;
  430.                                                                 packets_received ++;
  431.                                                         }
  432.                                                 }
  433.                                         }
  434.                                 }
  435.                         }
  436.                 }
  437.         }
  438.         return 100;        //其他錯誤
  439. }
復制代碼


用戶實際代碼范例
  1. /*------------------------------------------------------------------*/
  2. /* --- STC MCU International Limited -------------------------------*/
  3. /* --- STC IAP 系列單片機實現用戶ISP 演示程序 ----------------------*/
  4. /* 如果要在程序中使用或者在文章中引用該程序,請在程序中或文章中注明  */
  5. /* 使用了宏晶科技的資料或程序                                       */
  6. /*------------------------------------------------------------------*/

  7. #include "reg51.h"

  8. #define FOSC 22118400L                  //系統時鐘頻率
  9. #define BAUD (256 - FOSC/32/115200)     //定義串口波特率                要與IAP里的相同


  10. /* 定義串口相關SFR */
  11. sfr AUXR = 0x8E;                        //波特率發生器控制寄存器
  12. sfr ISP_CONTR = 0xC7;
  13. sfr PCON2     = 0x97;   //for IAP15F2K61S2
  14. sfr P_SW1     = 0xA2;   //for IAP15F2K61S2

  15. char HandCnt;                             //Isp_Check內部使用的變量

  16. void uart() interrupt 4         //串口中斷服務程序
  17. {
  18.     if (TI) TI = 0;                     //發送完成中斷
  19.     if (RI)                             //接收完成中斷
  20.     {
  21.         if (SBUF == 'd')
  22.         {
  23.             HandCnt++;
  24.             if (HandCnt >= 16)
  25.             {
  26.                 ISP_CONTR = 0x20;           //復位到AP入口
  27.             }
  28.         }
  29.         else        HandCnt = 0;
  30.         RI = 0;                         //清接收完成標志
  31.     }
  32. }

  33. void main()
  34. {
  35.     SCON = 0x50;                        //定義串口模式為8bit可變,無校驗位
  36.     AUXR = 0x40;                        //波特率發生器12倍速,并啟動波特率發生器定時器
  37.     TMOD = 0x20;                         //初始化波特率發生器定時器的定時初值

  38. //對于IAP15F2K61S2, 增加這兩句,串口1可以切換P30,P31
  39.            P_SW1 &= ~0xc0;                //S1_USE_P30P31();
  40.         PCON2 &= ~(1<<4);        //S1_TXD_RXD_OPEN();

  41.     TH1 = BAUD;
  42.         TR1 = 1;
  43.         ES = 1;                             //使能串口中斷
  44.     EA = 1;                             //打開全局中斷開關

  45.     while (1)
  46.     {
  47.         P1++;
  48.     }
  49. }
復制代碼

0.png


全部資料51hei下載地址:

STC庫函數使用參考.pdf (152.17 KB, 下載次數: 43)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:449599 發表于 2019-12-11 20:53 來自手機 | 顯示全部樓層
留個記號,這幾天要用
回復

使用道具 舉報

ID:655329 發表于 2019-12-11 21:13 | 顯示全部樓層
挺好的
回復

使用道具 舉報

ID:135723 發表于 2023-2-6 00:35 | 顯示全部樓層
有一定的參考意義。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩和的一区二区 | 久久久久久av | 一区二区精品视频 | 精品一区国产 | 亚洲精品视频在线看 | 国产精品美女久久久久aⅴ国产馆 | 日韩av免费看 | 亚洲成av人影片在线观看 | 伊人春色在线 | 天天欧美 | 热久久久 | 最近免费日本视频在线 | 亚洲人成人一区二区在线观看 | 欧美精品首页 | 免费a大片 | 中文字幕不卡视频在线观看 | 亚洲一区二区久久 | 国产一区二区三区久久久久久久久 | 国产探花在线观看视频 | 亚洲午夜电影 | 日韩精品免费视频 | 午夜电影在线播放 | 亚洲激情一区二区 | 亚洲国产一区二区视频 | av片免费 | 91资源在线 | 特黄视频 | 国产网站在线免费观看 | 久久国产精品一区二区三区 | 日本在线免费看最新的电影 | 91亚洲精选 | 欧美精三区欧美精三区 | 色资源在线 | 91国内视频在线 | 国产精品免费一区二区三区四区 | 久久久精品一区二区三区 | 国产精品久久久久久久久 | 日本视频一区二区三区 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 91av在线免费| 韩日一区二区 |