找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索

51單片機(jī)STC15L100串口通信外部中斷3

查看數(shù): 3749 | 評(píng)論數(shù): 8 | 收藏 0
關(guān)燈 | 提示:支持鍵盤翻頁(yè)<-左 右->
    組圖打開中,請(qǐng)稍候......
發(fā)布時(shí)間: 2018-3-19 20:44

正文摘要:

STC15L100的芯片與ZGB相連,做一個(gè)簡(jiǎn)單的串口發(fā)送數(shù)據(jù),發(fā)送規(guī)定的數(shù)據(jù),外部中斷3進(jìn)行控制,來(lái)一個(gè)外部中斷,發(fā)送一次數(shù)據(jù)程序,下板之后,下板成功,鏈接串口助手,按下中斷,第一組DATA數(shù)據(jù)正確,延時(shí)后,發(fā)送DAT ...

回復(fù)

ID:289703 發(fā)表于 2018-3-21 10:40
本帖最后由 木易陽(yáng) 于 2018-3-21 18:17 編輯
wulin 發(fā)表于 2018-3-20 20:46
芯片沒有硬件串口,也就是說(shuō)沒有與串口相關(guān)的寄存器,當(dāng)然也就沒有SBUF寄存器!
/*-------------------- ...

謝謝,就是他的外部中斷3是怎么控制的,比如說(shuō)我按下按鍵發(fā)出外部中斷3信號(hào),串口開始發(fā)送DATA里的數(shù)據(jù),但是數(shù)據(jù)發(fā)送是亂碼
#include <reg51.h>
  
char  code DATA[19]={0x02, 0x6c, 0x62, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1}; //隱
unsigned char i=0;
//-----------------------------------------
//define baudrate const
//BAUD = 65536 - FOSC/3/BAUDRATE/M (1T:M=1; 12T:M=12)
//NOTE: (FOSC/3/BAUDRATE) must be greater then 98, (RECOMMEND GREATER THEN 110)
#define BAUD  0xFE80                   // 9600bps @ 11.0592MHz
sfr AUXR = 0x8E;
sfr INT_CLKO = 0x8f;
sbit RXB = P3^0;                        //define UART TX/RX port
sbit TXB = P3^1;
sbit T3 =  P3^5;
sbit led = P3^4;
typedef bit BOOL;
typedef unsigned char BYTE;
typedef unsigned int WORD;
BYTE TBUF,RBUF;//字節(jié)
BYTE TDAT,RDAT;
BYTE TCNT,RCNT;
BYTE TBIT,RBIT;
BOOL TING,RING;
BOOL TEND,REND;
void UART_INIT();
BYTE r;
BYTE buf[16];
  int k=0;
//-----------------------------------------
//initial UART module variable
void UART_INIT()
{
    TING = 0;
    RING = 0;
    TEND = 1;
    REND = 0;
    TCNT = 0;
    RCNT = 0;
}  
void exint3() interrupt 11
{
   k = 1;
   led = 1;

}   
void main()
{
    TMOD = 0x00;                        //timer0 in 16-bit auto reload mode定時(shí)器0在16位自動(dòng)重新加載模式下
    AUXR = 0x80;                        //timer0 working at 1T mode定時(shí)器0在1T模式下工作
    TL0 = BAUD;
    TH0 = BAUD>>8;                      //initial timer0 and set reload value初始計(jì)時(shí)器0并設(shè)置重新加載值
    TR0 = 1;                            //tiemr0 start runningtimer0 tiemr0開始運(yùn)行
    ET0 = 1;                            //enable timer0 interrupt使timer0中斷
    PT0 = 1;                            //improve timer0 interrupt priority提高定時(shí)器0中斷優(yōu)先級(jí)
    EA = 1;        //總中斷
led = 0;  
INT_CLKO |= 0x20;                        
    UART_INIT();
  
while (1)
{                                   //user's function
        if (REND)   
        {
            REND = 0;
            buf[r++ & 0x0f] = RBUF; //接收緩沖器 高四位清0低四位賦值
        }
        if(k == 1)
  {
   if (TEND)
         {     
     for(i=0;i<19;i++)//            
         {
     TEND = 0;    //發(fā)送完一個(gè)字符清一次
                 TBUF = DATA;//發(fā)送緩沖器 進(jìn)行賦值
                 TING = 1;
     }
      k = 0;
      }
  }
     }
}

//-----------------------------------------
//Timer interrupt routine for UART計(jì)時(shí)器中斷串口
void tm0() interrupt 1 using 1
{ //****************接收數(shù)據(jù)******************/
    if (RING) //正在接受數(shù)據(jù)
    {
        if (--RCNT == 0)
        {
            RCNT = 3;                   //reset send baudrate counter 復(fù)位發(fā)送波特率計(jì)數(shù)器
            if (--RBIT == 0)
            {
                RBUF = RDAT;            //save the data to RDAT數(shù)據(jù)保存到RBUF中
                RING = 0;               //stop receive 停止接受
                REND = 1;               //set receive completed flag設(shè)置接收完成標(biāo)志
            }
            else
            {
                RDAT >>= 1;    //接收到的單bit數(shù)據(jù)暫存
                if (RXB) RDAT |= 0x80;  //shift RX data to RX buffer  將RX數(shù)據(jù)轉(zhuǎn)移到RX緩沖區(qū)
            }
        }
    }
    else if (!RXB)//判斷開始位RXB=0
    {
        RING = 1;                       //set start receive flag 設(shè)置開始接收標(biāo)志
        RCNT = 4;                       //initial receive baudrate counter 初始接收波特率計(jì)數(shù)器
        RBIT = 9;                       //initial receive bit number (8 data bits + 1 stop bit) 初始接收位(8位數(shù)據(jù)位1停止位)
    }
    //*******************發(fā)送********************/
    if (--TCNT == 0)
    {
        TCNT = 3;                       //reset send baudrate counter  復(fù)位發(fā)送波特率計(jì)數(shù)器
        if (TING)                       //judge whether sending  判斷是否發(fā)送
        {
            if (TBIT == 0)
            {
                TXB = 0;                //send start bit  發(fā)送起始位
                TDAT = TBUF;            //load data from TBUF to TDAT  數(shù)據(jù)從TBUF加載到TDAT
                TBIT = 9;               //initial send bit number (8 data bits + 1 stop bit)初始發(fā)送位(8位數(shù)據(jù)位1停止位)
            }
            else
            {
                TDAT >>= 1;             //shift data to CY將 數(shù)據(jù)右移1位,低位送給CY
                if (--TBIT == 0)
                {
                    TXB = 1;   //發(fā)送停止位數(shù)據(jù)
                    TING = 0;           //stop send發(fā)送停止位
                    TEND = 1;           //set send completed flag設(shè)置發(fā)送完成標(biāo)志
                }
                else
                {
                    TXB = CY;           //write CY to TX port 發(fā)送單bit數(shù)據(jù)
                }
            }
        }
    }
}

