|
STC8G單片機使用printf()函數(shù)發(fā)送數(shù)據(jù),出現(xiàn)錯亂現(xiàn)象:
void UartIsr() interrupt 4
{
int d=0,e=1,f=2,g=3;
if (RI)
{
ES=0;
RI = 0;
printf("%d%d%d",e,f,g); //接收中斷后 回傳1 2 3
ES=1;
}
}
111.png (12.95 KB, 下載次數(shù): 32)
下載附件
2020-7-16 09:49 上傳
只能收到e=1,后面的字節(jié)收不到;切換到HEX模式,則還是有錯誤:
22.png (13 KB, 下載次數(shù): 32)
下載附件
2020-7-16 09:51 上傳
31的asc碼是1,A6和FE明顯是錯誤顯示;
現(xiàn)在把發(fā)送分成3次,程序如下,但發(fā)現(xiàn)還是有錯誤:
void UartIsr() interrupt 4
{
int d=0,e=1,f=2,g=3;
if (RI)
{
ES=0;
RI = 0;
printf("%d",e);
printf("%d",f);
printf("%d",g);
ES=1;
}
}
33.png (13.21 KB, 下載次數(shù): 27)
下載附件
2020-7-16 09:57 上傳
非常奇怪,只能發(fā)送一個字節(jié)出去;
單片機選用型號是STC8G2K64S4,屬于1T單片機,晶振設(shè)置的是22.1184MHZ,波特率是19200,完整程序如下,跪求各路大神解惑,謝謝!
#include "reg51.h"
#include"stdio.h"
#include "intrins.h"
#define CKSEL (*(unsigned char volatile xdata *)0xfe00) //時鐘相關(guān)寄存器地址
#define CLKDIV (*(unsigned char volatile xdata *)0xfe01)
#define HIRCCR (*(unsigned char volatile xdata *)0xfe02)
#define XOSCCR (*(unsigned char volatile xdata *)0xfe03)
#define IRC32KCR (*(unsigned char volatile xdata *)0xfe04)
sfr P_SW2 = 0xba; //特殊寄存器
sfr AUXR = 0x8e;
sfr P0M1 = 0x93;//管腳配置寄存器地址 與通訊無關(guān)
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xc9;
sfr P5M0 = 0xca;
int K=0;
void UartInit()//串口初始化函數(shù)
{
PCON=0x00; //PCON=0X00 波特率不加倍 SMOD=0
SCON = 0x50; //SM0=0 SM1=1 串口1模式1可變波特率 8位數(shù)據(jù)模式
TMOD = 0x20; //定時器1模式2 8位自動重裝載模式
TL1 =0xDC; //1T模式 22.1184MHZ晶振下 19200波特率
TH1 =0xDC;
IE=0x90;// 等同于EA=1;ES=1;
TCON=0x40;//等同于 TR1=1;
TI=1;
AUXR = 0x40; //串口1模式0的波特率不加倍 選擇定時器1作為波特率發(fā)射器
}
void main()
{
P_SW2 = 0x80;//首先選擇內(nèi)部時鐘
CKSEL = 0x00; // 選擇內(nèi)部 IRC ( 默認(rèn) ) 22.1184MHZ
//CLKDIV = 0x02; // 時鐘 2 分頻
P_SW2 = 0x00;
UartInit();
while (1)
{
if(K==1)
;
if(K==2)
;
}
}
void UartIsr() interrupt 4
{
int d=0,e=1,f=2,g=3;
if (RI)
{
ES=0;
RI = 0;
printf("%d",e);
printf("%d",f);
printf("%d",g);
ES=1;
}
}
33.png (60.17 KB, 下載次數(shù): 35)
下載附件
2020-7-16 10:02 上傳
|
|