typedef char *va_list;
我先在知道想要在51微控制器使用printf有兩種辦法,一種是用庫自己的printf,一種是寫自己的printf,不過都很簡單,我先介紹一下庫的printf吧。
1、首先新增標頭檔案#include
2、配置一下串列埠,但是在串列埠初始化的時候ti必須為1,否則無法傳送。
3、也可以使用中斷接收,但是不要再中斷裡有ti=0;這條語句,否則也傳送不成功。
就這麼簡單,你就可以使用printf(「」,x,x,x)了,嘎嘎!
#include
#include
#define fosc 11059200l//系統時鐘頻率
#define baud 9600 //串列埠波特率
void usart_init();
void delay100us()
unsigned char i, j;
i = 2;
j = 15;
dowhile (--j);
} while (--i);
void main()
unsigned int a=99;//定義的數不能是char 或者 unsigned char
char table="abc";
char *abc=table;
usart_init();
delay100us();
while(1)
printf("%d %c %x %s",a,(char)a,a,table);//必須(char)a強制轉換一下
delay100us();delay100us();delay100us();delay100us();delay100us();delay100us();delay100us();delay100us();
void usart_init(void)
auxr=0x40;//定時器1的速度是傳統的8051的12倍 不分頻 不可以位定址
tmod=0x00;//設定定時器1為16位自動重灌暫存器 不可以位定址
scon=0x50;//設定為8位波特率可變 並允許串列埠接收使能
pcon=0x00;//用定時器1模式0時於pcon無關了
tl1=(65536-(fosc/4/baud));
th1=(65536-(fosc/4/baud))>>8;
ti=1;//用系統自帶的printf函式,ti必須等於1,否則無法傳送,不能
tr1=1;//使能定時器1
es=1; //串列埠中斷使能
ea=1; //全域性中斷使能
void uart() interrupt 4 using 1
static unsigned char ri_date=0;
if(ri)//接收成功ri置位
ri_date=sbuf;
ri=0;
if(ti)//傳送成功ti置位
//ti=0;//用系統的printf的時候,如果又用到中斷的話,那麼這句話就得遮蔽,否則無法傳送
還有一種就是自己寫printf。
void sendstring(unsigned char *string)//這個是字串傳送函式
while(*string!='\0') //判斷是否到字串的尾端
sendbyte(*string);
string++;
void uart_printf(char *fmt,...)//這個是我們的printf函式
va_list ap;//typedef char *va_list; va_list是char型的指標
char xdata string[1024];//訪問外部ram 兩位元組對齊
va_start(ap,fmt);//這個函式的功能是,找到第乙個可變形參的位址,並把位址賦給ap
vsprintf(string,fmt,ap);//其實這個函式才是核心函式,沒研究。。。
sendstring(string);//這個函式就是傳送字串函式,通過上乙個函式,就把該提取的東西都提取了
va_end(ap);//結束函式
如果不懂得就參考**:
只要是支援printf的語言,那麼如果**的棧是向上生長的,函式的形參入棧的方向是從左向右,如果**的棧是向下生長的,那麼函式的形參是從右向左。
51微控制器auxr暫存器 51微控制器各暫存器位址
自然優先順序 int0 高tf0 int1 tf1ri ti tf2 exf2 低定時器 計數器控制暫存器 tcon tcon.7 tcon.6 tcon.5 tcon.4 tcon.3 tcon.2 tcon.1 tcon.0 tf1tr1 tf0tr0 ie1it1 ie0it0 timer1 ...
51微控制器的特殊暫存器
中斷使能暫存器 通過設定中斷使能暫存器 ie 的 ea 位 使能所有中斷 每個中斷源都有單獨的使能位 可通過軟體設定 ie 中相應的使能位在任何時候使能或禁能中斷 中斷使能暫存器 ie 的各 位如下所示 中斷使能暫存器 ie可位定址 位位址0afh 0aeh 0adh 0ach 0abh 0aah ...
微控制器暫存器
微控制器暫存器其實就相當於乙個變數,只不過這個變數在固定的位址,有乙個特殊的名稱 當然也不強制 初學者對暫存器的操作比較困難的原因不是組合語言或c語言使用的不熟,而是對暫存器的陌生。微控制器中儲存器的資源是非常寶貴和有限的,所以要盡可能充分的使用這些儲存資源,有多充分呢?就是把每一bit都用上。這就...