用于p89v664的printf打印来自实际微控制器的垃圾字符

时间:2013-05-19 05:10:25

标签: 8051 keil

我正在尝试使用以下代码

从p89v664在串行终端上打印消息
#include<P89V66x.H>
#include<stdio.h>
char putchar(char c) {

if (c == '\n')  {   
    while (!TI);   
    TI = 0;   
    S0BUF = 0x0d;   
}   
TI = 0;
S0BUF = c;    
while (!TI);
return c;

}

int printf(char*str) {

unsigned int cnt = 0;
while(*str != '\0')
{
    putchar(*str);
    cnt++;
    str++;
}
}

void delay(unsigned int i) {
int d = 100;
for(;i!=0;i--) {
    for(;d!=0;d--);
    d = 100;
}
}

int main(void) {
/**Serial init*/
S0CON  = 0x50;                   /* SCON: mode 1, 8-bit UART, enable rcvr    */
TMOD |= 0x20;                   /* TMOD: timer 1, mode 2, 8-bit reload      */
TH1   = 0xF6;                   /* TH1:  reload value for 9600 baud         */
TR1   = 1;                    /* TR1:  timer 1 run                        */
TI = 1;
while(1) {
    printf("Hello\n");
    delay(300);
    printf("Hello World\n");
    delay(10000);
}
}

上面的程序工作正常,直到此程序中的printf函数定义未被注释。 如果上述程序中的printf函数被注释为使用标准库中的printf,则在串行控制台上打印垃圾字符。 (我用过腻子)。 我使用了Keil uVision V4.14.4.0编译器。

有什么遗漏? 我不明白这个程序有什么问题。

1 个答案:

答案 0 :(得分:1)

经过一些实验后,我发现问题与keil uVision4评估版有关。 我使用sdcc编译了这段代码并运行它并且它有效。可能是keil评估版的限制是造成问题。非常感谢Mellowcandle所有回复。

编辑:

#include <P89V66x.H>
#include<stdio.h>

void putchar(char c) {

TI = 0;
S0BUF = c;  
if (c == '\n')  {   
    while (!TI);   
    TI = 0;   
    S0BUF = 0x0d;   
}
while (!TI);
}
int main(void) {

/**Serial init*/
unsigned short int c = 65334;
S0CON  = 0x50;                /* SCON: mode 1, 8-bit UART, enable rcvr    */
TMOD |= 0x20;                 /* TMOD: timer 1, mode 2, 8-bit reload      */
/**For 11.0592 crystal
value should TH = -3 or
TH1 = FD*/
TH1   = 0xF6;                 /* TH1:  reload value for 9600 baud  for 
                              18 Mhz cyrstal */
TR1   = 1;                    /* TR1:  timer 1 run                        */

while(1) {
    printf("Hello %u\n", c);
    delay(300);
    printf("Hello World %u\n" ,c);
    delay(10000);
}
}
用于编译此代码的

命令是

sdcc {filename}