找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

串口实验中发现一个奇怪的现象,请大家讨论!!!!!!!!!!

[复制链接]
admin 发表于 2012-9-2 13:22:14 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
各位老师好,我在跟郭天祥的《十天学会单片机》教程学习串口时,在做实验时发现一个现象很奇怪,一直解决不了,请各位老师指教!!!!!!

题目:在上位机上用串口调试助手发送一个字符X,单片机收到后返回 "我 收 到 X",串口波特率设为9600bps, 接收信号时数码管显示。

现象:程序已实现题目要求,在上位机上发送X时单片机返回"我 收 到 X",试着发XX,单片机返回 "我 收 到 X 我 收 到 X",但我

发XXX时单片机依然返回 "我 收 到 X 我 收 到 X",而不是三个 "我 收 到 X",发送其他字母依然如故,即单片机只能返回接收到的
前两位。但是如果把返回 "我 收 到 " 语句即红色部分去掉,让单片机收到啥返回啥,这时返回的和上位机发送的就一致了。


程序:

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar a;b;c;
uchar code table[]="我 收 到 "; //设定编码表,用双引号括起来,一个汉字两个字符,空格算一个字符
sbit fm=P2^3;


void chush() //初始化
{
TMOD=0x20; //设定T1定时器工作模式
TH1=0xfd; //给TH1赋初值
TL1=0xfd;
TR1=1; //开T1定时器
SM0=0; //设定串口工作方式
SM1=1;
SM2=1; //使SM2为1时,只有接收到有效停止位时,RI才置1
REN=1; //允许串口接收
EA=1; //开总中断
ES=1; //开串口中断

}

void zhongduan() interrupt 4 //串口中断服务程序,
{
a=SBUF; //取出接收到的数据赋给a
RI=0; //使收完数据自动置1的RI置0
b=1; //收完数据使标志a=1

}

void main() //主函数,主要完成发送数据、是蜂鸣器响
{
chush(); //初始化

while(1)
{
P1=a;
if(b==1) //如果标志b为1,说明已收完数据,关中断,进入发送程序
{
ES=0; //关串口中断等待发送数据
for(c=0;c<9;c++) //"我 收 到 "共9位,用for循环逐位发送
{
SBUF=table[c]; //向SBUF写入数据,发送
while(!TI); //当向SBUF写入数据后,用while(!TI)等待数据发送完毕
TI=0; //退出while(!TI),然后将TI人工置0,等待下次发送
}
SBUF=a; //向SBUF写入收到的数据
while(!TI);
TI=0;
b=0;
ES=1; //使ES重开串口中断等待接收数据
}

}
}
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-25 00:47 , Processed in 0.051936 second(s), 10 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表