用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心解决方案电子通信

PIC18FXX8单片机通用同步异步收发器的编程应用

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-01-10 22:54:43
行接收和发送数据的例程,程序实现功能:PIC18单片机接收到PC机下发的8个数据后,将收到的8个数据以中断或非中断发送方式返送回PC机。

#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 i;    /* 程序中用到的循环变量 */
unsigned char SciReceiveFlag; /* =1,接收到8个数据 */
unsigned char Send_Mode=0;  /* 不为0,中断方式发送;=0,非中断方式发送 */

void sciinitial()           /* 串行通讯初始化子程序 */
{
 TXSTA=0x04;    /* 选择异步高速方式传输8位数据 */
 RCSTA=0x80;    /* 允许串行口工作使能 */
 TRISC=TRISC0X80;  /* :将RC7(RX)设置为输入方式 */
 TRISC=TRISC&0Xbf;  /* RC6(TX)设置为输出 */
 SPBRG=25;    /* 4M晶振且波特率为9600时,SPBRG设置值为25 */
 PIR1=0x00;    /* 清中断标志 */
 PIE1=PIE10x20;   /* 允许串行通讯接口接收中断使能 */
 RCIP=0;     /* 设置SCI接收中断为低优先级中断  */
 CREN=1;     /* 允许串口连续接收数据 */
 if(0==Send_Mode) TXEN=1; /* Send_Mode=0,非中断方式发送,串口发送数据使能 */
 else      /* Send_Mode=1,中断方式发送 */
 {
  PIE1=PIE10x10;  /* 允许中断发送 */
  TXIP=0;    /* 发送低优先级中断 */
 }
}

void interrupt low_priority LOW_ISR()  /* 低优先级中断子程序 */
{
 if(RCIF==1)       /* RS232接收中断 */
 {
  RCIF=0;       /* 清中断标志 */
  receive232[receive_count]=RCREG; /* 接收数据并存储 */
  send232[receive_count]=RCREG;      /* 接收数据存放到发送缓冲数组 */
  receive_count++;     /* 接收计数器加1 */
  if(receive_count>7)     /* 如果已经接收到8个数据 */
  {
   receive_count=0;    /* 接收计数器清0 */
   SciReceiveFlag=1;    /* 置接收到8个数据标志 */
  }
 }
 else if((0!=Send_Mode)&&(TXIF==1))  /* 中断发送数据方式且为发送中断 */ 
 {
  if(send_count>7)     /* 已经发送完8个数 */
  {
   TXEN=0;      /* 发送不使能 */
   return;
  }
  else
  {
   send_count++;     /* 发送计数器加1 */
   TXREG=*pointer++;   /* 发送当前应发送数据,发送指针加1 */
  }
 }
}

main()                                /* 主程序 */
{
 INTCON=0x00;      /* 关总中断 */
 ADCON1=0X07;      /* 设置数字输入输出口,不用作模拟口 */
 PIE1=0;        /* PIE1 的中断不使能 */   
 PIE2=0;        /* PIE2 的中断不使能 */ 
 PIE3=0;        /* PIE3 的中断不使能 */
 Send_Mode=1;       /* Send_Mode不为0,中断方式发送数据;
Send_Mode =0,非中断方式发送数据 */
 sciinitial();       /* 串行通讯初始化子程序 */
 IPEN=1;        /* 使能中断高低优先级 */
 INTCON=INTCON0xc0;    /* 开总中断、开外围接口中断 */
 while(1)
 {
  if(1==SciReceiveFlag)    /* 是否接收到8个通信数据 */
  {
   SciReceiveFlag=0;    /* 清接收到8个通信数据标志 */
   if(0!=Send_Mode)       /* Send_Mode不为0,中断方式发送 */
   {
    send_count=0;    /* 发送数据计数清0 */
    pointer=&send232[0];  /* 发送指针指向发送数据数组首地址 */
    TXREG=*pointer++;  /* 发送第一个数据后,将发送指针加1 */
    TXEN=1;     /* 使能发送 */
   }
   else        /* Send_Mode =0,非中断方式发送数据 */
   {
    pointer=&send232[0];  /* 发送指针指向发送数据数组首地址 */
    for(i=0;i<8;i++)
    {
     TXREG=*pointer++; /* 发送数据后,将发送指针加1 */
     while(1)    /* 等待发送完成 */
     {
      if(TXIF==1) break; /* 等待发送完成 */
     } 
    }
   }
  }
 }
}

参考文献
[1] Microchip Technology Inc. PIC18FXX8 Data Sheet.2003.



上一页  [1] [2] 

Tags:

作者:佚名

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:10,546.88000 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号