当前位置:网站首页 > 编程语言 > 正文

环形队列特点(环形队列是一种什么结构)



#include "USART.h"

COMx_Define COM1,COM2;

u8 xdata TX1_Buffer[COM_TX1_Lenth]; //发送缓冲

u8 xdata RX1_Buffer[COM_RX1_Lenth]; //接收缓冲

u8 xdata TX2_Buffer[COM_TX2_Lenth]; //发送缓冲

u8 xdata RX2_Buffer[COM_RX2_Lenth]; //接收缓冲

u8 USART_Configuration(u8 UARTx, COMx_InitDefine *COMx)

{

u8 i;

u32 j;

if(UARTx == USART1)

{

COM1.id = 1;

COM1.TX_read = 0;

COM1.TX_write = 0;

COM1.B_TX_busy = 0;

COM1.RX_Cnt = 0;

COM1.RX_TimeOut = 0;

COM1.B_RX_OK = 0;

for(i=0; i<COM_TX1_Lenth; i++) TX1_Buffer[i] = 0;

for(i=0; i<COM_RX1_Lenth; i++) RX1_Buffer[i] = 0;

if(COMx->UART_Mode > UART_9bit_BRTx) return 2; //模式错误

if(COMx->UART_Polity == PolityHigh) PS = 1; //高优先级中断

else PS = 0; //低优先级中断

SCON = (SCON & 0x3f) | COMx->UART_Mode;

if((COMx->UART_Mode == UART_9bit_BRTx) ||(COMx->UART_Mode == UART_8bit_BRTx)) //可变波特率

{

j = (MAIN_Fosc / 4) / COMx->UART_BaudRate; //按1T计算

if(j >= 65536UL) return 2; //错误

j = 65536UL - j;

if(COMx->UART_BRT_Use == BRT_Timer1)

{

TR1 = 0;

AUXR &= ~0x01; //S1 BRT Use Timer1;

TMOD &= ~(1<<6); //Timer1 set As Timer

TMOD &= ~0x30; //Timer1_16bitAutoReload;

AUXR |= (1<<6); //Timer1 set as 1T mode

TH1 = (u8)(j>>8);

TL1 = (u8)j;

ET1 = 0; //禁止中断

TMOD &= ~0x40; //定时

INT_CLKO &= ~0x02; //不输出时钟

TR1 = 1;

}

else if(COMx->UART_BRT_Use == BRT_Timer2)

{

AUXR &= ~(1<<4); //Timer stop

AUXR |= 0x01; //S1 BRT Use Timer2;

AUXR &= ~(1<<3); //Timer2 set As Timer

AUXR |= (1<<2); //Timer2 set as 1T mode

TH2 = (u8)(j>>8);

TL2 = (u8)j;

IE2 &= ~(1<<2); //禁止中断

AUXR &= ~(1<<3); //定时

AUXR |= (1<<4); //Timer run enable

}

else return 2; //错误

}

else if(COMx->UART_Mode == UART_ShiftRight)

{

if(COMx->BaudRateDouble == ENABLE) AUXR |= (1<<5); //固定波特率SysClk/2

else AUXR &= ~(1<<5); //固定波特率SysClk/12

}

else if(COMx->UART_Mode == UART_9bit) //固定波特率SysClk*2^SMOD/64

{

if(COMx->BaudRateDouble == ENABLE) PCON |= (1<<7); //固定波特率SysClk/32

else PCON &= ~(1<<7); //固定波特率SysClk/64

}

if(COMx->UART_Interrupt == ENABLE) ES = 1; //允许中断

else ES = 0; //禁止中断

if(COMx->UART_RxEnable == ENABLE) REN = 1; //允许接收

else REN = 0; //禁止接收

P_SW1 = (P_SW1 & 0x3f) | (COMx->UART_P_SW & 0xc0); //切换IO

if(COMx->UART_RXD_TXD_Short == ENABLE) PCON2 |= (1<<4); //内部短路RXD与TXD, 做中继, ENABLE,DISABLE

else PCON2 &= ~(1<<4);

return 0;

}

if(UARTx == USART2)

{

COM2.id = 2;

COM2.TX_read = 0;

COM2.TX_write = 0;

COM2.B_TX_busy = 0;

COM2.RX_Cnt = 0;

COM2.RX_TimeOut = 0;

COM2.B_RX_OK = 0;

for(i=0; i<COM_TX2_Lenth; i++) TX2_Buffer[i] = 0;

for(i=0; i<COM_RX2_Lenth; i++) RX2_Buffer[i] = 0;

if((COMx->UART_Mode == UART_9bit_BRTx) ||(COMx->UART_Mode == UART_8bit_BRTx)) //可变波特率

{

if(COMx->UART_Polity == PolityHigh) IP2 |= 1; //高优先级中断

else IP2 &= ~1; //低优先级中断

if(COMx->UART_Mode == UART_9bit_BRTx) S2CON |= (1<<7); //9bit

else S2CON &= ~(1<<7); //8bit

j = (MAIN_Fosc / 4) / COMx->UART_BaudRate; //按1T计算

if(j >= 65536UL) return 2; //错误

j = 65536UL - j;

AUXR &= ~(1<<4); //Timer stop

AUXR &= ~(1<<3); //Timer2 set As Timer

AUXR |= (1<<2); //Timer2 set as 1T mode

TH2 = (u8)(j>>8);

TL2 = (u8)j;

IE2 &= ~(1<<2); //禁止中断

AUXR |= (1<<4); //Timer run enable

}

else return 2; //模式错误

if(COMx->UART_Interrupt == ENABLE) IE2 |= 1; //允许中断

else IE2 &= ~1; //禁止中断

if(COMx->UART_RxEnable == ENABLE) S2CON |= (1<<4); //允许接收

else S2CON &= ~(1<<4); //禁止接收

P_SW2 = (P_SW2 & ~1) | (COMx->UART_P_SW & 0x01); //切换IO

}

}

/* 装载串口发送缓冲 */

void TX1_write2buff(u8 dat) //写入发送缓冲,指针+1

{

TX1_Buffer[COM1.TX_write] = dat; //装发送缓冲

if(++COM1.TX_write >= COM_TX1_Lenth) COM1.TX_write = 0;

if(COM1.B_TX_busy == 0) //空闲

{

COM1.B_TX_busy = 1; //标志忙

TI = 1; //触发发送中断

}

}

void TX2_write2buff(u8 dat) //写入发送缓冲,指针+1

{

TX2_Buffer[COM2.TX_write] = dat; //装发送缓冲

if(++COM2.TX_write >= COM_TX2_Lenth) COM2.TX_write = 0;

if(COM2.B_TX_busy == 0) //空闲

{

COM2.B_TX_busy = 1; //标志忙

SET_TI2(); //触发发送中断

}

}

void PrintString1(u8 *puts)

{

for (; *puts != 0; puts++) TX1_write2buff(*puts); //遇到停止符0结束

}

void PrintString2(u8 *puts)

{

for (; *puts != 0; puts++) TX2_write2buff(*puts); //遇到停止符0结束

}

/*

void COMx_write2buff(COMx_Define *COMx, u8 dat) //写入发送缓冲,指针+1

{

if(COMx->id == 1) TX1_write2buff(dat);

if(COMx->id == 2) TX2_write2buff(dat);

}

void PrintString(COMx_Define *COMx, u8 *puts)

{

for (; *puts != 0; puts++) COMx_write2buff(COMx,*puts); //遇到停止符0结束

}

*/

/* UART1中断函数/

void UART1_int (void) interrupt UART1_VECTOR

{

if(RI)

{

RI = 0;

if(COM1.B_RX_OK == 0)

{

if(COM1.RX_Cnt >= COM_RX1_Lenth) COM1.RX_Cnt = 0;

RX1_Buffer[COM1.RX_Cnt++] = SBUF;

COM1.RX_TimeOut = TimeOutSet1;

}

}

if(TI)

{

TI = 0;

if(COM1.TX_read != COM1.TX_write)

{

SBUF = TX1_Buffer[COM1.TX_read];

if(++COM1.TX_read >= COM_TX1_Lenth) COM1.TX_read = 0;

}

else COM1.B_TX_busy = 0;

}

}

/* UART2中断函数/

void UART2_int (void) interrupt UART2_VECTOR

{

if(RI2)

{

CLR_RI2();

if(COM2.B_RX_OK == 0)

{

if(COM2.RX_Cnt >= COM_RX2_Lenth) COM2.RX_Cnt = 0;

RX2_Buffer[COM2.RX_Cnt++] = S2BUF;

COM2.RX_TimeOut = TimeOutSet2;

}

}

if(TI2)

{

CLR_TI2();

if(COM2.TX_read != COM2.TX_write)

{

S2BUF = TX2_Buffer[COM2.TX_read];

if(++COM2.TX_read >= COM_TX2_Lenth) COM2.TX_read = 0;

}

else COM2.B_TX_busy = 0;

}

到此这篇环形队列特点(环形队列是一种什么结构)的文章就介绍到这了,更多相关内容请继续浏览下面的相关 推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • max30102心率检测模块原理图(max30102心跳怎么测)2025-03-25 16:18:07
  • 华为机考题库20234(华为机考题库2021)2025-03-25 16:18:07
  • 预训练模型下载(预训练模型的优点)2025-03-25 16:18:07
  • libpng.dll丢失(libgmp-10.dll丢失)2025-03-25 16:18:07
  • IP查域名查询工具(ip域名查询系统)2025-03-25 16:18:07
  • ssh免密码登录配置不起作用(配置ssh免密码登陆)2025-03-25 16:18:07
  • pdfView和普通版区别(pdfview和pdf的区别)2025-03-25 16:18:07
  • 天气预报 接口(天气预报接口调用)2025-03-25 16:18:07
  • 密码库怎么看vivo(vivo密码在哪看)2025-03-25 16:18:07
  • 圈一圈,填一填三年级(小学三年级圈一圈填一填)2025-03-25 16:18:07
  • 全屏图片