可用串口調試
單片機源程序如下:
- #include "stc15w.h"
- //typedef unsigned char BYTE;
- //typedef unsigned int WORD;
- #define FOSC 11059200L //系統頻率
- #define BAUD 115200 //串口波特率
- #define NONE_PARITY 0 //無校驗
- #define ODD_PARITY 1 //奇校驗
- #define EVEN_PARITY 2 //偶校驗
- #define MARK_PARITY 3 //標記校驗
- #define SPACE_PARITY 4 //空白校驗
- #define PARITYBIT NONE_PARITY //定義校驗位
- #define CCP_S0 0x00 //P_SW1.4
- #define CCP_S1 0x00 //P_SW1.5
- #define S1_S0 0x40 //P_SW1.6
- #define S1_S1 0x80 //P_SW1.7
- u8 cnt=0;
- u8 TX_BUF[6]={0};
- u16 count0=0;
- u16 count1=0;
- u16 length=0;
- //BYTE cnt; //存儲PCA計時溢出次數
- //DWORD count0; //記錄上一次的捕獲值
- //DWORD count1; //記錄本次的捕獲值
- //DWORD length; //存儲信號的時間長度(count1 - count0)
- bit busy;
- void SendData(u8 dat);
- void SendString(char *s);
- void delay_us(u16 t)
- {
- u8 i;
- while(t--)
- {
- _nop_();
- _nop_();
- i = 1;
- while (--i);
- }
- }
- void delay_ms(u16 t)
- {
- while(t--)
- {
- // CLRWDT;
- delay_us(1000);
- }
- }
- void PCA_config(void)
- {
- P1M0 = 0x00;
- P1M1 = 0x00;
- P_SW1 |=0x00 ; //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)
- CCON = 0; //初始化PCA控制寄存器
- //PCA定時器停止
- //清除CF標志
- //清除模塊中斷標志
- CL = 0; //復位PCA寄存器
- CH = 0;
- CCAP0L = 0;
- CCAP0H = 0;
- CMOD = 0x09; //設置PCA時鐘源為系統時鐘,且使能PCA計時溢出中斷
- CCAPM0 = 0x21; //PCA模塊0為16位捕獲模式(上升沿捕獲,可測從高電平開始的整個周期),且產生捕獲中斷
- // CCAPM0 = 0x11; //PCA模塊0為16位捕獲模式(下降沿捕獲,可測從低電平開始的整個周期),且產生捕獲中斷
- // CCAPM0 = 0x31; //PCA模塊0為16位捕獲模式(上升沿/下降沿捕獲,可測高電平或者低電平寬度),且產生捕獲中斷
- CR = 1; //PCA定時器開始工作
- EA = 1;
- cnt = 0;
- count0 = 0;
- count1 = 0;
- }
- /*----------------------------
- PCA 中斷服務程序
- -----------------------------*/
- void PCA_isr() interrupt 7
- {
- if (CCF0)
- {
- CCF0 = 0;
- if (CF && ((CCAP0H & 0x80) == 0))
- {
- CF = 0;
- cnt++;
- }
- count0 = count1; //備份上一次的捕獲值
- ((u8 *)&count1)[3] = CCAP0L; //保存本次的捕獲值
- ((u8 *)&count1)[2] = CCAP0H;
- ((u8 *)&count1)[1] = cnt;
- ((u8 *)&count1)[0] = 0;
- length = count1 - count0; //計算兩次捕獲的差值,即得到時間長度
- ((u8 *)&length)[0] = 0;
- }
- if (CF)
- {
- CF = 0;
- cnt++; //PCA計時溢出次數+1
- }
- }
- /*----------------------------
- UART 中斷服務程序
- -----------------------------*/
- void Uart() interrupt 4 using 1
- {
- if (RI)
- {
- RI = 0; //清除RI位
- P0 = SBUF; //P0顯示串口數據
- }
- if (TI)
- {
- TI = 0; //清除TI位
- busy = 0; //清忙標志
- }
- }
- /*----------------------------
- 發送串口數據
- ----------------------------*/
- void SendData(u8 dat)
- {
- while (busy); //等待前面的數據發送完成
- ACC = dat; //獲取校驗位P (PSW.0)
- if (P) //根據P來設置校驗位
- {
- #if (PARITYBIT == ODD_PARITY)
- TB8 = 0; //設置校驗位為0
- #elif (PARITYBIT == EVEN_PARITY)
- TB8 = 1; //設置校驗位為1
- #endif
- }
- else
- {
- #if (PARITYBIT == ODD_PARITY)
- TB8 = 1; //設置校驗位為1
- #elif (PARITYBIT == EVEN_PARITY)
- TB8 = 0; //設置校驗位為0
- #endif
- }
- busy = 1;
- SBUF = ACC; //寫數據到UART數據寄存器
- }
- /*----------------------------
- 發送字符串
- ----------------------------*/
- void SendString(char *s)
- {
- while (*s) //檢測字符串結束標志
- {
- SendData(*s++); //發送當前字符
- }
- }
- /* 整型數轉換為字符串,str-字符串指針,dat-待轉換數,返回值-字符串長度 */
- u8 Int_To_String(u8 *str, int dat)
- {
- u8 i = 0;
- u8 len = 0;
- u8 buf[6];
-
- if (dat < 0) //如果為負數,首先取絕對值,并在指針上添加負號
- {
- dat = -dat;
- *str++ = '-';
- len++;
- }
- do { //先轉換為低位在前的十進制數組
- buf[i++] = dat % 10;
- dat /= 10;
- } while (dat > 0);
- len += i; //i最后的值就是有效字符的個數
- while (i-- > 0) //將數組值轉換為ASCII碼反向拷貝到接收指針上
- {
- *str++ = buf[i] + '0';
- }
- *str = '\0'; //添加字符串結束符
-
- return len; //返回字符串長度
- }
- void main()
- {
-
- // ACC = P_SW1;
- // ACC &= ~(S1_S0 | S1_S1); //S1_S0=0 S1_S1=0
- P_SW1 = 0x00; //(P3.0/RxD, P3.1/TxD)
- #if (PARITYBIT == NONE_PARITY)
- SCON = 0x50; //8位可變波特率
- #elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
- SCON = 0xda; //9位可變波特率,校驗位初始為1
- #elif (PARITYBIT == SPACE_PARITY)
- SCON = 0xd2; //9位可變波特率,校驗位初始為0
- #endif
- T2L = (65536 - (FOSC/4/BAUD)); //設置波特率重裝值
- T2H = (65536 - (FOSC/4/BAUD))>>8;
- AUXR = 0x14; //T2為1T模式, 并啟動定時器2
- AUXR |= 0x01; //選擇定時器2為串口1的波特率發生器
- ES = 1; //使能串口1中斷
- EA = 1;
- PCA_config();
- SendString("STC15W408AS\r\nUart Test !\r\n");
- while(1)
- {
- SendString("時間間隔為:");
- Int_To_String(TX_BUF,length);
- SendString("\r\n");
- delay_ms(300);
- }
- }
復制代碼
所有資料51hei提供下載:
串口.zip
(52.55 KB, 下載次數: 149)
2020-1-10 08:45 上傳
點擊文件名下載附件
串口接上可用,注意tx,rx接法 下載積分: 黑幣 -5
|