- 友善調試51單片機程式流程;
- 綜合網上查詢資料,如有侵權,請告知删除;
主要分三個部分(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;
}