日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀] /*通訊規(guī)則:1:時鐘7.3728MHz/波特率9600/9個數(shù)據(jù)位/奇校驗/1個停止位/硬件多機通訊功能/2:通訊連接采用硬件MAX485,雙向單工3:每個上行/下行的數(shù)據(jù)包的字節(jié)個數(shù)都是一樣的(通訊數(shù)據(jù)量)4:每個上行/下行的

/*
通訊規(guī)則:
1:時鐘7.3728MHz/波特率9600/9個數(shù)據(jù)位/奇校驗/1個停止位/硬件多機通訊功能/
2:通訊連接采用硬件MAX485,雙向單工
3:每個上行/下行的數(shù)據(jù)包的字節(jié)個數(shù)都是一樣的(通訊數(shù)據(jù)量)
4:每個上行/下行的數(shù)據(jù)包都采用CRC8校驗

5:數(shù)據(jù)接收采用中斷+查詢的方式
6:總是由主機向從機發(fā)送一個數(shù)據(jù)包,從機收到數(shù)據(jù)包后向主機回復(fù)一個數(shù)據(jù)包
7:不管是主機還是從機,如果收到的數(shù)據(jù)包有任何錯誤,都將丟棄該數(shù)據(jù)包,等效于沒有接收
8:從機之間不能相互通訊,必須通過主機才能交換數(shù)據(jù)
9:無效地址是0,主機地址是1,從機地址是2.3.4......廣播地址是255
*/
#include
#include
#defineamount10//設(shè)定通訊數(shù)據(jù)量(包括1個地址幀,n個數(shù)據(jù)幀,1個校驗幀)
#include
#include<1wire.h>//CRC校驗函數(shù)就在這個文件里面

unsignedcharsend[amount];//發(fā)件箱
unsignedcharinbox[amount];//收件箱
unsignedcharn=0;//記憶中斷次數(shù)

//--------------------------------------------------------------------
interrupt[19]Rxd_isr(void)//接收中斷
{
unsignedcharERROR=0;
if(UCSR0A&4||UCSR0A&16)ERROR=1;//奇偶效驗錯誤或者幀錯誤就記錄下來
inbox[n]=UDR0;//保存到收件箱
n++;//記憶中斷次數(shù)
if(ERROR)inbox[0]=0;//如果通訊有錯,收件箱的地址幀就標(biāo)記成無效地址0
}

//---------------------------------------------------------------------
voidmain(void)
{
USARTinit();//串口初始化
UCSR0A=0;//主機關(guān)閉地址篩選功能(多機通訊功能)
#asm("sei")//打開全局中斷
while(1)
{
//-------------與從機2對話,與其他從機對話與下面的程序類似-------------------
n=0;//中斷次數(shù)清0
inbox[0]=0;//收件箱地址清0
send[0]=2;//改變這個地址就可以實現(xiàn)與某個從機對話
send[amount-1]=w1_dow_crc8(send,amount-1);//計算發(fā)件箱的crc8校驗碼
TXD(send);//將發(fā)件箱的數(shù)據(jù)send[]發(fā)送出去;

//等待,從機接收到數(shù)據(jù)后會回復(fù)數(shù)據(jù)的,如果是10個字節(jié)數(shù)據(jù)量,不能少于13ms!!!
//這個時間由人工計算,要考慮從機由于各種中斷延長回復(fù)時間的可能
delay_ms(30);

//如果收件箱已經(jīng)收到amount個數(shù)據(jù),并且crc8校驗成功就...
if(n==amount&&inbox[amount-1]==w1_dow_crc8(inbox,amount-1))
{
if(inbox[0]==1)//如果收件箱地址幀屬于本機就運行下面的測試代碼
{
DDRD.3=1;
PORTD.3=1;delay_ms(50);
PORTD.3=0;delay_ms(950);
}

if(inbox[0]==255)
{
//請在這里添加收到廣播數(shù)據(jù)的處理程序
}
}
}
}//end





//**************************************************************************************************

從機程序

//**************************************************************************************************


#include
#include
#defineamount10//設(shè)定通訊數(shù)據(jù)量(包括1個地址幀,n個數(shù)據(jù)幀,1個校驗幀)
#include
#include<1wire.h>
#defineaddress2//請在這里設(shè)定本機地址

unsignedcharsend[amount];//發(fā)件箱
unsignedcharinbox[amount];//收件箱
unsignedcharn=0;//記憶中斷次數(shù)

//--------------------------------------------------------------------
interrupt[19]Rxd_isr(void)//接收中斷
{
unsignedcharERROR=0;
if(UCSR0A&4||UCSR0A&16)ERROR=1;//記錄奇偶效驗錯誤或者幀錯誤
inbox[n]=UDR0;//把接收到的數(shù)據(jù)保存到收件箱
n++;//記憶接收的次數(shù)
if(ERROR)//如果通訊有錯....
{
n=0;//接收計數(shù)清0
inbox[0]=0;//把地址改為無效地址0
UCSR0A|=0x01;//重新打開接收器的地址幀篩選功能
}

//如果地址匹配本機或者是廣播地址就關(guān)閉地址篩選(多機通訊)功能
if(inbox[0]==address||inbox[0]==255)UCSR0A&=254;

if(n==amount)//接收到amount個數(shù)據(jù)以后...
{
n=0;//接收計數(shù)清0
UCSR0A|=0x01;//重新打開接收器的地址幀篩選功能
if(inbox[amount-1]==w1_dow_crc8(inbox,amount-1))//如果crc8校驗正確就...
{
if(inbox[0]==address)//如果地址匹配本機就回復(fù)數(shù)據(jù)
{
send[0]=1;//發(fā)件箱地址指向主機
send[amount-1]=w1_dow_crc8(send,amount-1);//產(chǎn)生發(fā)件箱的crc8校驗碼
TXD(send);//發(fā)送發(fā)件箱的數(shù)據(jù)包send[]
//請在這里備份你的收件箱信息
}
if(inbox[0]==255)//如果是廣播地址就...
{
//請在這里添加你的代碼
//收到廣播數(shù)據(jù)請不要回復(fù)
}
}
}
}

//---------------------------------------------------------------------
voidmain(void)
{
USARTinit();//串口初始化
UCSR0A=0x01;//從機打開地址幀篩選功能(多機通訊模式)
#asm("sei")//打開全局中斷
while(1)
{
//請在這里添加你的代碼
}
}//end


//*********************************************************************************************

頭文件

//*********************************************************************************************

//波特率9600/9個數(shù)據(jù)位/1個停止位/奇校驗/收發(fā)開啟/接收中斷
voidUSARTinit(void)
{
UCSR0B=0x9C;
UCSR0C=0x36;
UBRR0L=0x2F;
PORTD.4=0;//MAX485平時工作在接收狀態(tài)
DDRD.4=1;
}

//-----------------------------------------------------------
//從數(shù)組datas[]的首地址開始發(fā)送amount個數(shù)據(jù),其中第0個數(shù)據(jù)是地址幀,其他是數(shù)據(jù)幀
voidTXD(unsignedchar*datas)
{
unsignedchari=0;
PORTD.4=1;//使MAX485處于發(fā)送狀態(tài)
while(i{
if(i==0)UCSR0B|=1;elseUCSR0B&=254;
UDR0=*(datas+i);//裝載數(shù)據(jù)開始發(fā)送
while((UCSR0A&64)==0);//等待發(fā)送結(jié)束
UCSR0A|=64;//清除發(fā)送結(jié)束標(biāo)志
i++;//發(fā)送次數(shù)統(tǒng)計
}
PORTD.4=0;//使MAX485處于接收狀態(tài)
}

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