⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.c

📁 一个rs485的小程序
💻 C
字号:
//利用中断接收 A1 5F 00 FE 发送8字节数据
//IFS0: CNIF MI2CIF SI2CIF NVMIF ADIF U1TXIF U1RXIF API1IF
//      T3IF T2IF   OC2IF  IC2IF T1IF 0X1IF  IC1IF  INT0IF

#include "p30f6010A.h"

_FOSC(CSW_FSCM_OFF & XT_PLL4);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_OFF & MCLR_EN);
_FGS(CODE_PROT_OFF);

#define Fcy  7370000

unsigned int i=0;
unsigned int cnt1;
unsigned char rx_value[4];
unsigned char tx_value[]={0xFF,0xFE,0xFD,0xFC,0xFB,0xFA,0xF9,0xF8};

void ini_TMR1(void);
void ini_485(void);
void delay_sec(int);

void main(void)
{
     ini_TMR1();
     ini_485();
     T1CONbits.TON = 1;  //启动T1
     asm (" NOP");
     asm (" NOP");
	 LATFbits.LATF5=1;     //1480BEPI ENABLE      
     while(1)
     {
       delay_sec(2);
     } 
}

void __attribute__((interrupt)) _U1RXInterrupt(void)
{  
    IFS0bits.U1RXIF=0;
    rx_value[i++]=U1RXREG;
    if(i==4)
    i=0;
}
    
void __attribute__((interrupt)) _T1Interrupt(void)
{
    IFS0bits.T1IF=0;   //clear interrupt flag
    IFS0bits.U1TXIF=0;
    if(rx_value[0]==0xA1 && rx_value[1]==0x5F && rx_value[2]==0 && rx_value[3]==0xFE)
    {
        for(i=0;i<4;i++)
        rx_value[i]=0;
        LATFbits.LATF5=0;
        for(i=0;i<8;i++)
        {        		 
                
            for(cnt1=0;cnt1<0xff;cnt1++);     
            U1TXREG=(int)tx_value[i];
            for(cnt1=0;cnt1<0xff;cnt1++);
            while(IFS0bits.U1TXIF==0); 
            for(cnt1=0;cnt1<0xff;cnt1++);
            IFS0bits.U1TXIF=0;
        }  
        LATFbits.LATF5=1; 
      } 
        else
        {
	       delay_sec(10);
	    } 
}

void ini_TMR1(void)
{
   TMR1=0;
   PR1=(Fcy/256)/4;
   IFS0bits.T1IF=0;
   IEC0bits.T1IE=0;
   T1CON=0x8030;
}

void ini_485(void)
{
        TRISFbits.TRISF5    =0;           
        TRISFbits.TRISF2    =1;               
        TRISFbits.TRISF3    =0;
        U1BRG    =47;            //9600 baud rate
//      U1BRG    =192;           //2400 baud rate
//      U1BRG    =95;            //4800 baud rate
        IPC2bits.U1RXIP=7;
        IEC0bits.U1TXIE=0;
        IEC0bits.U1RXIE=1;
        U1MODE    =0x8000;   
        U1STAbits.UTXEN    =1;    
}

void delay_sec(int n)
{
   unsigned int i,j;
   for(i=0;i<n;i++)
   {
      for(j=0;j<50000;j++);
   } 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -