技术热线: 4007-888-234

{QLdsPIC3} RS

更新时间: 2019-03-23
阅读量:3128

深圳市英锐恩科技有限公司:台湾麦肯单片机(Micon MDT单片机)亚太地区A级代理商

{QLdsPIC3} RS-485 {C30+dsPIC30F6014A}
//实验目的:熟悉RS485通信
//软件规划:
//          1.配合上位机软件“串口助手”一起工作
//          2.上位机发送数据,下位机接收后不做任何处理发送回PC
//          3.接收数据采用中断形式,发送数据在接收中断里完成。
//硬件规划:
//          1。通过RS485转RS232连接到电脑上。
//          2。拨码开关S5和S6全部置ON,其他拨码开关关闭。

#include             //dsPIC30F6014标准头文件

  _FOSC(0x0ffe5);                 //XT振荡,4倍频晶振.
  _FWDT(WDT_OFF);                 //关闭看门狗定时器
  _FBORPOR(PBOR_OFF & MCLR_EN);   //掉电复位禁止,MCLR复位使能。
  _FGS(CODE_PROT_OFF);            //代码保护禁止


void ini232(void);               
void __attribute__((__interrupt__)) _U1RXInterrupt(void); /*Declare 232 interrupt ISRs*/

unsigned char __attribute__((address(0x896)))flag;
unsigned char __attribute__((address(0x898)))rxdata;
unsigned char __attribute__((address(0x900)))rxdata1[20] ;            //定义接收数据缓存变量
 unsigned char __attribute__((address(0x950)))i;
//******************主函数*************************
int main (void)
{
unsigned char i;
ini232();                         //调用RS232口初始化函数
for(i=100;i>0;i--);               //延长时间以保证可靠初始化
LATGbits.LATG0=0;                 //489输出有效(主芯片输入),即主芯片接收PC数据
LATGbits.LATG1=0;                 //489输入无效(主芯片输出)
i=0;
while(1);             
}

//*************RS232初始化函数**********************
void ini232(void)
{
  TRISG=0;
  TRISFbits.TRISF2 =1;            //RC脚输入
  TRISFbits.TRISF3 =0;            //TX脚输出
  IPC2bits.U1RXIP=7;              //中断优先级别
  IEC0bits.U1TXIE=0;              //禁止发送中断
  IEC0bits.U1RXIE=1;              //使能接收中断
  U1BRG =64;                      //波特率设置为9600,外部10M
  U1MODE =0x8020;                 //使能UART功能
  U1STA=0X0000;   
  i=0;
}

//************接收中断函数**************************
void __attribute__((__interrupt__)) _U1RXInterrupt(void)
{  
   
    unsigned char txflag,j;   
    IFS0bits.U1RXIF = 0;              //清除中断标志位
    rxdata1[i]=U1RXREG;               //保存到接收单元里
    i++;                              //指向下一接收单元

    if(rxdata1[i-1]==0x0A)            //判断是否接收完所有数据(因为约定PC以“回车”键做发送数据结束标识符)
      {
       i=0;
       txflag=1;                      //发送标志位
       LATGbits.LATG1=1;              //489输入有效(主芯片输出),即主控制器发送数据给PC
       LATGbits.LATG0=1;              //489输出无效(住芯片输入)
   //  for(j=0;j<200;j++);
        while(txflag)                 //判断是否要继续发送
         {
          U1STAbits.UTXEN =1;         //允许发送
          U1TXREG=rxdata=rxdata1[i];  //发送数据
        
          while(U1STAbits.TRMT==0);   //等待一位发送完成
          if(rxdata1[i]==0x0A)        //判断是否发送完所有数据
             {
                txflag=0;             //清除发送标志位
                i=-1;                 //返回接收单元开始处
             }
          i++;                        //发送下一个数据
         }
       
      }
   LATGbits.LATG0=0;                  //489输出有效(主芯片输入),即主芯片接收PC数据;重新接收PC数据
   LATGbits.LATG1=0;                 
}