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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6914|回復: 2
打印 上一主題 下一主題
收起左側

stc15w408as串口可用程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:437179 發表于 2020-1-10 08:45 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
可用串口調試

單片機源程序如下:
  1. #include "stc15w.h"


  2. //typedef unsigned char BYTE;
  3. //typedef unsigned int WORD;

  4. #define FOSC 11059200L          //系統頻率
  5. #define BAUD 115200             //串口波特率

  6. #define NONE_PARITY     0       //無校驗
  7. #define ODD_PARITY      1       //奇校驗
  8. #define EVEN_PARITY     2       //偶校驗
  9. #define MARK_PARITY     3       //標記校驗
  10. #define SPACE_PARITY    4       //空白校驗

  11. #define PARITYBIT NONE_PARITY   //定義校驗位
  12. #define CCP_S0 0x00                 //P_SW1.4
  13. #define CCP_S1 0x00                 //P_SW1.5

  14. #define S1_S0 0x40              //P_SW1.6
  15. #define S1_S1 0x80              //P_SW1.7
  16. u8 cnt=0;
  17. u8 TX_BUF[6]={0};
  18. u16 count0=0;
  19. u16 count1=0;
  20. u16 length=0;
  21. //BYTE cnt;                           //存儲PCA計時溢出次數
  22. //DWORD count0;                       //記錄上一次的捕獲值
  23. //DWORD count1;                       //記錄本次的捕獲值
  24. //DWORD length;                       //存儲信號的時間長度(count1 - count0)

  25. bit busy;

  26. void SendData(u8 dat);
  27. void SendString(char *s);
  28. void delay_us(u16 t)
  29. {
  30.    u8 i;
  31.    while(t--)
  32.    {
  33.                 _nop_();
  34.                 _nop_();
  35.                 i = 1;
  36.                 while (--i);   
  37.    }
  38. }
  39. void delay_ms(u16 t)
  40. {
  41.    while(t--)
  42.    {
  43. //      CLRWDT;
  44.       delay_us(1000);
  45.    }
  46. }
  47. void PCA_config(void)
  48. {
  49.         P1M0 = 0x00;
  50.     P1M1 = 0x00;
  51.     P_SW1 |=0x00 ;                    //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)
  52.     CCON = 0;                       //初始化PCA控制寄存器
  53.                                     //PCA定時器停止
  54.                                     //清除CF標志
  55.                                     //清除模塊中斷標志
  56.     CL = 0;                         //復位PCA寄存器
  57.     CH = 0;
  58.     CCAP0L = 0;
  59.     CCAP0H = 0;
  60.     CMOD = 0x09;                    //設置PCA時鐘源為系統時鐘,且使能PCA計時溢出中斷
  61.     CCAPM0 = 0x21;                  //PCA模塊0為16位捕獲模式(上升沿捕獲,可測從高電平開始的整個周期),且產生捕獲中斷
  62. //  CCAPM0 = 0x11;                  //PCA模塊0為16位捕獲模式(下降沿捕獲,可測從低電平開始的整個周期),且產生捕獲中斷
  63. //  CCAPM0 = 0x31;                  //PCA模塊0為16位捕獲模式(上升沿/下降沿捕獲,可測高電平或者低電平寬度),且產生捕獲中斷
  64.     CR = 1;                         //PCA定時器開始工作
  65.     EA = 1;

  66.     cnt = 0;
  67.     count0 = 0;
  68.     count1 = 0;
  69. }
  70. /*----------------------------
  71. PCA 中斷服務程序
  72. -----------------------------*/
  73. void PCA_isr() interrupt 7
  74. {
  75.     if (CCF0)
  76.     {
  77.         CCF0 = 0;
  78.         if (CF && ((CCAP0H & 0x80) == 0))
  79.         {
  80.             CF = 0;
  81.             cnt++;
  82.         }
  83.         count0 = count1;            //備份上一次的捕獲值
  84.         ((u8 *)&count1)[3] = CCAP0L;  //保存本次的捕獲值
  85.         ((u8 *)&count1)[2] = CCAP0H;
  86.         ((u8 *)&count1)[1] = cnt;
  87.         ((u8 *)&count1)[0] = 0;
  88.         length = count1 - count0;   //計算兩次捕獲的差值,即得到時間長度
  89.         ((u8 *)&length)[0] = 0;
  90.     }
  91.     if (CF)
  92.     {
  93.         CF = 0;
  94.         cnt++;                      //PCA計時溢出次數+1
  95.     }
  96. }
  97. /*----------------------------
  98. UART 中斷服務程序
  99. -----------------------------*/
  100. void Uart() interrupt 4 using 1
  101. {
  102.     if (RI)
  103.     {
  104.         RI = 0;                 //清除RI位
  105.         P0 = SBUF;              //P0顯示串口數據

  106.     }
  107.     if (TI)
  108.     {
  109.         TI = 0;                 //清除TI位
  110.         busy = 0;               //清忙標志
  111.     }
  112. }

  113. /*----------------------------
  114. 發送串口數據
  115. ----------------------------*/
  116. void SendData(u8 dat)
  117. {
  118.     while (busy);               //等待前面的數據發送完成
  119.     ACC = dat;                  //獲取校驗位P (PSW.0)
  120.     if (P)                      //根據P來設置校驗位
  121.     {
  122. #if (PARITYBIT == ODD_PARITY)
  123.         TB8 = 0;                //設置校驗位為0
  124. #elif (PARITYBIT == EVEN_PARITY)
  125.         TB8 = 1;                //設置校驗位為1
  126. #endif
  127.     }
  128.     else
  129.     {
  130. #if (PARITYBIT == ODD_PARITY)
  131.         TB8 = 1;                //設置校驗位為1
  132. #elif (PARITYBIT == EVEN_PARITY)
  133.         TB8 = 0;                //設置校驗位為0
  134. #endif
  135.     }
  136.     busy = 1;
  137.     SBUF = ACC;                 //寫數據到UART數據寄存器
  138. }

  139. /*----------------------------
  140. 發送字符串
  141. ----------------------------*/
  142. void SendString(char *s)
  143. {
  144.     while (*s)                  //檢測字符串結束標志
  145.     {
  146.         SendData(*s++);         //發送當前字符
  147.     }
  148. }
  149. /* 整型數轉換為字符串,str-字符串指針,dat-待轉換數,返回值-字符串長度 */
  150. u8 Int_To_String(u8 *str, int dat)
  151. {
  152.     u8 i = 0;
  153.     u8 len = 0;
  154.     u8 buf[6];
  155.    
  156.     if (dat < 0)  //如果為負數,首先取絕對值,并在指針上添加負號
  157.     {
  158.         dat = -dat;
  159.         *str++ = '-';
  160.         len++;
  161.     }
  162.     do {          //先轉換為低位在前的十進制數組
  163.         buf[i++] = dat % 10;
  164.         dat /= 10;
  165.     } while (dat > 0);
  166.     len += i;     //i最后的值就是有效字符的個數
  167.     while (i-- > 0)   //將數組值轉換為ASCII碼反向拷貝到接收指針上
  168.     {
  169.         *str++ = buf[i] + '0';
  170.     }
  171.     *str = '\0';  //添加字符串結束符
  172.    
  173.     return len;   //返回字符串長度
  174. }
  175. void main()
  176. {
  177.        
  178. //    ACC = P_SW1;
  179. //    ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=0
  180.     P_SW1 = 0x00;                //(P3.0/RxD, P3.1/TxD)
  181. #if (PARITYBIT == NONE_PARITY)
  182.     SCON = 0x50;                //8位可變波特率
  183. #elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
  184.     SCON = 0xda;                //9位可變波特率,校驗位初始為1
  185. #elif (PARITYBIT == SPACE_PARITY)
  186.     SCON = 0xd2;                //9位可變波特率,校驗位初始為0
  187. #endif

  188.     T2L = (65536 - (FOSC/4/BAUD));   //設置波特率重裝值
  189.     T2H = (65536 - (FOSC/4/BAUD))>>8;
  190.     AUXR = 0x14;                //T2為1T模式, 并啟動定時器2
  191.     AUXR |= 0x01;               //選擇定時器2為串口1的波特率發生器
  192.     ES = 1;                     //使能串口1中斷
  193.     EA = 1;
  194.         PCA_config();
  195.     SendString("STC15W408AS\r\nUart Test !\r\n");
  196.     while(1)
  197.         {
  198.                 SendString("時間間隔為:");
  199.                 Int_To_String(TX_BUF,length);
  200.                 SendString("\r\n");
  201.                 delay_ms(300);       
  202.         }

  203. }
