久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3656|回復: 8
收起左側

51單片機STC15L100串口通信外部中斷3

[復制鏈接]
ID:289703 發表于 2018-3-19 20:44 | 顯示全部樓層 |閱讀模式
STC15L100的芯片與ZGB相連,做一個簡單的串口發送數據,發送規定的數據,外部中斷3進行控制,來一個外部中斷,發送一次數據程序,下板之后,下板成功,鏈接串口助手,按下中斷,第一組DATA數據正確,延時后,發送DATA2的數據,DATA2的數據變成了每一個數都延時一次,在發出下一個數,DATA2應該不延時,求大神看看程序,11.0592MHZ的內部晶振,9600波特率。

板子原理圖

板子原理圖


  1. #include <reg51.h>

  2. char  code DATA[19]={0x02, 0x6c, 0x62, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1};        //顯靶
  3. char  code DATA2[19]={0x03, 0x6c, 0x62, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1};        //影靶
  4. //char *ch;
  5. unsigned char i,j;
  6. //-----------------------------------------
  7. //define baudrate const
  8. //BAUD = 65536 - FOSC/3/BAUDRATE/M (1T:M=1; 12T:M=12)
  9. //NOTE: (FOSC/3/BAUDRATE) must be greater then 98, (RECOMMEND GREATER THEN 110)

  10. #define BAUD  0xFE80    // 9600bps @ 11.0592MHz

  11. sfr AUXR = 0x8E;
  12. sfr INT_CLKO = 0x8f;

  13. sbit RXB = P3^0;       //define UART TX/RX port
  14. sbit TXB = P3^1;
  15. sbit T3 =  P3^5;
  16. sbit led = P3^4;

  17. typedef bit BOOL;
  18. typedef unsigned char BYTE;
  19. typedef unsigned int WORD;

  20. BYTE TBUF,RBUF;//字節
  21. BYTE TDAT,RDAT;
  22. BYTE TCNT,RCNT;
  23. BYTE TBIT,RBIT;
  24. BOOL TING,RING;
  25. BOOL TEND,REND;

  26. void UART_INIT();
  27. void uart1_TX();
  28. BYTE r;
  29. BYTE buf[16];
  30. unsigned int k=0;
  31. //-----------------------------------------
  32. //initial UART module variable
  33. void delay(unsigned int n)
  34. {
  35.     unsigned int w=0;
  36.     while(n--)
  37.         for(w=0;w<114;w++);
  38. }
  39. void UART_INIT()
  40. {
  41.     TING = 0;
  42.     RING = 0;
  43.     TEND = 1;
  44.     REND = 0;
  45.     TCNT = 0;
  46.     RCNT = 0;
  47. }  

  48. void exint3() interrupt 11
  49. {
  50.   while(T3==0);
  51.    delay(10);
  52.    while(T3==0)
  53.    k = 1;
  54.    i = 0;
  55.    j = 0;
  56.    led = 0;                  
  57. }         

  58. void uart3i()
  59. {
  60.                           if(i<19)
  61.                                   {
  62.                                         TEND = 0;                  //發送完一個字符清一次
  63.                         TBUF = DATA[i];//發送緩沖器 進行賦值
  64.                         TING = 1;
  65.                                         i++;        
  66.                                  }
  67. }

  68. void uart3j()
  69. {
  70.                           if(j<19)
  71.                                   {
  72.                                         TEND = 0;                  //發送完一個字符清一次
  73.                         TBUF = DATA2[j];//發送緩沖器 進行賦值
  74.                         TING = 1;
  75.                                         j++;        
  76.                                  }
  77. }


  78. void main()
  79. {
  80.     TMOD = 0x00;                        //timer0 in 16-bit auto reload mode定時器0在16位自動重新加載模式下
  81.     AUXR = 0x80;                        //timer0 working at 1T mode定時器0在1T模式下工作
  82.     TL0 = BAUD;
  83.     TH0 = BAUD>>8;                      //initial timer0 and set reload value初始計時器0并設置重新加載值
  84.     TR0 = 1;                            //tiemr0 start runningtimer0 tiemr0開始運行
  85.     ET0 = 1;                            //enable timer0 interrupt使timer0中斷
  86.     PT0 = 1;                            //improve timer0 interrupt priority提高定時器0中斷優先級
  87.     EA = 1;                                                         //總中斷
  88.         led = 0;  
  89.         INT_CLKO |= 0x20;                        
  90.     UART_INIT();         
  91.         while (1)
  92.         {                                   //user's function
  93.         if (REND)   
  94.         {
  95.                     REND = 0;
  96.             buf[r++ & 0x0f] = RBUF; //接收緩沖器 高四位清0低四位賦值
  97.         }
  98.        if(k == 1)
  99.                 {
  100.                         if (TEND)
  101.                 {
  102.                         {                                                                 
  103.                         uart3i();                                         
  104.                         }
  105.                      if(i==19)
  106.                                  delay(1000);
  107.                           {
  108.                                  uart3j();
  109.                                 if(j==19)
  110.                                  {
  111.                                    k = 0;
  112.                                  }
  113.                           }
  114.                         }
  115.                 }
  116.         }        
  117. }  



  118. //-----------------------------------------
  119. //Timer interrupt routine for UART計時器中斷串口

  120. void tm0() interrupt 1 using 1
  121. { //****************接收數據******************/
  122.     if (RING) //正在接受數據
  123.     {
  124.         if (--RCNT == 0)
  125.         {
  126.             RCNT = 3;                   //reset send baudrate counter        復位發送波特率計數器        
  127.             if (--RBIT == 0)
  128.             {
  129.                 RBUF = RDAT;            //save the data to RDAT數據保存到RBUF中
  130.                 RING = 0;               //stop receive        停止接受
  131.                 REND = 1;               //set receive completed flag設置接收完成標志
  132.             }
  133.             else
  134.             {
  135.                 RDAT >>= 1;                                //接收到的單bit數據暫存
  136.                 if (RXB) RDAT |= 0x80;  //shift RX data to RX buffer  將RX數據轉移到RX緩沖區
  137.             }
  138.         }
  139.     }
  140.     else if (!RXB)//判斷開始位RXB=0
  141.     {
  142.         RING = 1;                       //set start receive flag 設置開始接收標志
  143.         RCNT = 4;                       //initial receive baudrate counter 初始接收波特率計數器
  144.         RBIT = 9;                       //initial receive bit number (8 data bits + 1 stop bit) 初始接收位(8位數據位1停止位)
  145.     }
  146.     //*******************發送********************/
  147.     if (--TCNT == 0)
  148.     {
  149.         TCNT = 3;                       //reset send baudrate counter  復位發送波特率計數器
  150.         if (TING)                       //judge whether sending  判斷是否發送
  151.         {
  152.             if (TBIT == 0)
  153.             {
  154.                 TXB = 0;                //send start bit  發送起始位
  155.                 TDAT = TBUF;            //load data from TBUF to TDAT  數據從TBUF加載到TDAT
  156.                 TBIT = 9;               //initial send bit number (8 data bits + 1 stop bit)初始發送位(8位數據位1停止位)
  157.             }
  158.             else
  159.             {
  160.                 TDAT >>= 1;             //shift data to CY將 數據右移1位,低位送給CY
  161.                 if (--TBIT == 0)
  162.                 {
  163.                     TXB = 1;                        //發送停止位數據
  164.                     TING = 0;           //stop send發送停止位
  165.                     TEND = 1;           //set send completed flag設置發送完成標志
  166.                 }
  167.                 else
  168.                 {
  169.                     TXB = CY;           //write CY to TX port 發送單bit數據
  170.                 }
  171.             }
  172.         }
  173.     }
  174. }

復制代碼
回復

使用道具 舉報

ID:213173 發表于 2018-3-19 21:53 | 顯示全部樓層
芯片型號 : STC15L100

關于此芯片的重要說明:
  無硬件串口,可用軟件模擬串口 (范例代碼中有參考代碼)
  有定時器0和定時器2 (注意:無定時器1)
回復

使用道具 舉報

ID:277550 發表于 2018-3-19 22:21 | 顯示全部樓層

這系列的早期的產品,外部中斷是有問題的,,,,,,先弄清楚是不是這個問題影響了

評分

參與人數 1黑幣 +60 收起 理由
admin + 60 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:289703 發表于 2018-3-20 08:27 | 顯示全部樓層
devcang 發表于 2018-3-19 22:21
這系列的早期的產品,外部中斷是有問題的,,,,,,先弄清楚是不是這個問題影響了

我的外部中斷寫的應該有問題,不太明白,新手
回復

使用道具 舉報

ID:289703 發表于 2018-3-20 08:37 | 顯示全部樓層
wulin 發表于 2018-3-19 21:53
芯片型號 : STC15L100

關于此芯片的重要說明:

資料里的中段3沒看懂啊
回復

使用道具 舉報

ID:213173 發表于 2018-3-20 10:21 | 顯示全部樓層
木易陽 發表于 2018-3-20 08:37
資料里的中段3沒看懂啊

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

2.外部中斷3允許位  INT_CLKO |= 0x20;  //(EX3 = 1)使能INT3中斷
void exint3() interrupt 11          //INT3中斷入口
{
    中斷任務......   
//  INT_CLKO &= 0xDF;   //若需要手動清除中斷標志,可先關閉中斷,此時系統會自動清除內部的中斷標志
//  INT_CLKO |= 0x20;    //然后再開中斷即可
}
回復

使用道具 舉報

ID:289703 發表于 2018-3-20 14:02 | 顯示全部樓層
wulin 發表于 2018-3-20 10:21
1.此芯片沒有硬件串口, SBUF = DATA[a]; 有什么用?要用軟件模擬串口

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

就是用的USB線連得串口線,data不能直接給SBUF嗎?為什么?謝謝回答
回復

使用道具 舉報

ID:213173 發表于 2018-3-20 20:46 | 顯示全部樓層
木易陽 發表于 2018-3-20 14:02
就是用的USB線連得串口線,data不能直接給SBUF嗎?為什么?謝謝回答

芯片沒有硬件串口,也就是說沒有與串口相關的寄存器,當然也就沒有SBUF寄存器!
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC15Fxx 系列 軟件模擬串口舉例----------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966-------------------------*/
/* 如果要在程序中使用此代碼,請在程序中注明使用了STC的資料及程序        */
/* 如果要在文章中應用此代碼,請在文章中注明使用了STC的資料及程序        */
/*---------------------------------------------------------------------*/

//本示例在Keil開發環境下請選擇Intel的8058芯片型號進行編譯
//若無特別說明,工作頻率一般為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 發表于 2018-3-21 10:40 | 顯示全部樓層
本帖最后由 木易陽 于 2018-3-21 18:17 編輯
wulin 發表于 2018-3-20 20:46
芯片沒有硬件串口,也就是說沒有與串口相關的寄存器,當然也就沒有SBUF寄存器!
/*-------------------- ...

謝謝,就是他的外部中斷3是怎么控制的,比如說我按下按鍵發出外部中斷3信號,串口開始發送DATA里的數據,但是數據發送是亂碼
#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;//字節
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定時器0在16位自動重新加載模式下
    AUXR = 0x80;                        //timer0 working at 1T mode定時器0在1T模式下工作
    TL0 = BAUD;
    TH0 = BAUD>>8;                      //initial timer0 and set reload value初始計時器0并設置重新加載值
    TR0 = 1;                            //tiemr0 start runningtimer0 tiemr0開始運行
    ET0 = 1;                            //enable timer0 interrupt使timer0中斷
    PT0 = 1;                            //improve timer0 interrupt priority提高定時器0中斷優先級
    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;    //發送完一個字符清一次
                 TBUF = DATA;//發送緩沖器 進行賦值
                 TING = 1;
     }
      k = 0;
      }
  }
     }
}

//-----------------------------------------
//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 RDAT數據保存到RBUF中
                RING = 0;               //stop receive 停止接受
                REND = 1;               //set receive completed flag設置接收完成標志
            }
            else
            {
                RDAT >>= 1;    //接收到的單bit數據暫存
                if (RXB) RDAT |= 0x80;  //shift RX data to RX buffer  將RX數據轉移到RX緩沖區
            }
        }
    }
    else if (!RXB)//判斷開始位RXB=0
    {
        RING = 1;                       //set start receive flag 設置開始接收標志
        RCNT = 4;                       //initial receive baudrate counter 初始接收波特率計數器
        RBIT = 9;                       //initial receive bit number (8 data bits + 1 stop bit) 初始接收位(8位數據位1停止位)
    }
    //*******************發送********************/
    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  數據從TBUF加載到TDAT
                TBIT = 9;               //initial send bit number (8 data bits + 1 stop bit)初始發送位(8位數據位1停止位)
            }
            else
            {
                TDAT >>= 1;             //shift data to CY將 數據右移1位,低位送給CY
                if (--TBIT == 0)
                {
                    TXB = 1;   //發送停止位數據
                    TING = 0;           //stop send發送停止位
                    TEND = 1;           //set send completed flag設置發送完成標志
                }
                else
                {
                    TXB = CY;           //write CY to TX port 發送單bit數據
                }
            }
        }
    }
}

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久国产 | 日本午夜一区二区三区 | 亚洲精品一 | 日本精品视频 | 成人av一区二区亚洲精 | 免费xxxx大片国产在线 | av色噜噜 | 国产91在线播放精品91 | 久久久国产一区 | 久久久精品 | 国产精品视频久久久 | 999热精品视频| 中文字幕加勒比 | 免费在线观看91 | 特黄视频 | 最新伦理片 | 性国产丰满麻豆videosex | 久草网免费 | 亚洲免费观看视频网站 | 国产精品网址 | 91精品在线播放 | 国产亚洲一区二区精品 | 亚洲性在线 | 国产精品美女在线观看 | 精品成人佐山爱一区二区 | 韩国毛片一区二区三区 | 亚洲视频在线看 | 视频一区在线 | 毛片大全| 亚洲精品一区二区 | 中文字幕电影在线观看 | 久久精品91久久久久久再现 | m豆传媒在线链接观看 | 日本免费在线观看视频 | 播放一级毛片 | 久久日韩粉嫩一区二区三区 | 亚洲成人av | 成人欧美一区二区三区白人 | 欧美又大粗又爽又黄大片视频 | 亚洲国产精品99久久久久久久久 | 日韩成人 |