|
|
STC8G單片機(jī)使用printf()函數(shù)發(fā)送數(shù)據(jù),出現(xiàn)錯(cuò)亂現(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;
}
}
只能收到e=1,后面的字節(jié)收不到;切換到HEX模式,則還是有錯(cuò)誤:
31的asc碼是1,A6和FE明顯是錯(cuò)誤顯示;
現(xiàn)在把發(fā)送分成3次,程序如下,但發(fā)現(xiàn)還是有錯(cuò)誤:
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;
}
}
非常奇怪,只能發(fā)送一個(gè)字節(jié)出去;
單片機(jī)選用型號(hào)是STC8G2K64S4,屬于1T單片機(jī),晶振設(shè)置的是22.1184MHZ,波特率是19200,完整程序如下,跪求各路大神解惑,謝謝!
#include "reg51.h"
#include"stdio.h"
#include "intrins.h"
#define CKSEL (*(unsigned char volatile xdata *)0xfe00) //時(shí)鐘相關(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;//管腳配置寄存器地址 與通訊無(wú)關(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; //定時(shí)器1模式2 8位自動(dòng)重裝載模式
TL1 =0xDC; //1T模式 22.1184MHZ晶振下 19200波特率
TH1 =0xDC;
IE=0x90;// 等同于EA=1;ES=1;
TCON=0x40;//等同于 TR1=1;
TI=1;
AUXR = 0x40; //串口1模式0的波特率不加倍 選擇定時(shí)器1作為波特率發(fā)射器
}
void main()
{
P_SW2 = 0x80;//首先選擇內(nèi)部時(shí)鐘
CKSEL = 0x00; // 選擇內(nèi)部 IRC ( 默認(rèn) ) 22.1184MHZ
//CLKDIV = 0x02; // 時(shí)鐘 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;
}
}
|
|