找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3600|回复: 8
收起左侧

为什么单片机串口发送之后TI不会自动置位?

[复制链接]
ID:323998 发表于 2018-9-20 11:45 | 显示全部楼层 |阅读模式
  求助,我使用的是STC15W408AS单片机,然后现在进行双机串口通信,一直没有通信,于是我就进行查询了,不知道是不是软件出现问题了。程序如下:


实验的结果是,一通电,蜂鸣器鸣响一下,然后就一直长鸣了。
那就是TI没有置位,虚心请教,这是什么原因?


#include<reg51.h>
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;

sbit BEE=P2^0;   //蜂鸣器

void Delay100ms()        
{
        uchar i, j, k;

        _nop_();
        _nop_();
        i = 5;
        j = 52;
        k = 195;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}


void UartInit()   //串口初始化
{
        TMOD=0x20;
        TH1=0xF3;
        TL1=0xF3;
        SCON=0x50;
        PCON=0x80;
        TR1=1;
}


void main(void)
{
         UartInit();
        BEE=1;                                                                                
        Delay1000ms();
        BEE=0;
        Delay1000ms();                                                        //蜂鸣器开机鸣响一下,意味着到了这一步。

                SBUF=0xA0;                                                                //发送数据,稍微延时一下等待检测。
                Delay100ms();                                                                        
                //if(TI==1)
                        
                while(TI==0)                                                        //如果一直发送成功,那就蜂鸣器长响。 发送成功则关闭
                BEE=1;
                 TI=0;                                                                                
               
                BEE=0;
                while(1);                                                        //卡住它 不让执行第二次

}





回复

使用道具 举报

ID:388197 发表于 2018-9-20 12:28 | 显示全部楼层
总中断EA 串口中断ES没打开,另外SBUF发送后面的那个DELAY可以去掉
回复

使用道具 举报

ID:323998 发表于 2018-9-20 13:03 | 显示全部楼层
cjm82 发表于 2018-9-20 12:28
总中断EA 串口中断ES没打开,另外SBUF发送后面的那个DELAY可以去掉

刚尝试了一下,按你所说的,我加上ES=1,EA=1,并把那个延时去掉,TI还是没有自动置位。
回复

使用道具 举报

ID:398663 发表于 2018-9-20 13:16 | 显示全部楼层
一般蜂鸣器低电平是启动。
回复

使用道具 举报

ID:304235 发表于 2018-9-20 14:14 | 显示全部楼层
你程序里只有发送的程序没有接受的程序  接受的程序是在串口中断ES进行的 也就是说你要在设置好串口波特率之后开启总中断EA 串口终端ES  while(TI==0)上面那个延时不需要 直接更while(TI==0)就可以了。
回复

使用道具 举报

ID:149144 发表于 2018-9-20 15:23 | 显示全部楼层
先把中断打开,再看看硬件的连接有没有错  R->T    T->R
回复

使用道具 举报

ID:400565 发表于 2018-9-20 15:41 | 显示全部楼层
软件运行起来看这个位有没有置位啊
回复

使用道具 举报

ID:388197 发表于 2018-9-20 16:22 | 显示全部楼层
wauuvs 发表于 2018-9-20 13:03
刚尝试了一下,按你所说的,我加上ES=1,EA=1,并把那个延时去掉,TI还是没有自动置位。

我把我自己整理的串口发送的一些函数贴出来,你可以参考下
也可以复制下来直接调用里面的函数,不同的波特率和晶振只需要改下UART.H里面两个DEFINE后面的数字即可有注释说明
//----------uart.c文件-------------------------------
//------------------------------------------------------
//-----------------------------------------------------
//****************************************************************************************
#include "uart.h"

char Uart_get_char;

void UartIsr() interrupt 4
{
        RI = 0;
        Uart_get_char = SBUF;           //读
}

void UartInit()
{
        SCON = 0x50;
        T2L = BRT;                 //波特率设置
        T2H = BRT>>8;
        AUXR = 0x15;
        ES = 1;
        EA = 1;
}

void UartSend(char dat)      //送1个字节
{
        SBUF = dat;
        while(!TI);
        TI = 0;
}

void SendUint(unsigned int value)  //送U16数据
{
        unsigned char valueH = 0;
        unsigned char valueL = 0;
        valueL |= value;
        valueH |= value >> 8;
        UartSend(valueL);
        UartSend(valueH);
       
}

void SendFloat(float_data* float_union)  //送float数据
{
        UartSend(float_union->byte[3]);
        UartSend(float_union->byte[2]);
        UartSend(float_union->byte[1]);
        UartSend(float_union->byte[0]);
}
//***********************************************************************************************
//UART.H----------------------------------------------------------------
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
//***********************************************************************************************
#ifndef __UART_H_
#define __UART_H_
#include <stc8f.h>
#include <intrins.h>
typedef union                                   //float公用体
{
        float value;
        unsigned char byte[4];
}float_data;

#define FOSC 11059200UL                         //晶振频率
#define BRT (65536-FOSC/9600/4)                 //波特率设置

void UartInit();
void UartSend(char dat);
void SendUint(unsigned int value);
void UartSendStr(char *p);
void SendFloat(float_data* float_union);

#endif

//---------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//********************************************************************************************************
//这个是100K 3950热敏电阻经AD转换发送到串口图表软件的程序段,运行完全正常,你可以参考下
        while(1)
        {
                ADC_number = Start_Adc();                                                                                        //读取AD口的电压值
                Ohms = ((float)ADC_number/(4096-(float)ADC_number))*1000;                                     //将电压值转换成欧姆数
                to_save_float.value = (1/(((log((float)Ohms/100000))/3950)+(1/298.15)))-273.15;                //欧姆数转摄氏度
                SendFloat(&to_save_float);                                                                                         //串口发送温度float变量
                Delay100ms();
        }
}
//**********************************************************************************************************
//STC8F.H可以用STC下载软件里面的头文件工具导出
回复

使用道具 举报

ID:387733 发表于 2018-9-21 07:04 | 显示全部楼层
              while(TI==0)                                   //如果一直发送成功,那就蜂鸣器长响。 发送成功则关闭
这条语句后面缺少“;”,于是没有循环等待,很快向下运行到死循环,蜂鸣器自然就长鸣了
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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