8922|6

76

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

串口调试助手发数据给单片机,为何无反映? [复制链接]

   尝试vb和单片机连接,结果把如下程序烧给单片机,没有反应,怀疑vb有误,改串口调试助手,发送A A,结果还是没有反应,工作指示灯也不亮,为什么?还望大侠指点

//-----------------------函数声明,变量定义--------------------------------------------------------
#include
#define COUNT 2                   // 定义接收缓冲区大小
unsigned char Buffer[COUNT];         //定义接收缓冲区
unsigned char point;                   //定义接收数据个数指示变量
void UART_Init();                    //串口初始化函数
void COM_Send(void);                //串口接收函数

#define  T1_HIGH     0xFC  //定义定时器T0的初值
#define  T1_LOW      0x66

sbit  Led =P3^4;       //工作指示灯
unsigned int  T0_Count =0;   //用来计算等待时间     
//--------------------------------------------------------------------------------------------------
// 函数名称: UART_init()串口初始化函数
// 函数功能: 在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s
//            串口接收中断允许,发送中断禁止
//初始化串行口和波特率发生器
//--------------------------------------------------------------------------------------------------
void UART_init()
{                    
SCON =0x50;          //选择串口工作方式,打开接收允许
TMOD =0x21;          //定时器1工作在方式2,定时器0工作在方式1
TH1 =0xfd;           //实现波特率9600(系统时钟11.0592MHZ)
TR1 =1;              //启动定时器T1


  TL0=T1_LOW;
  TH0=T1_HIGH;  
  TR0=1;

ET1 =0;
ES=1;                //允许串行口中断
PS=1;                //设计串行口中断优先级
EA =1;               //单片机中断允许
}
//--------------------------------------------------------------------------------------------------
// 函数名称: com_interrup()串口接收中断处理函数
// 函数功能: 接收数据到数据缓冲区
//--------------------------------------------------------------------------------------------------
Com_Interrupt(void) interrupt 4 using 3
{
  unsigned char RECEIVR_Buffer;
  if(RI)                                     //处理接收中断
  {
      RI=0;                              //清除中断标志位
      RECEIVR_Buffer=SBUF;            //接收串口数据
      if(point==0)                   //如果还没有接收到起始位
        {
            if(RECEIVR_Buffer='A')             //判断是否起始标志位
            point++;                            //是准备接收下一位
            else
            point=0;                          //不是,继续等待起始位
         }
      else if(point>0&&point<2)                      //判断是否接收够三十位数据
            Buffer[point++]=RECEIVR_Buffer;      //不够,把接收到的数据放入接收缓存区
            else point=0;                                    //缓冲区已满,清除缓存区内数据重新接收
   }

if(TI)                                   //处理发送中断
{
TI=0;
}
}

//--------------------------------------------------------------------------------------------------
// 函数名称: T0_int中断函数
// 函数功能: 检验单片机是否工作
//--------------------------------------------------------------------------------------------------

void  T0_int(void) interrupt  1   using   2
    {
       TL0=T1_LOW;
       TH0=T1_HIGH;        //定时器初值重置,实现循环工作      
      
       T0_Count++;          //定时器计数   
       if((T0_Count%5)==0)
       {
             Led=!Led;
       }
    }
//--------------------------------------------------------------------------------------------------
// 函数名称: COM_send()串口发送函数
// 函数功能: 把数据缓冲区的数据发送出去
//--------------------------------------------------------------------------------------------------
void COM_Send(void)
{
/*for(point=0;point<30,TI=1;point++)     //连续发送30位数据                                      
  {
   SBUF=buffer[point];                  //把缓存区的数据都发送到串口
   TI=0;
   }*/
  SBUF='S';
  while(TI)
  {
  TI=0;
  }
}

//--------------------------------------------------------------------------------------------------
// 函数名称: 主函数
// 函数功能: 调度各子函数,完成通信过程
//--------------------------------------------------------------------------------------------------
void main(void)
{
    UART_init(); //初始化串口
    do
      {                  
         if(point==2)                           //判断数据是否接收完成
         COM_Send();                         //正确则调用发送程序
         point=0;
      }while(1);
}

最新回复

你的串口中断服务程序不对      if(num=1)     {     SBUF=temp;     当执行完这句时,TI并不马上就等于1       if(TI) TI=0; 所以这句的TI=0没有热行。       num=0;       而直接热行了num=0.       }                    然后就退出中断。                      待当TI真的等于是时,再进中断时,又没有机会再清它。                    如果,你只是想完成最简单的一个字节收发,可以这样试试。 void Com_Interrupt(void) interrupt 4 using 3 {       if (RI)         {         RI=0;         RECEIVR_Buffer=SBUF;         SBUF=RECEIVR_Buffer;         }         if (TI)         TI=0;       }   详情 回复 发表于 2008-6-2 13:55
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
工作指示灯不亮,好像是因为你忘了开T0的中断——ET0=1
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
在串口中断服务程序中把TI清了,那在发送程序中,还能等到TI=1吗?
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

4
 
void send(unsigned char i)
{
            ES=0;
            TI=0;
            SBUF=i;
            while(TI==0);
            TI=0;
            ES=1;
}

你的发送code不对,ES一定要的
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 
谢谢
工作灯基本正常了,但是定时不准,闪的较快,估计和我在中断的程序有关
void Com_Interrupt(void) interrupt 4 using 3
{
       if(RI)
      {RI=0;
       RECEIVR_Buffer=SBUF;
       num=1;
      temp=RECEIVR_Buffer;
      }
            
      if(num=1)
     {
     SBUF=temp;  
      if(TI) TI=0;
      num=0;
      }

}
我就想实现最基本的发送一个字符,然后接收一个字符,结果发送这个中断后 复位 串口助手显示 00,然后发送A,结果串口助手就收到一堆的20,不停的发,为啥阿?
 
 
 

回复

95

帖子

0

TA的资源

一粒金砂(初级)

6
 
  if(num=1)
。。。这种
另外串口关闭时会发送0x00的
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

7
 
你的串口中断服务程序不对

     if(num=1)
    {
    SBUF=temp;     当执行完这句时,TI并不马上就等于1
      if(TI) TI=0; 所以这句的TI=0没有热行。
      num=0;       而直接热行了num=0.
      }
                   然后就退出中断。
                     待当TI真的等于是时,再进中断时,又没有机会再清它。
                  

如果,你只是想完成最简单的一个字节收发,可以这样试试。
void Com_Interrupt(void) interrupt 4 using 3
{
      if (RI)
        {
        RI=0;
        RECEIVR_Buffer=SBUF;
        SBUF=RECEIVR_Buffer;
        }  
      if (TI)
        TI=0;      
}
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表