天天看點

51單片機 printf函數 調試程式

  1. 友善調試51單片機程式流程;
  2. 綜合網上查詢資料,如有侵權,請告知删除;

主要分三個部分(1)51單片機程式部分;(2)keil工具部分;(3)為何printf輸出為序列槽。

(1)51單片機程式部分

#include <stdio.h>
#include <reg51.h>
 
void InitUART(void)//使用定時器1作為序列槽波特率發生器
{
    TH1 = 0xF3;	 //晶振12mhz 波特率序列槽上設為2400才不顯示亂碼代碼是4800
    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()
{
    InitUART();	//初始化序列槽
    EA = 1;	  	//開總中斷
    while(1)
    {
        delay_ms(500);
        printf("hello\n");//序列槽列印結果
    }
 }
           

代碼部分注意事項:

  • 代碼中包含 頭檔案#include<stido.h>,其中包含printf函數;
  • 序列槽初始化時,TI = 1;

(2)keil設定顯示序列槽輸出結果

在C51中、printf和scanf函數主要用于串行資料的收發

有時在進行軟體調試的時候,需要使用printf函數輸出一些結果

要在Keil中看到這些結果,隻需要兩步:(當然首先要進入調試界面再做以下兩步)

1  設定

打開Peripherals-->Serial視窗,選擇IRQ中的TI、RI兩個選項

2  打開輸出視窗

打開View-->Serial Window #1視窗

在程式中的printf語句的輸出就顯示在這個視窗中

現在就到程式視窗運作程式、運作結束後打開Serial視窗就可以看到printf的輸出了。

(3)為何printf從序列槽輸出

檢視了keil的幫助檔案裡面的printf函數說明,原來printf函數最終是調用putchar函數來實作列印輸出字元的。

KeilC51LIB檔案夾裡面找到了putchar.c檔案,putchar函數使用TI和SBUF,确定為序列槽終端輸出。

注意:printf重定向功能,即使用者自己定義putchar函數,例如

//UART1 發送序列槽資料
void UART1_SendData(char dat)
{
    ES=0;           //關序列槽中斷
    SBUF=dat;           
    while(TI!=1);   //等待發送成功
    TI=0;           //清除發送中斷标志
    ES=1;           //開序列槽中斷
}

//UART1 發送字元串
void UART1_SendString(char *s)
{
    while(*s)//檢測字元串結束符
    {
        UART1_SendData(*s++);//發送目前字元
    }
}

//重寫putchar函數
char putchar(char c)
{
    UART1_SendData(c);
    return c;
}
           

繼續閱讀