復制代碼

所有資料51hei提供下載:
串口.zip (52.55 KB, 下載次數: 149)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:631012 發表于 2020-12-30 06:11 | 只看該作者
多謝,老兄的源碼,多路繼電器成功了。
回復

使用道具 舉報

板凳
ID:361216 發表于 2022-6-15 14:42 | 只看該作者
謝謝,先試試來看。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久中文一区二区 | 国产欧美视频一区二区三区 | 日韩欧美网 | 国产福利在线 | 国产在线a | 欧美成人a| 五月综合激情婷婷 | 欧美日韩一区精品 | 一区二区三区免费 | 日韩av一区二区在线观看 | 亚洲午夜精品一区二区三区他趣 | 国产欧美一区二区三区在线看 | 手机看片169 | 特级毛片爽www免费版 | 国产一区二区在线视频 | 中文字幕av高清 | 欧美一区二 | 日韩中文在线视频 | www.干| 啪视频在线| 欧美极品在线观看 | 亚洲欧美自拍偷拍视频 | 亚洲成人一区二区 | 国产精品一卡二卡三卡 | 国产精品黄视频 | 精品国产一区二区三区久久 | 91精品国产综合久久久久久丝袜 | 九九视频网 | 国产一级在线观看 | a级片在线观看 | 午夜视频一区二区 | 国产精品久久7777777 | 日韩小视频在线 | 麻豆91av| 久草视| 在线免费毛片 | 一区二区三区久久 | 国产免费一区二区 | 欧美一区二区三区在线观看视频 | 一区二区欧美在线 | 国产日韩一区二区 |