熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(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 ... |
本帖最后由 木易陽(yáng) 于 2018-3-21 18:17 編輯 wulin 發(fā)表于 2018-3-20 20:46 謝謝,就是他的外部中斷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ù) } } } } } |
木易陽(yáng) 發(fā)表于 2018-3-20 14:02 芯片沒有硬件串口,也就是說(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; } |
wulin 發(fā)表于 2018-3-20 10:21 就是用的USB線連得串口線,data不能直接給SBUF嗎?為什么?謝謝回答 |
木易陽(yáng) 發(fā)表于 2018-3-20 08:37 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; //然后再開中斷即可 } |
wulin 發(fā)表于 2018-3-19 21:53 資料里的中段3沒看懂啊 |
devcang 發(fā)表于 2018-3-19 22:21 我的外部中斷寫的應(yīng)該有問(wèn)題,不太明白,新手 |
這系列的早期的產(chǎn)品,外部中斷是有問(wèn)題的,,,,,,先弄清楚是不是這個(gè)問(wèn)題影響了 |
參與人數(shù) 1 | 黑幣 +60 | 收起 理由 |
---|---|---|
![]() | + 60 | 回帖助人的獎(jiǎng)勵(lì)! |
芯片型號(hào) : STC15L100 關(guān)于此芯片的重要說(shuō)明: 無(wú)硬件串口,可用軟件模擬串口 (范例代碼中有參考代碼) 有定時(shí)器0和定時(shí)器2 (注意:無(wú)定時(shí)器1) |
Powered by 單片機(jī)教程網(wǎng)