金沙js5线路(中国)有限公司:台湾麦肯单片机(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;
}