專注差異化嵌入式產品解決方案 給智能產品定制注入靈魂給予生命
提供開發(fā)工具、應用測試 完善的開發(fā)代碼案例庫分享
從全面的產品導入到強大技術支援服務 全程貼心伴隨服務,創(chuàng)造無限潛能!
深圳市英銳恩科技有限公司:臺灣麥肯單片機(Micon MDT單片機)亞太地區(qū)A級代理商
{QLdsPIC3} RS-485 {C30+dsPIC30F6014A}
//實驗目的:熟悉RS485通信
//軟件規(guī)劃:
// 1.配合上位機軟件“串口助手”一起工作
// 2.上位機發(fā)送數(shù)據,下位機接收后不做任何處理發(fā)送回PC
// 3.接收數(shù)據采用中斷形式,發(fā)送數(shù)據在接收中斷里完成。
//硬件規(guī)劃:
// 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] ; //定義接收數(shù)據緩存變量
unsigned char __attribute__((address(0x950)))i;
//******************主函數(shù)*************************
int main (void)
{
unsigned char i;
ini232(); //調用RS232口初始化函數(shù)
for(i=100;i>0;i--); //延長時間以保證可靠初始化
LATGbits.LATG0=0; //489輸出有效(主芯片輸入),即主芯片接收PC數(shù)據
LATGbits.LATG1=0; //489輸入無效(主芯片輸出)
i=0;
while(1);
}
//*************RS232初始化函數(shù)**********************
void ini232(void)
{
TRISG=0;
TRISFbits.TRISF2 =1; //RC腳輸入
TRISFbits.TRISF3 =0; //TX腳輸出
IPC2bits.U1RXIP=7; //中斷優(yōu)先級別
IEC0bits.U1TXIE=0; //禁止發(fā)送中斷
IEC0bits.U1RXIE=1; //使能接收中斷
U1BRG =64; //波特率設置為9600,外部10M
U1MODE =0x8020; //使能UART功能
U1STA=0X0000;
i=0;
}
//************接收中斷函數(shù)**************************
void __attribute__((__interrupt__)) _U1RXInterrupt(void)
{
unsigned char txflag,j;
IFS0bits.U1RXIF = 0; //清除中斷標志位
rxdata1[i]=U1RXREG; //保存到接收單元里
i++; //指向下一接收單元
if(rxdata1[i-1]==0x0A) //判斷是否接收完所有數(shù)據(因為約定PC以“回車”鍵做發(fā)送數(shù)據結束標識符)
{
i=0;
txflag=1; //發(fā)送標志位
LATGbits.LATG1=1; //489輸入有效(主芯片輸出),即主控制器發(fā)送數(shù)據給PC
LATGbits.LATG0=1; //489輸出無效(住芯片輸入)
// for(j=0;j<200;j++);
while(txflag) //判斷是否要繼續(xù)發(fā)送
{
U1STAbits.UTXEN =1; //允許發(fā)送
U1TXREG=rxdata=rxdata1[i]; //發(fā)送數(shù)據
while(U1STAbits.TRMT==0); //等待一位發(fā)送完成
if(rxdata1[i]==0x0A) //判斷是否發(fā)送完所有數(shù)據
{
txflag=0; //清除發(fā)送標志位
i=-1; //返回接收單元開始處
}
i++; //發(fā)送下一個數(shù)據
}
}
LATGbits.LATG0=0; //489輸出有效(主芯片輸入),即主芯片接收PC數(shù)據;重新接收PC數(shù)據
LATGbits.LATG1=0;
}