PIC18单片机模拟UART

2019-08-30 13:09

#include \

#include \#include \

#include \#include \

//=============================================================================

unsigned char m_TXBUF; //(全局)模拟发送缓冲字节 unsigned char m_RXBUF; //(全局)模拟接收缓冲字节

unsigned char m_TX_BIT9; //(全局)模拟发送第九位 unsigned char m_RX_BIT9; //(全局)模拟接收第九位 unsigned char p_m_TXBUF; //(全局)发送指针 unsigned char p_m_RXBUF; //(全局)接收指针

unsigned char m_8_OR_9; //(全局收发模式标志:1为9位收发,0位8位收发

//bit m_TXIF; //(全局发送完标志(1发送完,0正在发) unsigned char m_TX_enble; //发送允许

unsigned char m_RCIF; //(全局接收完标志(1接收完,0在接收或等待接收)

unsigned char m_RX_enble; //接收允许

unsigned char m_BT_reLoad_H; //(全局时钟1初值重载_H unsigned char m_BT_reLoad_L; //(全局时钟1初值重载_L

//====================================================================== //缓冲区

unsigned int TIMER_M_BYTE_OVER_count; //模拟字节超时计时 unsigned char M_RXBuf[M_RX_PKG_LEN]; //模拟包缓冲区 unsigned char p_M_RXBuf; //模拟包缓冲区指针

unsigned char Flag_M_byte_time; //模拟字节间隔计时标志 unsigned char Flag_M_PKG_Over; //模拟包结束(1为收完一包,0未收完) //-----------------------------------------------------------------------------

//初始化模拟串口

//Bt: 波特率代码

//Flag89: 9位还是8位收发

void Init_m_usart(unsigned long Foc, unsigned long Bt, unsigned char Flag89) {

//字节部分

//========================================================= //初始化全局内存变量 if(Flag89) {

m_8_OR_9=1; } else {

m_8_OR_9=0; }//9位接收标志

p_m_TXBUF=0; //发送初始 p_m_RXBUF=0; //接收初始

//m_TXIF=1; //初始发送完

m_TX_enble=0; //发送允许(不允许)

m_RCIF=0; //初始等待接收

m_RX_enble=0; //接收允许(不允许)

//初始波特率时钟T1

//m_BT_reLoad_H=0xEE; //(全局时钟1初值重载_H 11.0592M 600 //m_BT_reLoad_L=0x00; //(全局时钟1初值重载_L

// m_BT_reLoad_H=0xFC; //(全局时钟1初值重载_H 11.0592M ----------------(不准确 )

// m_BT_reLoad_L=0xE0; //(全局时钟1初值重----------------(不准确 )

//m_BT_reLoad_H=0xFD; //(全局时钟1初值重载_H 11.0592M 2400 //m_BT_reLoad_L=0xFF; //(全局时钟1初值重载_L

m_BT_reLoad_H=0xFE; //(全局时钟1初值重载_H 11.0592M 4800 m_BT_reLoad_L=0x1F; //(全局时钟1初值重载_L

// m_BT_reLoad_H=0xFF; //(全局时钟1初值重载_H 11.0592M 9600 //m_BT_reLoad_L=0x3F; //(全局时钟1初值重载_L

1200 载_L //m_BT_reLoad_H=0xFF; //(全局时钟1初值重载_H 11.0592M 14400 ----------------(不准确 )

//m_BT_reLoad_L=0xB4; //(全局时钟1初值重载_L ----------------(不准确 )

//m_BT_reLoad_H=(FULL_U16-Foc/(4*Bt))/FULL_U8; //m_BT_reLoad_L=(FULL_U16-Foc/(4*Bt))%FULL_U8; T1CON=1; //不分频,时钟开起来

//m_BT_reLoad_H=0x00; //(全局时钟1初值重载_H //m_BT_reLoad_L=0x00; //(全局时钟1初值重载_L //T1CON=0x31; //不分频,时钟开起来

TMR1H=m_BT_reLoad_H; TMR1L=m_BT_reLoad_L;

TMR1IE=1; //允许时钟1中断

//模拟串口的口线输入输出类型设定

IOStyle_TX_Line=0; //发送口线类型 (输出) TX_Line=1; //发送口线 (高)

IOStyle_RX_Line=0; //接收口线类型 (输出) RX_Line=1; //接收口线 (高) IOStyle_RX_Line=1; //接收口线类型 (输入)

//接收外部中断(PB端口电瓶变化)开起来 RBIF=0; RBIE=1;

//===============================================================

//包部分

//=============================================================== TIMER_M_BYTE_OVER_count=0; //模拟字节超时计时 p_M_RXBuf=0; //模拟包缓冲区指针

Flag_M_PKG_Over=0; //模拟包结束(1为收完一包,0未收完) Flag_M_byte_time=0; //模拟字节间隔计时标志

//=============================================================== }

//---------------------------------------------------------------------------

//模拟串口发送字节

//Ch: 要发送的字节

void m_putch(unsigned char Ch) {

RBIE=0; RBIF=0;

/////////////////////////////// m_TXBUF=Ch;

unsigned char dBuf[20] ;

//INT16U dLen=sprintf(&dBuf[0],\ //UART1_SendConstS(dBuf);

//让停止位保持一个波特宽的高电平 p_m_TXBUF=0; m_TX_enble=1;

while(m_TX_enble);

/////////////////////////////// RBIF=0;

RBIE=1; }

//--------------------------------------------------------------------------

//模拟包接收查询服务 //在背景中执行 //起动

void SERVER_M_PKG_REC(void) {

//收到新字节 if(m_RCIF) {

if(!Flag_M_PKG_Over) {

// UART1_SendConstS(\ //====================================== //清字节间定时器

TIMER_M_BYTE_OVER_count=0; Flag_M_byte_time=1;

//====================================== //防止越界

if(M_RX_PKG_LEN==p_M_RXBuf) p_M_RXBuf--; //接收

M_RXBuf[p_M_RXBuf++]=m_RXBUF;

//====================================== }

m_RCIF=0; } }

//--------------------------------------------------------------------------

//收发波特,电平中断服务

void M_USART_INTFACE(void) {

char dBuf[20]; //时钟1中断 if(TMR1IF) {

// UART1_SendConstS(\ //重入 TMR1IF=0;

TMR1H=m_BT_reLoad_H; TMR1L=m_BT_reLoad_L;

//发送时序 if(m_TX_enble) {

// UART1_SendConstS(\ if(0==p_m_TXBUF) {

TX_Line=0; p_m_TXBUF++; }

else if(p_m_TXBUF<9) {

// UART1_SendConstS(\ if(1&m_TXBUF)

{ // UART1_SendConstS(\ TX_Line=1; } else {

//UART1_SendConstS(\ TX_Line=0; }

m_TXBUF>>=1;

p_m_TXBUF++; }


PIC18单片机模拟UART.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2017年棉花整枝打顶剂抑顶示范方案(二次施药:整枝+打顶技术)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: