PIC双串口应用的C程序实现

发布者:人妙果华最新更新时间:2016-11-03 来源: eefocus关键字:PIC  双串口  C程序 手机看文章 扫描二维码
随时随地手机看文章
PIC18F87K90程序,注意串口2要关闭端口模拟功能后才能使用(ANCON2我在这里吃过亏),以下是调试好的程序。
 
//单片机引脚定义******************************************************************************
LCDSE0=0;LCDSE1=0;LCDSE2=0;LCDSE3=0;LCDSE4=0;LCDSE5=0;LCDEN=0; //关闭液晶驱动功能
OSCCON=0x46; //使用内部16M晶振8分频=2M
PORTA=0;LATA=0;TRISA=0;
PORTB=0;LATB=0;TRISB=0x0B;RBPU=0; //按键引脚和OK指示灯定义
PORTC=0;LATC=0;TRISC=0xC0; //SPI1,串口1,工作指示灯引脚定义
PORTD=0;LATD=0;TRISD=0x20;RDPU=1; //数码管显示,RS485控制,看门狗引脚定义
PORTE=0;LATE=0;TRISE=0; //LED引脚定义
PORTF=0;LATF=0;TRISF=0;
PORTG=0;LATG=0;TRISG=0x04; //串口2引脚定义
PORTH=0;LATH=0;TRISH=0;
 
ODCON1=0;ODCON2=0;ODCON3=0;
 
ANCON2=0; //我原来认为默认值应该是0,实际是0xFF,再次提醒。
//以下是中断定义******************************************************************************        
GIE=0; //中断: 1允许所有高优先级中断  0禁止所有中断
PEIE=0; //中断: 1允许所有低优先级中断  0禁止所有中断
//初始化前,应禁止中断,以下中断初始化
PIR1=0; //中断标志清零
IPEN=1; //中断优先级设置:1允许优先级  0禁止优先级
 
TMR0IP=1; //TMR0 溢出中断优先级位: 1高优先级  0低优先级
IPR1=0x20; //串口1 优先级
IPR2=0;
IPR3=0x00; //串口2 优先级
IPR4=0;IPR5=0;IPR6=0; //其它低优先级
 
