找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4592|回復(fù): 8
收起左側(cè)

為什么單片機(jī)串口發(fā)送之后TI不會自動置位?

[復(fù)制鏈接]
ID:323998 發(fā)表于 2018-9-20 11:45 | 顯示全部樓層 |閱讀模式
  求助,我使用的是STC15W408AS單片機(jī),然后現(xiàn)在進(jìn)行雙機(jī)串口通信,一直沒有通信,于是我就進(jìn)行查詢了,不知道是不是軟件出現(xiàn)問題了。程序如下:


實(shí)驗(yàn)的結(jié)果是,一通電,蜂鳴器鳴響一下,然后就一直長鳴了。
那就是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();                                                        //蜂鳴器開機(jī)鳴響一下,意味著到了這一步。

                SBUF=0xA0;                                                                //發(fā)送數(shù)據(jù),稍微延時(shí)一下等待檢測。
                Delay100ms();                                                                        
                //if(TI==1)
                        
                while(TI==0)                                                        //如果一直發(fā)送成功,那就蜂鳴器長響。 發(fā)送成功則關(guān)閉
                BEE=1;
                 TI=0;                                                                                
               
                BEE=0;
                while(1);                                                        //卡住它 不讓執(zhí)行第二次

}





回復(fù)

使用道具 舉報(bào)

ID:388197 發(fā)表于 2018-9-20 12:28 | 顯示全部樓層
總中斷EA 串口中斷ES沒打開,另外SBUF發(fā)送后面的那個(gè)DELAY可以去掉
回復(fù)

使用道具 舉報(bào)

ID:323998 發(fā)表于 2018-9-20 13:03 | 顯示全部樓層
cjm82 發(fā)表于 2018-9-20 12:28
總中斷EA 串口中斷ES沒打開,另外SBUF發(fā)送后面的那個(gè)DELAY可以去掉

剛嘗試了一下,按你所說的,我加上ES=1,EA=1,并把那個(gè)延時(shí)去掉,TI還是沒有自動置位。
回復(fù)

使用道具 舉報(bào)

ID:398663 發(fā)表于 2018-9-20 13:16 | 顯示全部樓層
一般蜂鳴器低電平是啟動。
回復(fù)

使用道具 舉報(bào)

ID:304235 發(fā)表于 2018-9-20 14:14 | 顯示全部樓層
你程序里只有發(fā)送的程序沒有接受的程序  接受的程序是在串口中斷ES進(jìn)行的 也就是說你要在設(shè)置好串口波特率之后開啟總中斷EA 串口終端ES  while(TI==0)上面那個(gè)延時(shí)不需要 直接更while(TI==0)就可以了。
回復(fù)

使用道具 舉報(bào)

ID:149144 發(fā)表于 2018-9-20 15:23 | 顯示全部樓層
先把中斷打開,再看看硬件的連接有沒有錯(cuò)  R->T    T->R
回復(fù)

使用道具 舉報(bào)

ID:400565 發(fā)表于 2018-9-20 15:41 | 顯示全部樓層
軟件運(yùn)行起來看這個(gè)位有沒有置位啊
回復(fù)

使用道具 舉報(bào)

ID:388197 發(fā)表于 2018-9-20 16:22 | 顯示全部樓層
wauuvs 發(fā)表于 2018-9-20 13:03
剛嘗試了一下,按你所說的,我加上ES=1,EA=1,并把那個(gè)延時(shí)去掉,TI還是沒有自動置位。

我把我自己整理的串口發(fā)送的一些函數(shù)貼出來,你可以參考下
也可以復(fù)制下來直接調(diào)用里面的函數(shù),不同的波特率和晶振只需要改下UART.H里面兩個(gè)DEFINE后面的數(shù)字即可有注釋說明
//----------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;                 //波特率設(shè)置
        T2H = BRT>>8;
        AUXR = 0x15;
        ES = 1;
        EA = 1;
}

void UartSend(char dat)      //送1個(gè)字節(jié)
{
        SBUF = dat;
        while(!TI);
        TI = 0;
}

void SendUint(unsigned int value)  //送U16數(shù)據(jù)
{
        unsigned char valueH = 0;
        unsigned char valueL = 0;
        valueL |= value;
        valueH |= value >> 8;
        UartSend(valueL);
        UartSend(valueH);
       
}

void SendFloat(float_data* float_union)  //送float數(shù)據(jù)
{
        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)                 //波特率設(shè)置

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

#endif

//---------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//********************************************************************************************************
//這個(gè)是100K 3950熱敏電阻經(jīng)AD轉(zhuǎn)換發(fā)送到串口圖表軟件的程序段,運(yùn)行完全正常,你可以參考下
        while(1)
        {
                ADC_number = Start_Adc();                                                                                        //讀取AD口的電壓值
                Ohms = ((float)ADC_number/(4096-(float)ADC_number))*1000;                                     //將電壓值轉(zhuǎn)換成歐姆數(shù)
                to_save_float.value = (1/(((log((float)Ohms/100000))/3950)+(1/298.15)))-273.15;                //歐姆數(shù)轉(zhuǎn)攝氏度
                SendFloat(&to_save_float);                                                                                         //串口發(fā)送溫度float變量
                Delay100ms();
        }
}
//**********************************************************************************************************
//STC8F.H可以用STC下載軟件里面的頭文件工具導(dǎo)出
回復(fù)

使用道具 舉報(bào)

ID:387733 發(fā)表于 2018-9-21 07:04 | 顯示全部樓層
              while(TI==0)                                   //如果一直發(fā)送成功,那就蜂鳴器長響。 發(fā)送成功則關(guān)閉
這條語句后面缺少“;”,于是沒有循環(huán)等待,很快向下運(yùn)行到死循環(huán),蜂鳴器自然就長鳴了
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表