ID:213173 發(fā)表于 2018-3-20 20:46
木易陽(yáng) 發(fā)表于 2018-3-20 14:02
就是用的USB線連得串口線,data不能直接給SBUF嗎?為什么?謝謝回答

芯片沒有硬件串口,也就是說(shuō)沒有與串口相關(guān)的寄存器,當(dāng)然也就沒有SBUF寄存器!
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC15Fxx 系列 軟件模擬串口舉例----------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966-------------------------*/
/* 如果要在程序中使用此代碼,請(qǐng)?jiān)诔绦蛑凶⒚魇褂昧薙TC的資料及程序        */
/* 如果要在文章中應(yīng)用此代碼,請(qǐng)?jiān)谖恼轮凶⒚魇褂昧薙TC的資料及程序        */
/*---------------------------------------------------------------------*/

//本示例在Keil開發(fā)環(huán)境下請(qǐng)選擇Intel的8058芯片型號(hào)進(jìn)行編譯
//若無(wú)特別說(shuō)明,工作頻率一般為11.0592MHz


#include "reg51.h"

//-----------------------------------------
//define baudrate const
//BAUD = 65536 - FOSC/3/BAUDRATE/M (1T:M=1; 12T:M=12)
//NOTE: (FOSC/3/BAUDRATE) must be greater then 98, (RECOMMEND GREATER THEN 110)

//#define BAUD  0xF400                  // 1200bps @ 11.0592MHz
//#define BAUD  0xFA00                  // 2400bps @ 11.0592MHz
//#define BAUD  0xFD00                  // 4800bps @ 11.0592MHz
//#define BAUD  0xFE80                  // 9600bps @ 11.0592MHz
//#define BAUD  0xFF40                  //19200bps @ 11.0592MHz
#define BAUD  0xFFA0                    //38400bps @ 11.0592MHz

//#define BAUD  0xEC00                  // 1200bps @ 18.432MHz
//#define BAUD  0xF600                  // 2400bps @ 18.432MHz
//#define BAUD  0xFB00                  // 4800bps @ 18.432MHz
//#define BAUD  0xFD80                  // 9600bps @ 18.432MHz
//#define BAUD  0xFEC0                  //19200bps @ 18.432MHz
//#define BAUD    0xFF60                //38400bps @ 18.432MHz

//#define BAUD  0xE800                  // 1200bps @ 22.1184MHz
//#define BAUD  0xF400                  // 2400bps @ 22.1184MHz
//#define BAUD  0xFA00                  // 4800bps @ 22.1184MHz
//#define BAUD  0xFD00                  // 9600bps @ 22.1184MHz
//#define BAUD  0xFE80                  //19200bps @ 22.1184MHz
//#define BAUD  0xFF40                  //38400bps @ 22.1184MHz
//#define BAUD  0xFF80                  //57600bps @ 22.1184MHz

sfr AUXR = 0x8E;
sbit RXB = P3^0;                        //define UART TX/RX port
sbit TXB = P3^1;

typedef bit BOOL;
typedef unsigned char BYTE;
typedef unsigned int WORD;

BYTE TBUF,RBUF;
BYTE TDAT,RDAT;
BYTE TCNT,RCNT;
BYTE TBIT,RBIT;
BOOL TING,RING;
BOOL TEND,REND;

