runxinzhi.com
首页
百度搜索
16V554 的测试代码
//------------------------------------------------------------------------
#include "AT16C554.H"
//--------------------------------------------------------------------------------------------------
code Uint PORTAddrTABLE[PortNumber]={STARTADDR_SERIAL1,
STARTADDR_SERIAL2,
STARTADDR_SERIAL3,
STARTADDR_SERIAL4};
//串口端口地址映射表
xdata TCommHandle CommDevice[PortNumber];
sbit reset_16c554 = P1^4;
//ST16C554 复位控制线
//---------------------------------------------------------------------------------------------------
// Define Private Faction
//-----------------------------------------------------------------------------------------------------
bool ReadPortRecBuf(uchar Port,Uchar *Byte);
bool WritePortSendBuf(uchar Port,Uchar Byte);
void Port_open(Uchar PortID,Uint Baud);
//-------------------------------------------------------------------------
// Define Public Faction
//-------------------------------------------------------------------------
bool Init_16c554(
void);
void Port_open(Uchar PortID,Uint Baud);
//void Port_open(Uchar PortID,int Baud,Uchar DataBitNum,Uchar Parit,Uchar Stop);
void Port_close(Uchar PortID);
int Port_Receive(Uchar PortID,
void *Buffer,
int Count);
int Port_Send(Uchar PortID,
void *Buffer,
int Count);
//---------------------------------------------------------------------------------------------
// Public Faction Code
//---------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------
// 初始化ST16C554
//---------------------------------------------------------------------------------------------
bool Init_16c554(
void)
{
uchar xdata *ptr;
uchar i=Init_16c554_Count;
bool Result=
false;
while(--i)
// 复位10次不成功,则返回出错
{
_nop_();
reset_16c554 = FREE_RESET;
ms_delay(5);
reset_16c554 = RESET;
// 复位16C554
ms_delay(10);
// 延时1毫秒
reset_16c554 = FREE_RESET;
ms_delay(10);
ptr = STARTADDR_SERIAL1+SPR;
// 通道1临时寄存器
*ptr = 0xaa;
// 写测试值到临时寄存器
_nop_();
_nop_();
if(*ptr == 0xaa)
{
Result=
true;
break;
};
//end if
};
//end while
for(i=0;i<PortNumber;i++) CommDevice[i].RAMAddress_Map=PORTAddrTABLE[i];
return Result;
}
//---------------------------------------------------------------------------------------------
// 打开串口
//---------------------------------------------------------------------------------------------
void Port_open(Uchar PortID,Uint Baud)
{
uchar xdata *ptr;
ptr = CommDevice[PortID].RAMAddress_Map;
// 取端口的基地址
*(ptr+LCR) = LCR_DIV_EN;
// 允许发送波特率
*(ptr+DLM) = (uchar)(Baud>>8);
*(ptr+DLL) = (uchar)Baud;
// 设置默任波特率为19200
*(ptr+LCR) = LCR_WORD_LEN8|LCR_STOP_LEN1;
// 设置字长为8,1个停止位,无校验位
*(ptr+FCR) = FIFO_EN|FIFO_TRI_LEVEL_1|FIFO_CLEAR_RCVR|FIFO_CLEAR_XMIT|FIFO_DMA_MODE;
// 设置FIFO 控制寄存器
*(ptr+IER) = IER_TRANSMITHOLD_INT|IER_RECEIVEHOLD_INT;
// 设置中断屏蔽寄存器
*(ptr+MCR) = MCR_INTX_EN;
// 允许中断引脚输出
if(PortID==0) EX0 =
true;
// 开外部中断0(通道1中断)
if(PortID==1) EX1 =
true;
// 开外部中断1(通道2中断)
if(PortID==2) EX2 =
true;
// 开外部中断2(通道3中断)
if(PortID==3) EX3 =
true;
// 开外部中断3(通道4中断)
CommDevice[PortID].CommReceive_Head=0;
CommDevice[PortID].CommReceive_Trail=0;
CommDevice[PortID].CommSend_Head=0;
CommDevice[PortID].CommSend_Trail=0;
CommDevice[PortID].Comm_Stu=SERIAL_STU_FREE;
}
//---------------------------------------------------------------------------------------------
// 关闭指定的端口
//---------------------------------------------------------------------------------------------
/*void Port_close(Uchar PortID)
{
uchar xdata *ptr;
ptr = CommDevice[PortID].RAMAddress_Map; // 取端口的基地址
*(ptr+LCR) = LCR_DIV_Dis; // 禁止发送波特率
*(ptr+MCR) = MCR_INTX_Dis; // 允许中断引脚输出
CommDevice[PortID].CommReceive_Head=0;
CommDevice[PortID].CommReceive_Trail=0;
CommDevice[PortID].CommSend_Head=0;
CommDevice[PortID].CommSend_Trail=0;
CommDevice[PortID].Comm_Stu=SERIAL_STU_FREE;
if(PortID==0) EX0 = false; // 关外部中断0(通道1中断)
if(PortID==1) EX1 = false; // 关外部中断1(通道2中断)
if(PortID==2) EX2 = false; // 关外部中断2(通道3中断)
if(PortID==3) EX3 = false; // 关外部中断3(通道4中断)
}*/
//--------------------------------------------------------------------------------------------------
//功 能:从串口中接收数据
//返回值:从串口中接收到的数据个数
//参 数:
// Buffer:接收数的缓冲区
// Count: 想从串口缓冲区中接收数据个数
//--------------------------------------------------------------------------------------------------
/*int Port_Receive(uchar Port,register void *Buffer,int Count)
{
Uchar Size=0;
if(Port>PortNumber-1) return Size;
while((Size<Count)&&(ReadPortRecBuf(Port,Buffer)))
{
Size++;
Buffer=Buffer+1;
};//end while
return Size;
}*/
//--------------------------------------------------------------------------------------------------
//功 能:往串口发送数据
//返回值:已发送的数据个数
//参 数:
// Buffer:发送数据的缓冲区
// Count: 想从串口发送数据的个数
//--------------------------------------------------------------------------------------------------
int Port_Send(uchar Port,
register
void *Buffer,
int Count)
{
uchar i=0;
Uchar Size=0;
uchar xdata *ptr;
if(Port>PortNumber-1)
return Size;
ptr = CommDevice[Port].RAMAddress_Map;
// 取端口基地址
while(Size<Count)
{
if(WritePortSendBuf(Port,*((Uchar *)Buffer)))
{
Size=Size+1;
Buffer=Buffer+1;
};
//end if
if(CommDevice[Port].Comm_Stu==SERIAL_STU_FREE)
{
for(i=0;(i<FIFO_SIZE)&&(CommDevice[Port].CommSend_Head!=CommDevice[Port].CommSend_Trail);i++)
{
CommDevice[Port].CommSend_Trail=(CommDevice[Port].CommSend_Trail+1)%CommMaxSendBuffer;
*(ptr+THR) = CommDevice[Port].CommSendBuffer[CommDevice[Port].CommSend_Trail];
// 发送数据
};
//end for
CommDevice[Port].Comm_Stu = SERIAL_STU_BUSY;
};
//end if
};
//end while
return Size;
}
//----------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------
//私有函数
//----------------------------------------------------------------------------------------------------
//功 能:从串口接收缓冲区中取得数据
//返回值:
// true: 从缓冲区中成功取得数据
// false: 从缓冲区中无法取得数据
//参 数: *Byte:从缓冲区中取得数据返回
//-----------------------------------------------------------------------------------------------------
/*bool ReadPortRecBuf(uchar Port,Uchar *Byte)
{
if(CommDevice[Port].CommReceive_Trail==CommDevice[Port].CommReceive_Head) return false;
*Byte=CommDevice[Port].CommReceiveBuffer[CommDevice[Port].CommReceive_Trail];
CommDevice[Port].CommReceive_Trail=(CommDevice[Port].CommReceive_Trail+1)%CommMaxReceiveBuffer;
return true;
}*/
//-----------------------------------------------------------------------------------------------------
//功 能:往串口发送缓冲区中写数据
//返回值:
// true: 往缓冲区中写数据成功
// false: 从缓冲区中写数据失败
//参 数: Byte: 往缓冲区中写入的数据
//------------------------------------------------------------------------------
bool WritePortSendBuf(uchar Port,Uchar Byte)
{
if((CommDevice[Port].CommSend_Head+1)%CommMaxSendBuffer==CommDevice[Port].CommSend_Trail)
return
false;
CommDevice[Port].CommSend_Head=(CommDevice[Port].CommSend_Head+1)%CommMaxSendBuffer;
CommDevice[Port].CommSendBuffer[CommDevice[Port].CommSend_Head]=Byte;
return
true;
}
//--------------------------------------------------------------------------------
// 外部扩展串行口1中断处理程序(外部中断0)
//--------------------------------------------------------------------------------
void serial1_int() interrupt 0
{
uchar xdata *ptr;
uchar event;
uchar port;
port = CHANL1_PORT;
ptr = CommDevice[port].RAMAddress_Map;
// 读ISR 中断状态寄存器
event = *(ptr+ISR)&0x0f;
// 读最高优先级别的中断码
_nop_();
switch(event)
{
case EVENT_RXRDY:
// 接受数据到中断
case EVENT_RXRDY_TIMEOUT:
for(;*(ptr+LSR)&EVENT_LSR_RECEIVE;)
{
CommDevice[port].CommReceiveBuffer[CommDevice[port].CommReceive_Head] = *(ptr+RHR);
if(((CommDevice[port].CommReceive_Head+1)%CommMaxReceiveBuffer)!=CommDevice[port].CommReceive_Trail)
CommDevice[port].CommReceive_Head=(CommDevice[port].CommReceive_Head+1)%CommMaxReceiveBuffer;
};
//end for
break;
case EVENT_TXRDY:
//发送数据中断
if(CommDevice[port].CommSend_Trail!=CommDevice[port].CommSend_Head)
//判断数据包是否发送完毕
{
for(event=0;(event<FIFO_SIZE)&&(CommDevice[port].CommSend_Trail!=CommDevice[port].CommSend_Head);event++)
{
CommDevice[port].CommSend_Trail=(CommDevice[port].CommSend_Trail+1)%CommMaxSendBuffer;
*(ptr+THR) = CommDevice[port].CommSendBuffer[CommDevice[port].CommSend_Trail];
};
//end for
CommDevice[port].Comm_Stu = SERIAL_STU_BUSY;
}
else CommDevice[port].Comm_Stu = SERIAL_STU_FREE;
break;
};
//end switch
}
//--------------------------------------------------------------------------------
// 外部扩展串行口2中断处理程序(外部中断2)
//--------------------------------------------------------------------------------
void serial2_int() interrupt 2
{
uchar xdata *ptr;
uchar event;
uchar port;
port = CHANL2_PORT;
ptr = CommDevice[port].RAMAddress_Map;
//读ISR 中断状态寄存器
event = *(ptr+ISR)&0x0f;
//读最高优先级别的中断码
_nop_();
switch(event)
{
case EVENT_RXRDY:
//接受数据到中断
case EVENT_RXRDY_TIMEOUT:
for(;*(ptr+LSR)&EVENT_LSR_RECEIVE;)
{
CommDevice[port].CommReceiveBuffer[CommDevice[port].CommReceive_Head] = *(ptr+RHR);
if(((CommDevice[port].CommReceive_Head+1)%CommMaxReceiveBuffer)!=CommDevice[port].CommReceive_Trail)
CommDevice[port].CommReceive_Head=(CommDevice[port].CommReceive_Head+1)%CommMaxReceiveBuffer;
};
//end for
break;
case EVENT_TXRDY:
//发送数据中断
if(CommDevice[port].CommSend_Trail!=CommDevice[port].CommSend_Head)
//判断数据包是否发送完毕
{
for(event=0;(event<FIFO_SIZE)&&(CommDevice[port].CommSend_Trail!=CommDevice[port].CommSend_Head);event++)
{
CommDevice[port].CommSend_Trail=(CommDevice[port].CommSend_Trail+1)%CommMaxSendBuffer;
*(ptr+THR) = CommDevice[port].CommSendBuffer[CommDevice[port].CommSend_Trail];
};
//end for
CommDevice[port].Comm_Stu = SERIAL_STU_BUSY;
}
else CommDevice[port].Comm_Stu = SERIAL_STU_FREE;
break;
};
//end switch
}
//--------------------------------------------------------------------------------
// 外部扩展串行口3中断处理程序(外部中断6)
//--------------------------------------------------------------------------------
void serial3_int () interrupt 6
{
uchar xdata *ptr;
uchar event;
uchar port;
port = CHANL3_PORT;
ptr = CommDevice[port].RAMAddress_Map;
// 读ISR 中断状态寄存器
event = *(ptr+ISR)&0x0f;
// 读最高优先级别的中断码
_nop_();
switch(event)
{
case EVENT_RXRDY:
// 接受数据到中断
case EVENT_RXRDY_TIMEOUT:
for(;*(ptr+LSR)&EVENT_LSR_RECEIVE;)
{
CommDevice[port].CommReceiveBuffer[CommDevice[port].CommReceive_Head] = *(ptr+RHR);
if(((CommDevice[port].CommReceive_Head+1)%CommMaxReceiveBuffer)!=CommDevice[port].CommReceive_Trail)
CommDevice[port].CommReceive_Head=(CommDevice[port].CommReceive_Head+1)%CommMaxReceiveBuffer;
};
//end for
break;
case EVENT_TXRDY:
//发送数据中断
if(CommDevice[port].CommSend_Trail!=CommDevice[port].CommSend_Head)
//判断数据包是否发送完毕
{
for(event=0;(event<FIFO_SIZE)&&(CommDevice[port].CommSend_Trail!=CommDevice[port].CommSend_Head);event++)
{
CommDevice[port].CommSend_Trail=(CommDevice[port].CommSend_Trail+1)%CommMaxSendBuffer;
*(ptr+THR) = CommDevice[port].CommSendBuffer[CommDevice[port].CommSend_Trail];
};
//end for
CommDevice[port].Comm_Stu = SERIAL_STU_BUSY;
}
else CommDevice[port].Comm_Stu = SERIAL_STU_FREE;
break;
};
//end switch
}
//--------------------------------------------------------------------------------
// 外部扩展串行口4中断处理程序(外部中断7)
//--------------------------------------------------------------------------------
void serial4_int () interrupt 7
{
uchar xdata *ptr;
uchar event;
uchar port;
port = CHANL4_PORT;
ptr = CommDevice[port].RAMAddress_Map;
// 读ISR 中断状态寄存器
event = *(ptr+ISR)&0x0f;
// 读最高优先级别的中断码
_nop_();
switch(event)
{
case EVENT_RXRDY:
// 接受数据到中断
case EVENT_RXRDY_TIMEOUT:
for(;*(ptr+LSR)&EVENT_LSR_RECEIVE;)
{
CommDevice[port].CommReceiveBuffer[CommDevice[port].CommReceive_Head] = *(ptr+RHR);
if(((CommDevice[port].CommReceive_Head+1)%CommMaxReceiveBuffer)!=CommDevice[port].CommReceive_Trail)
CommDevice[port].CommReceive_Head=(CommDevice[port].CommReceive_Head+1)%CommMaxReceiveBuffer;
};
//end for
break;
case EVENT_TXRDY:
//发送数据中断
if(CommDevice[port].CommSend_Trail!=CommDevice[port].CommSend_Head)
//判断数据包是否发送完毕
{
for(event=0;(event<FIFO_SIZE)&&(CommDevice[port].CommSend_Trail!=CommDevice[port].CommSend_Head);event++)
{
CommDevice[port].CommSend_Trail=(CommDevice[port].CommSend_Trail+1)%CommMaxSendBuffer;
*(ptr+THR) = CommDevice[port].CommSendBuffer[CommDevice[port].CommSend_Trail];
};
//end for
CommDevice[port].Comm_Stu = SERIAL_STU_BUSY;
}
else CommDevice[port].Comm_Stu = SERIAL_STU_FREE;
break;
};
//end switch
}
//--------------------------------------------------------------------------------
相关阅读:
android 自定义Dialog
【Head First Java 读书笔记】(四)对象的行为
【Head First Java 读书笔记】(三)primitive主数据类型和引用
【Android学习】自定义checkbox
【Java】java中的compareTo和compare的区别
【Java】对Map按key和value分别排序
【Andoid学习】GridView学习
【实习项目记录】(三)调整网络图片固定宽高
【实习项目记录】(二) JSON
【实习项目记录】(一)加密算法MD5和RSA
原文地址:https://www.cnblogs.com/zym0805/p/5089359.html
最新文章
Kafka connect快速构建数据ETL通道
GitHub更新自己Fork的项目
深入浅出数据仓库中SQL性能优化之Hive篇
Hive读取外表数据时跳过文件行首和行尾
Spark读写Hbase的二种方式对比
Scala集合和Java集合对应转换关系
kafka性能参数和压力测试揭秘
MapReduce和Spark写入Hbase多表总结
SparkStreaming实现Exactly-Once语义
Hive索引功能测试
热门文章
Spark的DataFrame的窗口函数使用
《Kafka Stream》调研:一种轻量级流计算模式
Kafka0.10的新特性一览
Spark计算均值
RDD、DataFrame和DataSet的区别
【Android学习】Android编码规范
【操作系统笔记】一、引论
【Head First Java 读书笔记】(六)认识Java API
【Head First Java 读书笔记】(五)编写程序
【leetcode】Move Zeroes
Copyright © 2020-2023
润新知