这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » PIC串行通讯程序

共1条 1/1 1 跳转至

PIC串行通讯程序

助工
2014-10-09 17:18:30     打赏

功能描述: 串行通讯程序,单片机中断收到8个数据后,将收到的8个数据以中断发送方式返送回发送方

#include "pic18.h"  /* 所有PIC18系列的头文件 */
unsigned char receive232[8];  // 接收数据数组
unsigned char send232[8];  // 发送数据数组
unsigned char receive_count=0;// 接收数据个数计数
unsigned char send_count=0; // 发送数据个数计数
unsigned char *pointer;  // 发送指针
unsigned char SciReceiveFlag; // =1,接收到8个数据
/* ****************************************************************
** 函 数 名: initial()
** 功能描述: 系统初始化子程序,放在程序首部
*************************************************************** */
void initial()
{
 INTCON=0x00;   /* bit7-bit0:关总中断 */
 ADCON1=0X07;   /* 设置数字输入输出口 */
 PIE1=0;     /* PIE1 的中断不使能 */   
 PIE2=0;     /* PIE2 的中断不使能 */ 
 PIE3=0;     /* PIE3 的中断不使能 */ 
}
/* ****************************************************************
** 函 数 名: sciinitial()
** 功能描述: 232串行通讯初始化子程序,设置低优先级中断接收,使能232收
*************************************************************** */
void sciinitial()
{
 TXSTA=0x04;    // 选择异步高速方式传输8位数据
 RCSTA=0x80;    // 允许串行口工作使能,
 TRISC=TRISC|0X80;  // PIC18F458:将RC7(RX)设置为输入方式
 TRISC=TRISC&0Xbf;  // RC6(TX)设置为输出
 SPBRG=25;    // 4M晶振时波特率为25
 PIR1=0x00;    // 清中断标志
 PIE1=PIE1|0x20;   /* 允许串行通讯接口接收中断使能 */
 RCIP=0;     // 设置SCI接收中断为低优先级中断 
 CREN=1;     // 允许串口接收数据
 PIE1=PIE1|0x10;   // 允许中断发送
 TXIP=0;     // 低优先级中断
// TXEN=1;     // 允许串口发送数据
}
/* ****************************************************************
** 函 数 名: interrupt low_priority LOW_ISR()
** 功能描述: 低优先级中断子程序:RS232中断接收、中断发送
*************************************************************** */
void interrupt low_priority LOW_ISR()
{
 if(RCIF==1)
 {
  RCIF=0;
  receive232[receive_count]=RCREG; //接收数据并存储
  send232[receive_count]=RCREG;
  receive_count++;     // 接收计数器加1
  if(receive_count>7)     // 如果已经接收到8个数据
  {
   receive_count=0;    // 接收计数器清0
   SciReceiveFlag=1;    //置接收到数据标志
  }
 }
 else if(TXIF==1) 
 {
  // TXIF不能用软件清0  
  if(send_count>7)
  {
   TXEN=0;    // 已经发送到最后一个数,发送不使能
   return;
  }
  else
  {
   send_count++;  /* 发送计数器加1 */ 
   TXREG=*pointer++; /* 发送当前应发送数据,发送指针加1 */
  }
 }
}
main()     
{
 initial();     // 系统初始化
 sciinitial();    // 串行通讯初始化子程序
 IPEN=1;      // 使能中断高低优先级
 INTCON=INTCON|0xc0;   // 开总中断、开外围接口中断
 while(1)
 {
  if(1==SciReceiveFlag) /* 是否接收到通信数据 */
  {
   SciReceiveFlag=0; /* 清接收标志 */
   send_count=0;  /* 发送数据计数清0 */
   pointer=&send232[0];/* 发送数据指针指向发送数据数组首地址 */
   TXREG=*pointer++; /* 发送第一个数据后,将发送指针加1 */
   TXEN=1;    /* 使能发送 */
  }
 }
}

 


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]