久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
C51單片機執行串口中斷怎樣不阻礙主程序?
[打印本頁]
作者:
111111yfyf
時間:
2023-3-14 21:58
標題:
C51單片機執行串口中斷怎樣不阻礙主程序?
C51執行串口中斷怎樣不阻礙主程序執行串口接收中斷時while中主程序卡住有什么方法可以既可以執行主程序也能接收串口出來的數據
作者:
Hephaestus
時間:
2023-3-14 22:48
串口中斷一定要快進快出給個信號量semaphore通知主程序已經發生串口接收事件就趕緊退出千萬不要猶豫否則一定會耽誤主程序的執行在中斷里面加延遲更是大忌
作者:
huashanhui20
時間:
2023-3-14 22:54
定義一個串口緩存區,每次串口中斷只處理一個數據判斷正確先放到緩存,緩存到指定數量就再處理
作者:
lkc8210
時間:
2023-3-14 23:17
加個發送數組
把數據放進數組
在中斷內一個一個的發
作者:
非凡科技
時間:
2023-3-15 08:53
降低串口中斷的優先等級,切勿在串口中斷加阻塞延時
作者:
111111yfyf
時間:
2023-3-15 09:01
各位有具體代碼實現步驟嗎,利用數組存儲數據,數組滿后執行還是不可
作者:
rctty
時間:
2023-3-15 10:42
單片機是單線程,所以中斷一定會阻礙主程序執行,只能通過快進快出來降低影響,快進不用你管,快出就盡量減少中斷中的代碼,delay等強制等待更是不要;
串口接收的話,定一個協議,當出現連續的幾個數,則認為是串口發起,比如我認為,當收到的前兩個數據為0x7F,0x55 ,這是正常通信發起,那接下來繼續接收,直到收到我需要的長度,再對收到的數據進行校驗即可
作者:
devcang
時間:
2023-3-15 12:16
單線程,不影響是不可能的,使用緩沖,可以減少影響
作者:
angmall
時間:
2023-3-15 13:06
111111yfyf 發表于 2023-3-15 09:01
各位有具體代碼實現步驟嗎,利用數組存儲數據,數組滿后執行還是不可
給你一個示例參考
/*------------------------------------------------------------------*/
/* --- STC MCU International Limited -------------------------------*/
/* --- STC 1T Series MCU RC Demo -----------------------------------*/
/* If you want to use the program or the program referenced in the */
/* article, please specify in which data and procedures from STC */
/*------------------------------------------------------------------*/
/*********************************************************/
// #define MAIN_Fosc 24000000L //定義主時鐘
// #define MAIN_Fosc 22118400L //定義主時鐘
#define MAIN_Fosc 11059200L //定義主時鐘
#include "..\..\STC8Gxxx.h"
/************* 功能說明 **************
請先別修改程序, 直接下載"06-串口1-串口2-同時中斷收發-C語言"里的"UART1-UART2.hex"測試,主頻選擇11.0592MHZ. 測試正常后再修改移植.
2個串口(串口1 串口2)全雙工中斷方式收發通訊程序。
通過PC向MCU發送數據, MCU收到后通過串口把收到的數據原樣返回.
默認參數:
所有串口均設置均為 1位起始位, 8位數據位, 1位停止位, 無校驗.
每個串口可以使用不同的波特率.
串口1(P3.0 P3.1): 115200bps.
串口2(P1.0 P1.1): 57600bps.
******************************************/
/************* 本地常量聲明 **************/
#define RX1_Length 128 /* 接收緩沖長度 */
#define RX2_Length 128 /* 接收緩沖長度 */
/************* 本地變量聲明 **************/
u8 xdata RX1_Buffer[RX1_Length]; //接收緩沖
u8 xdata RX2_Buffer[RX2_Length]; //接收緩沖
u8 TX1_read,RX1_write; //讀寫索引(指針).
u8 TX2_read,RX2_write; //讀寫索引(指針).
bit B_TX1_Busy,B_TX2_Busy; // 發送忙標志
/************* 本地函數聲明 **************/
void UART1_config(u32 brt, u8 timer, u8 io); // brt: 通信波特率, timer=2: 波特率使用定時器2, 其它值: 使用Timer1做波特率. io=0: 串口1切換到P3.0 P3.1, =1: 切換到P3.6 P3.7, =2: 切換到P1.6 P1.7, =3: 切換到P4.3 P4.4.
void UART2_config(u32 brt, u8 timer, u8 io); // brt: 通信波特率, timer=任意值: 波特率使用定時器2. io=0: 串口2切換到P1.0 P1.1, =1: 切換到P4.6 P4.7.
void UART1_PrintString(u8 *puts);
void UART2_PrintString(u8 *puts);
//========================================================================
// 函數: void main(void)
// 描述: 主函數
// 參數: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2018-4-2
// 備注:
//========================================================================
void main(void)
{
u8 i;
EAXRAM();
UART1_config(115200UL, 1, 0); // brt: 通信波特率, timer=2: 波特率使用定時器2, 其它值: 使用Timer1做波特率. io=0: 串口1切換到P3.0 P3.1, =1: 切換到P3.6 P3.7, =2: 切換到P1.6 P1.7, =3: 切換到P4.3 P4.4.
UART2_config( 57600UL, 2, 0); // brt: 通信波特率, timer=任意值: 波特率使用定時器2. io=0: 串口2切換到P1.0 P1.1, =1: 切換到P4.6 P4.7.
EA = 1;
for(i=0; i<RX1_Length; i++) RX1_Buffer[i] = 0;
B_TX1_Busy = 0;
TX1_read = 0;
RX1_write = 0;
for(i=0; i<RX2_Length; i++) RX2_Buffer[i] = 0;
B_TX2_Busy = 0;
TX2_read = 0;
RX2_write = 0;
UART1_PrintString("STC8G系列 UART1 Test!\r\n");
UART2_PrintString("STC8G系列 UART2 Test!\r\n");
while (1)
{
if((TX1_read != RX1_write) && !B_TX1_Busy) //收到過數據, 并且發送空閑
{
B_TX1_Busy = 1; //標志發送忙
SBUF = RX1_Buffer[TX1_read]; //發一個字節
if(++TX1_read >= RX1_Length) TX1_read = 0; //避免溢出處理
}
if((TX2_read != RX2_write) && !B_TX2_Busy) //收到過數據, 并且發送空閑
{
B_TX2_Busy = 1; //標志發送忙
S2BUF = RX2_Buffer[TX2_read]; //發一個字節
if(++TX2_read >= RX2_Length) TX2_read = 0; //避免溢出處理
}
}
}
//========================================================================
// 函數: SetTimer2Baudraye(u16 dat)
// 描述: 設置Timer2做波特率發生器。
// 參數: dat: Timer2的重裝值.
// 返回: none.
// 版本: VER1.0
// 日期: 2018-4-2
// 備注:
//========================================================================
void SetTimer2Baudrate(u16 dat) // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
{
AUXR &= ~(1<<4); //Timer stop
AUXR &= ~(1<<3); //Timer2 set As Timer
AUXR |= (1<<2); //Timer2 set as 1T mode
TH2 = (u8)(dat >> 8);
TL2 = (u8)dat;
IE2 &= ~(1<<2); //禁止中斷
AUXR |= (1<<4); //Timer run enable
}
//========================================================================
// 函數: void UART1_config(u32 brt, u8 timer, u8 io)
// 描述: UART1初始化函數。
// 參數: brt: 通信波特率.
// timer: 波特率使用的定時器, timer=2: 波特率使用定時器2, 其它值: 使用Timer1做波特率.
// io: 串口1切換到的IO, io=0: 串口1切換到P3.0 P3.1, =1: 切換到P3.6 P3.7, =2: 切換到P1.6 P1.7, =3: 切換到P4.3 P4.4.
// 返回: none.
// 版本: VER1.0
// 日期: 2018-4-2
// 備注:
//========================================================================
void UART1_config(u32 brt, u8 timer, u8 io) // brt: 通信波特率, timer=2: 波特率使用定時器2, 其它值: 使用Timer1做波特率. io=0: 串口1切換到P3.0 P3.1, =1: 切換到P3.6 P3.7, =2: 切換到P1.6 P1.7, =3: 切換到P4.3 P4.4.
{
brt = 65536UL - (MAIN_Fosc / 4) / brt;
if(timer == 2) //波特率使用定時器2
{
AUXR |= 0x01; //S1 BRT Use Timer2;
SetTimer2Baudrate((u16)brt);
}
else //波特率使用定時器1
{
TR1 = 0;
AUXR &= ~0x01; //S1 BRT Use Timer1;
AUXR |= (1<<6); //Timer1 set as 1T mode
TMOD &= ~(1<<6); //Timer1 set As Timer
TMOD &= ~0x30; //Timer1_16bitAutoReload;
TH1 = (u8)(brt >> 8);
TL1 = (u8)brt;
ET1 = 0; // 禁止Timer1中斷
INT_CLKO &= ~0x02; // Timer1不輸出高速時鐘
TR1 = 1; // 運行Timer1
}
// if(io == 1) {S1_USE_P32P33(); P3n_standard(0x0c);} //切換到 P3.2 P3.3 用于8腳MCU
// else if(io == 2) {S1_USE_P54P53(); P5n_standard(0x18);} //切換到 P5.4 P5.3 用于8腳MCU
if(io == 1) {S1_USE_P36P37(); P3n_standard(0xc0);} //切換到 P3.6 P3.7
else if(io == 2) {S1_USE_P16P17(); P1n_standard(0xc0);} //切換到 P1.6 P1.7
else if(io == 3) {S1_USE_P43P44(); P4n_standard(0x18);} //切換到 P4.3 P4.4
else {S1_USE_P30P31(); P3n_standard(0x03);} //切換到 P3.0 P3.1
SCON = (SCON & 0x3f) | (1<<6); // 8位數據, 1位起始位, 1位停止位, 無校驗
// PS = 1; //高優先級中斷
ES = 1; //允許中斷
REN = 1; //允許接收
}
//========================================================================
// 函數: void UART2_config(u32 brt, u8 timer, u8 io)
// 描述: UART2初始化函數。
// 參數: brt: 通信波特率.
// timer: 波特率使用的定時器, timer=任意值: 波特率使用定時器2.
// io: 串口2切換到的IO, io=0: 串口2切換到P1.0 P1.1, =1: 切換到P4.6 P4.7.
// 返回: none.
// 版本: VER1.0
// 日期: 2018-4-2
// 備注:
//========================================================================
void UART2_config(u32 brt, u8 timer, u8 io) // brt: 通信波特率, timer=任意值: 波特率使用定時器2. io=0: 串口2切換到P1.0 P1.1, =1: 切換到P4.6 P4.7.
{
brt = 65536UL - (MAIN_Fosc / 4) / brt;
if(timer == 2) SetTimer2Baudrate((u16)brt); //波特率使用定時器2
else SetTimer2Baudrate((u16)brt); //波特率使用定時器2 兩個條件都使用Timer2, 是為了跟另外串口函數兼容
S2CON &= ~(1<<7); // 8位數據, 1位起始位, 1位停止位, 無校驗
IE2 |= 1; //允許中斷
S2CON |= (1<<4); //允許接收
if(io == 1) { P_SW2 |= 1; P4n_standard(0xc0);} //切換到 P4.6 P4.7
else { P_SW2 &= ~1; P1n_standard(0x03);} //切換到 P1.0 P1.1
}
//========================================================================
// 函數: void UART1_PrintString(u8 *puts)
// 描述: 串口1字符串打印函數
// 參數: puts: 字符串指針.
// 返回: none.
// 版本: VER1.0
// 日期: 2018-4-2
// 備注:
//========================================================================
void UART1_PrintString(u8 *puts)
{
for (; *puts != 0; puts++)
{
B_TX1_Busy = 1; //標志發送忙
SBUF = *puts; //發一個字節
while(B_TX1_Busy); //等待發送完成
}
}
//========================================================================
// 函數: void UART2_PrintString(u8 *puts)
// 描述: 串口2字符串打印函數
// 參數: puts: 字符串指針.
// 返回: none.
// 版本: VER1.0
// 日期: 2018-4-2
// 備注:
//========================================================================
void UART2_PrintString(u8 *puts)
{
for (; *puts != 0; puts++)
{
B_TX2_Busy = 1; //標志發送忙
S2BUF = *puts; //發一個字節
while(B_TX2_Busy); //等待發送完成
}
}
//========================================================================
// 函數: void UART1_int (void) interrupt UART1_VECTOR
// 描述: 串口1中斷函數
// 參數: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2018-4-2
// 備注:
//========================================================================
void UART1_int (void) interrupt UART1_VECTOR
{
if(RI)
{
RI = 0;
RX1_Buffer[RX1_write] = SBUF;
if(++RX1_write >= RX1_Length) RX1_write = 0;
}
if(TI)
{
TI = 0;
B_TX1_Busy = 0;
}
}
//========================================================================
// 函數: void UART2_int (void) interrupt UART2_VECTOR
// 描述: 串口2中斷函數
// 參數: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2018-4-2
// 備注:
//========================================================================
void UART2_int (void) interrupt UART2_VECTOR
{
if(RI2)
{
CLR_RI2();
RX2_Buffer[RX2_write] = S2BUF;
if(++RX2_write >= RX2_Length) RX2_write = 0;
}
if(TI2)
{
CLR_TI2();
B_TX2_Busy = 0;
}
}
復制代碼
作者:
weijoyer
時間:
2023-3-21 18:29
使用緩沖處理,然后中斷里面不要處理太多東西
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产精品99久久久久
|
亚洲在线成人
|
久久黄视频
|
国产精品视频网
|
午夜精品一区二区三区在线观看
|
国产精品 亚洲一区
|
欧美精品网
|
久久精品国产99国产精品
|
av中文在线观看
|
亚洲视频精品
|
久久蜜桃资源一区二区老牛
|
av中文在线
|
免费视频二区
|
欧美久久影院
|
在线中文视频
|
羞羞的视频免费在线观看
|
一区二区三区中文字幕
|
日韩精品在线网站
|
91亚洲精品在线
|
亚洲国产精品久久久
|
91精品国产91
|
欧美高清视频在线观看
|
玖草资源
|
国产999精品久久久影片官网
|
国产96在线
|
久久久久久看片
|
黄色网页在线
|
国产黄色在线观看
|
久久成人免费
|
自拍偷拍亚洲欧美
|
午夜小视频在线播放
|
国产亚洲精品久久久久久豆腐
|
中文天堂网
|
a级片网站
|
免费在线一区二区三区
|
欧美精品综合
|
99精品欧美一区二区蜜桃免费
|
一级做a爰片久久毛片免费看
|
99久久精品国产毛片
|
日操操夜操操
|
日韩成人免费视频
|