TMR0IE=1; //TMR0 溢出中断允许位: 1允许  0禁止
PIE1=0x20; //允许串口1中断,允许AD中断
PIE2=0;
PIE3=0x20; //允许串口2中断
PIE4=0;PIE5=0;PIE6=0;
/******************************************************************************/
/* 初始化函数 串口1 */
/******************************************************************************/
void Usart_init1(void)
{
ABDEN=0; //关闭自动波特率检测
BRG16=1; //选择波特率生成器为16方式
BRGH=1; //选择高速波特率方式
SYNC=0; //选择异步方式
 
SPBRGH1=0; 
SPBRG=0x33; //设置波特率为9600BPS,9600=2M/4(0x33+1)
 
SPEN=1; //使能串口发送,选择高速波特率
TXEN=1;
RCSTA1=0x90; //使能串口工作,连续接收
 
/******************************************************************************/
/* 初始化函数 串口2 */
/******************************************************************************/
void Usart_init2(void)
{
ABDEN2=0; //关闭自动波特率检测
BRG162=1; //选择波特率生成器为16方式
BRGH2=1; //选择高速波特率方式
SYNC2=0; //选择异步方式
 
SPBRG2H=0; 
SPBRG2=0x33; //设置波特率为9600BPS,9600=2M/4(0x33+1)
 
SPEN2=1; //使能串口发送,选择高速波特率
TXEN2=1;
RCSTA2=0x90; //使能串口工作,连续接收
 
/*****************************************************************************/
/* ASCII转成十六进制 */
/*****************************************************************************/
unsigned char ASCII(unsigned char dataf)
{
unsigned char resc;
 
if(dataf<=0x39) resc=dataf-0x30;
else resc=dataf-0x37;
 
return resc;
 
/******************************************************************************/
/* 发送函数 串口1 */
/******************************************************************************/
void Usart_T(unsigned char dataf)
{
int index;
 
RS485=1;
for(index=0;index<1000;index++) //检测发送器是否为空
{
if(TRMT==1)break;
}
TXREG1=dataf; //把数据写入缓冲区
for(index=0;index<1000;index++) //等待发送完毕
{
if(TX1IF==1)break;
}
RS485=0;
//TX1IF=0; //发送中断清零
 
/****************************************************************************/
/* 发送函数 num个 数据   串口1 */
/****************************************************************************/
void Usart_Tm(unsigned char *data,unsigned char num)
{
unsigned char i;
 
for(i=num;i>0;i--)
{
Usart_T(*data);
data++;
}
}
 
/******************************************************************************/
/* 发送函数 串口2 */
/******************************************************************************/
void Usart_T2(unsigned char dataf)
{
int index;
//RS485=1;
for(index=0;index<1000;index++) //检测发送器是否为空
{
if(TRMT2==1)break;
}
TXREG2=dataf; //把数据写入缓冲区
for(index=0;index<1000;index++) //等待发送完毕
{
if(TX2IF==1)break;
}
//RS485=0;
//TX2IF=0; //发送中断清零
 
/****************************************************************************/
/* 发送函数 num个 数据 串口2 */
/****************************************************************************/
void Usart_Tm2(unsigned char *data,unsigned char num)
{
unsigned char i;
 
for(i=num;i>0;i--)
{
Usart_T2(*data);
data++;
}
}
 
/******************************************************************************/
/* 串口中断函数 1 */
/******************************************************************************/ 
void interrupt Usart(void)
{
unsigned char index_comm,buf_comm;
unsigned char rx_buf;
 
if(TMR0IF==1) //定时器0中断处理
TMR0IF=0;
TMR0L=0;
TMR0H=0xF0;        
set_time++;
if(set_time>=500)set_time_over=1;
}//end if(TMR0IF==1)
 
if(RC1IF==1) //串口1中断处理
{
rx_buf=RCREG1;        
if(rx_buf == 0x3A) //界定符
{
com_data_num =0;
start_receive_data_flag = 1;
}
if(start_receive_data_flag==1) //开始接收界定符、地址、数据及结束符。
{
ser_buf[com_data_num] = rx_buf;
com_data_num++;
if(rx_buf == 0x0A) //0x0d 回车 为结束符
{
start_receive_data_flag = 0;
ser_process_data_flag = 1;
}
}
if(ser_process_data_flag==1)
{
rx_buf=(ser_buf[5]-0x30)*10+ ser_buf[6]-0x30+6; //提取数据长度
buf_comm=0;
for(index_comm=1;index_comm<=rx_buf;index_comm++) //计算校验和
buf_comm=buf_comm+ser_buf[index_comm];
 
//if(buf_comm==((ASCII(ser_buf[rx_buf+1]))*16+ASCII(ser_buf[rx_buf+2]))) //比较校验和
{                        
//ser_com(); //串口命令处理程序  
Usart_Tm(ser_buf,com_data_num);            
}
ser_process_data_flag = 0;      
}
}//end if(RC1IF==1)
}
 
/******************************************************************************/
/* 串口中断函数  2 */
/******************************************************************************/ 
void interrupt low_priority Usart2(void)
{
unsigned char index_comm,buf_comm;
unsigned char rx_buf;
/*
if(ADIF==1)
{
ADIF=0;
adc[adc_start][ad_index]=ADRESH*256+ADRESL;
ad_index++;
if(ad_index>=AD_BUF_NUM)
{
adc_start++;
ad_index=0;
ADIE=0;        
ADIE=0;
ADON=0;
GO_nDONE=0;        
}
}
*/
if(RC2IF==1) //串口2中断处理
rx_buf=RCREG2;        
if(rx_buf == 0x3A)  //界定符
{
com_data_num =0;
start_receive_data_flag = 1;
}
if(start_receive_data_flag==1) //开始接收界定符、地址、数据及结束符。
{
ser_buf[com_data_num] = rx_buf;
com_data_num++;
if(rx_buf == 0x0A) //0x0d 回车 为结束符
{
start_receive_data_flag = 0;
ser_process_data_flag = 1;
}
}
if(ser_process_data_flag==1)
{
rx_buf=(ser_buf[5]-0x30)*10+ ser_buf[6]-0x30+6; //提取数据长度
buf_comm=0;
for(index_comm=1;index_comm<=rx_buf;index_comm++) //计算校验和
buf_comm=buf_comm+ser_buf[index_comm];
 
//if(buf_comm==((ASCII(ser_buf[rx_buf+1]))*16+ASCII(ser_buf[rx_buf+2]))) //比较校验和
{                        
//ser_com(); //串口命令处理程序  
Usart_Tm2(ser_buf,com_data_num);            
}
ser_process_data_flag = 0;      
}
}//end if(RC2IF==1)
}
 
以上程序未考虑容错,应加上:
 
if((RCSTA1bits.OERR==1)||(RCSTA1bits.FERR==1)){ 出错处理语句;}
关键字:PIC  双串口  C程序 引用地址:PIC双串口应用的C程序实现

上一篇:PIC16f630简单练习程序
下一篇:PIC按键LCD+DS1302+AD程序(C程序)

推荐阅读最新更新时间:2024-03-16 15:19

msp430单片机控制lcd1602显示C程序
//MSP430写的1602液晶显示程序2011/8/26//硬件连接 //P4 数据口 P3.7---E P3.6---RW P3.5----RS #include msp430x14x.h #define uint unsigned int #define rw(x) P3OUT=(P3OUT&(~BIT6))|(x?BIT6:0); unsigned char table0 = hankouxueyuan ; unsigned char table1 = dianzisheji ; //**************延时**
[单片机]
基于PIC16F628A的入侵探测装置
简介:介绍一种来人探测装置的原理及特点。该装置基于PIC16F628A单片机,采用一对收发独立的超声波换能器,利用多普勒效应,在一定空间内能够有效地探测到是否有人进入,并且能够输出信号控制照明设备的开关。 使用超声波可以很方便的对一定空间内的运动物体进行有效的探测,具有安装方便,探测效果好的特点。本文介绍一种利用超声波多普勒效应设计的来人探测装置。该设计使用了PIC16F628A单片机,对以往用到的超声波探测硬件电路进行改进,利用软件编程对来人情况进行有效地探测,继而输出控制信号控制照明装置的开关。 1 工作原理及特点 当声源与声波接收器之间存在有相对运动时,声波接收器所接收到的信号频率将与传播的声波频率有所不同,频率
[单片机]
基于<font color='red'>PIC</font>16F628A的入侵探测装置
PIC之MPLAB X IDE编辑器中红竖线的位置移动
本笔记由一根红线赞助!!! 没错!没错!!没错!!!就是圈圈里的那根红线。 代码:明明我才是主角,为什么你的光环那么抢眼!我不服! 一根红线:没办法,赞助商是我,哈哈哈哈! 代码:这。。。我还是ctrl+A再delete算了,不玩了,请继续你的表演吧! 一根红线:别!别!别!你不玩那我就没意思了。我跟编剧说改改吧。 编剧:改好了,看看吧! 一根红线:哎,不是,怎么改到我脸都没得露了?! 剧终—THE END!
[单片机]
<font color='red'>PIC</font>之MPLAB X IDE编辑器中红竖线的位置移动
max7219显示程序-C程序—汇编
max7219显示程序(汇编) #include msp430x41x.h DIN EQU 001H ;P1.0 CLK EQU 002H ;P1.1 LOAD EQU 004H ;P1.2 ORG 0F000H RESET MOV #300H,SP ;初始化 MOV #WDTPW+WDTHOLD,&WDTCTL BIS.B #CLK,&P1DIR BIS.B #DIN,&P1DIR BIS.B #LOAD,&P1DIR PUSH #00C01H ;设置工作模式 BIC.B #LOAD,&P1OUT CALL #MOVE BIS.B #LOAD,&P1OUT PUSH #00B05H ;设置扫描位数 BIC.B #LOAD,&P1
[单片机]
在温度变送器中PIC单片机有什么应用?
引言 在智能仪表设计中,经常用到 A/D 转换器。在常用的 A/D 转换中,7135 应用最为广泛, 它具有 41/2 位 A/D 转换精度,抗干扰能力强,价格低廉,主要用于检测参数的测量显示, 在智能仪器仪表中,常利用其 A/D 转换特性,与单片机串行连接,通过简单的人机界面实现对A/D 转换数据的智能控制。本文以 PIC 单片机与 ICL7135 的实际工程应用为例,介绍一款智能温度控制仪表在温度变送器中的应用。 1 PIC 单片机 PIC 系列 8 位 CMOS 单片机具有独特的 RISC 结构,数据总线和指令总线分离的哈佛总线(Harvard)结构,使指令具有单字长的特性,且允许指令码的位数可多于 8 位的数据位数,
[单片机]
在温度变送器中<font color='red'>PIC</font>单片机有什么应用?
PIC MPLAB X IDE和XC8 驱动问题
提示驱动有问题,解决办法如下: 板子外面给电或者仿真器提供电源给板子都可以! 我选择的是仿真器提供电源给目标板子,如下图所示: 务必选择下面仿真器的序列号!如下图所示:
[单片机]
<font color='red'>PIC</font> MPLAB X IDE和XC8 驱动问题
PIC系列单片机应用设计与实例
1.引言 在微控制器(Microcontroller)应用领域日益广泛的今天,各个领域的应用也向微控制器厂商提出了更高要求,希望速度更快、功耗更低、体积更小、价格更廉以及组成系统时所需要的外围器件更少;随着越来越多的各种非电子工程技术人员的应用需求,他们想把微控制器作为嵌入式部件应用到自己熟悉的领域中,还提出简单易学易用的要求。用户的需求就是厂商的市场和动力,老的半导体厂商顺应潮流不断推出新品种,新的半导体厂商则后来居上,把越来越多的外围接口器件集成到片内,功能越来越强、性能越来越高。迄今至少也有35家国外半导体厂商的微控制器进入中国市场。在这众多的五彩缤纷的微控制器中,美国Microchip技术公司的PIC系列微控制器则异军突
[工业控制]
AVR单片机4位数码管计数C程序
AVR单片机4位数码管计数,从0000-5000一直循环。位选端接在PC的低4位,而段选端接在PA口。程序如下: #include iom16v.h //头文件 #include macros.h //头文件 #define uchar unsigned char//宏定义 #define uint unsigned int//宏定义 uchar i;//定义变量 uint num;//定义计数变量 #pragma data:code//数组存放位置 const table ={ 0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved