关于在Proteus中仿真串口接发字符串的问题
[复制链接]
这几天在Proteus上调试一个串口接收发送字符串的小程序,要实现的功能简单描叙一下:在Proteus上加两个串口的虚拟终端,一个显示发送来的数据,另一个作为发送端;程序运行后首先发送两个定长字符串,然后在发送端输入字符接收端即时显示。可是调试后出现问题,显示十六进制数不是该字符对应的十六进制编码,程序及运行结果如下:
#include #include #include
#define uint unsigned int
#define uchar unsigned char
//毫秒级延时函数
void delay(unsigned int x)
{
unsigned char i;
while(x--)
{
for(i = 0;i < 120;i++);
}
}
//串口初始化
void UART_Init(void)
{
SCON = 0x50; //串口方式1 ,允许接收
TMOD = 0x20; //T1工作于方式2
PCON = 0x00; //波特率不倍增
TL1 = 0xfd; //波特率设置
TH1 = 0xfd;
EA = 1; //开总中断
ES = 1; //开串口接收中断 //
TI = 0;
TR1 = 1; //定时器开启
}
//字符发送函数
void put_char(unsigned char data1)
{
SBUF = data1; //将待发送的字符送入发送缓冲器
while(TI == 0); //等待发送完成
TI = 0; //发送中断标志请0
}
//字符串发送函数
void putstring(unsigned char *dat)
{
while(*dat != '\0') //判断字符串是否发送完毕
{
put_char(*dat); //发送单个字符
dat++; //字符地址加1,指向先下一个字符
delay(5);
}
}
//主函数
void main(void)
{
// unsigned char c = 0;
UART_Init();
delay(200);
putstring("Receiving from 8051...\r\n"); //串口向终端发送字符串,结尾处回车换行
putstring("----------------------\r\n");
delay(50);
while(1)
{
}
}
//接收字符并发送
void revdata(void) interrupt 4 using 3
{
unsigned char temp;
if(RI == 0) return; //如果没有接收中断标志,返回
ES = 0; //关闭串口中断
RI = 0; //清串行中断标志位
temp = SBUF; //接收缓冲器中的字符
put_char(temp); //将接收的字符发送出去
ES = 1; //开启串口中断
}
显示结果:
B2 A5 A3 A5 A9 B6 A9 AE A7 80 A6 B2 AF AD 80 98 90 95 91
8E 8E 8E 8D 8A 8D 8D 8D 8D 8D8D 8D 8D 8D 8D 8D 8D 8D
8D 8D 8D 8D 8D 8D 8D 8D 8D 8D 8A
在发送虚拟端口上分别输入0 1 2 3 4 5 6 7 8 9 结果如下:
B0 B1 B2 B3 B4 B5 B6 B7 B8 B9
请问大家问题出在哪里?
[ 本帖最后由 liming1120 于 2010-8-14 18:49 编辑 ]
|