標(biāo)題: 關(guān)于stc15f2k60s2單片機(jī)串口printf函數(shù)的使用問題 [打印本頁]
作者: 霍禮林 時間: 2018-10-23 17:37
標(biāo)題: 關(guān)于stc15f2k60s2單片機(jī)串口printf函數(shù)的使用問題
為什么調(diào)用printf在這個板子上輸出中文會出現(xiàn)亂碼,我拿不同的板子試了基本一樣的代碼就沒亂碼,板子應(yīng)該沒有問題,請賜教
1.png (31.17 KB, 下載次數(shù): 55)
下載附件
2018-10-23 17:31 上傳
2.png (12.75 KB, 下載次數(shù): 50)
下載附件
2018-10-23 17:31 上傳
3.png (68.79 KB, 下載次數(shù): 61)
下載附件
2018-10-23 17:31 上傳
4.png (31.48 KB, 下載次數(shù): 54)
下載附件
2018-10-23 17:31 上傳
單片機(jī)源碼如下:
- #include<STC15F2K60S2.H>
- #include <stdio.h>
- #define uchar unsigned char
- #define uint unsigned int
- uint a;
- bit flag=0;
- float b;
- void delayms(int ms);
- void allinit();
- void keyscan();
- void PCreceive();
- void UartInit(void); //串口初始化
- void main()
- {
- a=100; b=0.01;
- UartInit();//串口初始化
- EA=1; //打開總中斷
- ES=1; //串口1中斷
- allinit(); //初始化板子
- while(1)
- {
- if(flag==1)
- {
- flag=0;
- PCreceive();
- }
- keyscan();
- }
- }
- void PCreceive()
- {
- TI=1;
- printf(" hello world! \n" );delayms(5);
- printf(" 總水量:%dL \n" ,a);delayms(5);
- printf(" 瞬時速度:%.1fL/min\n\n",b); delayms(5);
- }
- void UartInit(void) //9600bps@11.0592MHz
- {
- SCON = 0x50; //8位數(shù)據(jù),可變波特率
- AUXR |= 0x01; //串口1選擇定時器2為波特率發(fā)生器
- AUXR |= 0x04; //定時器2時鐘為Fosc,即1T
- T2L = 0xE0; //設(shè)定定時初值
- T2H = 0xFE; //設(shè)定定時初值
- AUXR |= 0x10; //啟動定時器2
- }
- void keyscan()
- {
- if(P33==0)
- {
- delayms(5);
- if(P33==0)
- {
- flag=1;
- }
- while(!P33);
- }
- }
- void delayms(int ms) //延時函數(shù)
- {
- int i,j;
- for(i=ms;i>0;i--)
- for(j=845;j>0;j--);
- }
- void allinit() //初始化板子的,不會有問題
- {
- P2=0XA0;
- P0=0X00;//關(guān)閉蜂鳴器,繼電器
- P2=0X80;
- P0=0XFF;//關(guān)閉LED燈
- P2=0XC0;
- P0=0XFF;//選擇所有數(shù)碼管
- P2=0XFF;
- P0=0XFF;//關(guān)閉所有數(shù)碼管
- }
復(fù)制代碼
作者: cjm82 時間: 2018-10-23 20:11
看下有問題的板子晶振是不是11.0592MHz
作者: 霍禮林 時間: 2018-10-23 20:57
兩個板子都是焊接的都是12M的晶振
作者: sxhwdz 時間: 2018-10-24 06:53
12M晶振就要用12M晶振計算,否則誤差太大了,自然容易出錯:
void UartInit(void) //9600bps@12.000MHz
{
SCON = 0x50; //8位數(shù)據(jù),可變波特率
AUXR |= 0x01; //串口1選擇定時器2為波特率發(fā)生器
AUXR |= 0x04; //定時器2時鐘為Fosc,即1T
T2L = 0xC7; //設(shè)定定時初值
T2H = 0xFE; //設(shè)定定時初值
AUXR |= 0x10; //啟動定時器2
}
這樣與PC機(jī)串口通訊會失步。11.0592M計算的9600波特率誤差為0,而12M計算的誤差為0.16,所以還是建議用11.0592的晶振。
如果只是兩個單片機(jī)之間串口通訊,那么晶振與波特率都無所謂,只要兩邊完全相同就可以了。
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |