打印
[51单片机]

VSPD虚拟串口通信调试

[复制链接]
1909|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
源程序
#include <REGX51.H>
#define uchar unsigned char
#define uint unsigned int
unsigned char flag,a,i;
uchar code table[]="I get ";
void init()
{
  TMOD=0x20;
  TH1=0xFD;
  TL1=0xFD;
  TR1=1;
  REN=1;
  SM0=0;
  SM1=1;
  EA=1;
  ES=1;
}
void main()
{
   init();
   while(1)
   {
    if(flag==1)
         {
           ES=0;
           for(i=0;i<6;i++)
           {
             SBUF=table[i];
                 while(!TI);
                 TI=0;
           }
           SBUF=a;
           while(!TI);
           TI=0;
           ES=1;
           flag=0;
         }
   }
}
void UART() interrupt 4
{
RI=0;
a=SBUF;
flag=1;
}
串口调试时,用串口调试助手可以发数据给单片机,有波形,但是接收不到单片机返回来的数据,这是怎么回事?

ssssssaa.png (7.71 KB )

ssssssaa.png

相关帖子

沙发
保持沉没了|  楼主 | 2013-12-6 07:56 | 只看该作者
求教,,,,是不是程序问题

使用特权

评论回复
板凳
保持沉没了|  楼主 | 2013-12-13 14:58 | 只看该作者
此问题已解决,下个问题

使用特权

评论回复
地板
保持沉没了|  楼主 | 2013-12-13 15:03 | 只看该作者
下面这个程序有几点疑问请高手解答:
1:这是中断方式?它和查询方式的区别,我总是分不开
2:say_cl_fy有什么作用
3:主函数的TI为什么先置1,a为什么又给赋了个字符,里面的d什么作用???
新手迷茫中,,,,,,,,
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar a;
sbit d = P3^7;
//--------------------------------------
say_CR_LF()
{
     SBUF = 13; while (TI == 0); TI = 0;
     SBUF = 10; while (TI == 0); TI = 0;
}
//--------------------------------------
say_yeah()
{
     SBUF = a;    while (TI == 0); TI = 0;
     SBUF = ','; while (TI == 0); TI = 0;
     SBUF = ' '; while (TI == 0); TI = 0;
     SBUF = 'y'; while (TI == 0); TI = 0;
     SBUF = 'e'; while (TI == 0); TI = 0;
     SBUF = 'a'; while (TI == 0); TI = 0;
     SBUF = 'h'; while (TI == 0); TI = 0;
     SBUF = '!'; while (TI == 0); TI = 0;
     say_CR_LF();
}
//--------------------------------------
say_hello()
{
     SBUF = 'H'; while (TI == 0); TI = 0;
     SBUF = 'e'; while (TI == 0); TI = 0;
     SBUF = 'l'; while (TI == 0); TI = 0;
     SBUF = 'l'; while (TI == 0); TI = 0;
     SBUF = 'o'; while (TI == 0); TI = 0;
     SBUF = '!'; while (TI == 0); TI = 0;
     say_CR_LF();
}
//--------------------------------------
void init()
{
     SCON = 0x50;     //设置串口通信方式1, 允许接收
     PCON &= 0x7F;
     TMOD = 0x20;     //设置T1定时方式2
     TH1 = 0xfd;      // 9600bps @ 11.0592MHz
     TL1 = 0xfd;
     TR1 = 1;         //启动T1

     ES = 1;          //开串口中断.
     EA = 1;          //开总中断.
     say_hello();
}
//--------------------------------------
void delay(uint z)
{
     uint x, y;
     for(x = z; x > 0; x--) for(y = 110; y > 0; y--);
}
//--------------------------------------
void main()
{
     init();
     TI = 1;
     a = '4';
     while(1) {
       if(a == '1') {
         d = 0; delay(400);
         d = 1; delay(400);
       }
       else if(a == '2') {
         d = 0; delay(200);
         d = 1; delay(200);
       }
       else if(a == '3') {
         d = 0; delay(100);
         d = 1; delay(100);
       }
       else if(a == '4') {
         d = 1;
}    } }
//--------------------------------------
void ser() interrupt 4
{
     if (TI == 1) TI = 0;
     if (RI == 1) {
       RI = 0;
       P0 = SBUF;
       a = SBUF;           //中间变量.
       say_yeah();
}    }

使用特权

评论回复
5
dengxingling8| | 2013-12-13 15:20 | 只看该作者
1:这个程序发送用的轮训,接受用的中断,
2:那个函数的作用,呵呵,你去看看ascii码表就知道了
3:TI给0就发生中断进入函数,设置为0,这一步确定把TI清零了,a赋一个初始值,让cpu进入while循环执行d=1操作,d=1为默认状态,

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
保持沉没了 + 3
6
保持沉没了|  楼主 | 2013-12-13 15:40 | 只看该作者
dengxingling8 发表于 2013-12-13 15:20
1:这个程序发送用的轮训,接受用的中断,
2:那个函数的作用,呵呵,你去看看ascii码表就知道了
3:TI给0 ...

高手,受教了,还有点不明白
换行跟回车应该是两行吧,应该中间空一行,显示没有空。。还是结果就是这样,我理解有问题
第三点,还是不太懂,他是给TI1不是0;;;a接受赋值后,从sbuf接受到的数据怎么处理的,d=1是什么操作,干什么用的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

78

帖子

0

粉丝