void UART_INIT();

BYTE t, r;
BYTE buf[16];

void main()
{
    TMOD = 0x00;                        //timer0 in 16-bit auto reload mode
    AUXR = 0x80;                        //timer0 working at 1T mode
    TL0 = BAUD;
    TH0 = BAUD>>8;                      //initial timer0 and set reload value
    TR0 = 1;                            //tiemr0 start running
    ET0 = 1;                            //enable timer0 interrupt
    PT0 = 1;                            //improve timer0 interrupt priority
    EA = 1;                             //open global interrupt switch

    UART_INIT();

    while (1)
    {                                   //user's function
        if (REND)
        {
            REND = 0;
            buf[r++ & 0x0f] = RBUF;
        }
        if (TEND)
        {
            if (t != r)
            {
                TEND = 0;
                TBUF = buf[t++ & 0x0f];
                TING = 1;
            }
        }
    }
}

//-----------------------------------------
//Timer interrupt routine for UART

void tm0() interrupt 1 using 1
{
    if (RING)
    {
        if (--RCNT == 0)
        {
            RCNT = 3;                   //reset send baudrate counter
            if (--RBIT == 0)
            {
                RBUF = RDAT;            //save the data to RBUF
                RING = 0;               //stop receive
                REND = 1;               //set receive completed flag
            }
            else
            {
                RDAT >>= 1;
                if (RXB) RDAT |= 0x80;  //shift RX data to RX buffer
            }
        }
    }
    else if (!RXB)
    {
        RING = 1;                       //set start receive flag
        RCNT = 4;                       //initial receive baudrate counter
        RBIT = 9;                       //initial receive bit number (8 data bits + 1 stop bit)
    }

    if (--TCNT == 0)
    {
        TCNT = 3;                       //reset send baudrate counter
        if (TING)                       //judge whether sending
        {
            if (TBIT == 0)
            {
                TXB = 0;                //send start bit
                TDAT = TBUF;            //load data from TBUF to TDAT
                TBIT = 9;               //initial send bit number (8 data bits + 1 stop bit)
            }
            else
            {
                TDAT >>= 1;             //shift data to CY
                if (--TBIT == 0)
                {
                    TXB = 1;
                    TING = 0;           //stop send
                    TEND = 1;           //set send completed flag
                }
                else
                {
                    TXB = CY;           //write CY to TX port
                }
            }
        }
    }
}

//-----------------------------------------
//initial UART module variable

void UART_INIT()
{
    TING = 0;
    RING = 0;
    TEND = 1;
    REND = 0;
    TCNT = 0;
    RCNT = 0;
}

ID:289703 發(fā)表于 2018-3-20 14:02
wulin 發(fā)表于 2018-3-20 10:21
1.此芯片沒有硬件串口, SBUF = DATA[a]; 有什么用?要用軟件模擬串口

2.外部中斷3允許位  INT_CLKO | ...

就是用的USB線連得串口線,data不能直接給SBUF嗎?為什么?謝謝回答
ID:213173 發(fā)表于 2018-3-20 10:21
木易陽(yáng) 發(fā)表于 2018-3-20 08:37
資料里的中段3沒看懂啊

1.此芯片沒有硬件串口, SBUF = DATA[a]; 有什么用?要用軟件模擬串口

2.外部中斷3允許位  INT_CLKO |= 0x20;  //(EX3 = 1)使能INT3中斷
void exint3() interrupt 11          //INT3中斷入口
{
    中斷任務(wù)......   
//  INT_CLKO &= 0xDF;   //若需要手動(dòng)清除中斷標(biāo)志,可先關(guān)閉中斷,此時(shí)系統(tǒng)會(huì)自動(dòng)清除內(nèi)部的中斷標(biāo)志
//  INT_CLKO |= 0x20;    //然后再開中斷即可
}
ID:289703 發(fā)表于 2018-3-20 08:37
wulin 發(fā)表于 2018-3-19 21:53
芯片型號(hào) : STC15L100

關(guān)于此芯片的重要說(shuō)明:

資料里的中段3沒看懂啊
ID:289703 發(fā)表于 2018-3-20 08:27
devcang 發(fā)表于 2018-3-19 22:21
這系列的早期的產(chǎn)品,外部中斷是有問(wèn)題的,,,,,,先弄清楚是不是這個(gè)問(wèn)題影響了

我的外部中斷寫的應(yīng)該有問(wèn)題,不太明白,新手
ID:277550 發(fā)表于 2018-3-19 22:21

這系列的早期的產(chǎn)品,外部中斷是有問(wèn)題的,,,,,,先弄清楚是不是這個(gè)問(wèn)題影響了

評(píng)分

參與人數(shù) 1黑幣 +60 收起 理由
admin + 60 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

ID:213173 發(fā)表于 2018-3-19 21:53
芯片型號(hào) : STC15L100

關(guān)于此芯片的重要說(shuō)明:
  無(wú)硬件串口,可用軟件模擬串口 (范例代碼中有參考代碼)
  有定時(shí)器0和定時(shí)器2 (注意:無(wú)定時(shí)器1)

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

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

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