1. 程式人生 > 實用技巧 >51串列埠除錯

51串列埠除錯

在用51玩一些感測器的時候,發現除錯起來很難看到資料,每次呼叫串列埠,都是很麻煩的,後來發現可以用printf和scanf來列印除錯資料,簡直方便得不要不要得,但是做出這個功能,自己百度了很多,踩了很多坑,現在解決了,也來這記錄一下,同樣也是分享給有緣人~

廢話不說,直接上程式碼,這個是我測試用的,我要寫得是一個判斷輸入字串功能的函式,要是不想看這個,看最後那個簡潔版就好

#include <stdio.h>   //加入這個就可以使用printf和scanf啦
#include <reg52.h>
#include <string.h>  //這個是我用於判定兩個字串函式的標頭檔案
char in_char[]={" "}; //沒想到吧,字串輸入重點在這裡,還是不可以有空格輸入,空格數量如果少,會出現自動列印輸出和亂碼 void InitUART(void)//使用定時器1作為串列埠波特率發生器 { TH1 = 0xf3; //晶振12M,,,,設定為2400,,,重中之重,如果是11.0592,,需要重新寫這個值,不然會亂碼 TL1 = TH1; TMOD |= 0x20; //定時器1方式2 SCON = 0x50; //串列埠接收使能 ES = 1
; //串列埠中斷使能 TR1 = 1; //定時器1使能 TI = 1; //傳送中斷標記位,必須設定 } //毫秒延時函式 void delay_ms(unsigned int t) { unsigned char a,b; while(t--) { for(b=102;b>0;b--) for(a=3;a>0;a--); } } //我當時是為了測試一點東西,才寫成函式的形式 void input() { scanf("%s",&in_char); //
& 這個在輸入字串的時候,不加也可以的,,但是要是輸入整型和單字元,,必須得加 } void main() { int i; char jay[]={"jay"}; InitUART(); //初始化串列埠 EA = 1; //開總中斷 printf("\n is begin \n"); for(i=0;i<5;i++) { printf("please input the char:"); input(); delay_ms(10); printf("\n the input is --->%s\n",in_char); //strcmp不能用,,用來程式直接沒有反應,不知道為啥 //strncmp是比較前n位 // if (strncmp(jay,in_char,3)==0) // { // printf("ok\n"); // } } printf("\n is done \n"); while(1); // for(i=0;i<3;i++) // { // scanf("%c",&a); // delay_ms(100); // printf("\nyour input is : %c\n",a); // if (a=='6') // { // printf("you are the best\n"); // } // } }

要是你是簡單的想使用printf和scanf,直接像下面這樣定義就好了 ,很簡單,主要就是要注意波特率的問題,就是把初始化串列埠那個函式複製過去,改一下波特率計算那個,記得加入標頭檔案,就可以使用這個printf來除錯列印資料了~~~~

#include <stdio.h>   //加入這個就可以使用printf和scanf啦
#include <reg52.h>
#include <string.h>  //這個是我用於判定兩個字串函式的標頭檔案

int a;

void InitUART(void)//使用定時器1作為串列埠波特率發生器
    
{
    
    TH1 = 0xf3;     //晶振12M,,,,設定為2400,,,重中之重,如果是11.0592,,需要重新寫這個值,不然會亂碼
    TL1 = TH1;
    TMOD |= 0x20;     //定時器1方式2
    SCON = 0x50;     //串列埠接收使能
    ES = 1;             //串列埠中斷使能
    TR1 = 1;         //定時器1使能
    TI = 1;             //傳送中斷標記位,必須設定  //這個必須記住
    
}

//毫秒延時函式
void delay_ms(unsigned int t)
{
    unsigned char a,b;
    while(t--)
    {
      for(b=102;b>0;b--)
      for(a=3;a>0;a--);
    }
}
 

void main()
{
    int i;
    InitUART();    //初始化串列埠
    EA = 1;          //開總中斷

    printf("\n is begin \n");
    
    
    for(i=0;i<5;i++)
    {
        printf("please input the char:");
        scanf("%d",&a);
        delay_ms(10);
        printf("\n the input is --->%d\n",a);    
        
    }
    
    printf("\n is done \n");
    while(1);
    
}

當可以使用printf,,,一切除錯,變得如此簡單~~