?? m48_1__.c
字號(hào):
/*
www.avrdiy.com AVR單片機(jī)DIY網(wǎng) 潘小藝 CVAVR1.24.8d
通訊規(guī)則:
1:時(shí)鐘7.3728 MHz/波特率9600/9個(gè)數(shù)據(jù)位/奇校驗(yàn)/1個(gè)停止位/硬件多機(jī)通訊功能/
2:通訊連接采用硬件MAX485,雙向單工
3:每個(gè)上行/下行的數(shù)據(jù)包的字節(jié)個(gè)數(shù)都是一樣的(通訊數(shù)據(jù)量)
4:每個(gè)上行/下行的數(shù)據(jù)包都采用CRC8校驗(yàn)
5:數(shù)據(jù)接收采用中斷+查詢的方式
6:總是由主機(jī)向從機(jī)發(fā)送一個(gè)數(shù)據(jù)包,從機(jī)收到數(shù)據(jù)包后向主機(jī)回復(fù)一個(gè)數(shù)據(jù)包
7:不管是主機(jī)還是從機(jī),如果收到的數(shù)據(jù)包有任何錯(cuò)誤,都將丟棄該數(shù)據(jù)包,等效于沒(méi)有接收
8:從機(jī)之間不能相互通訊,必須通過(guò)主機(jī)才能交換數(shù)據(jù)
9:無(wú)效地址是0,主機(jī)地址是1,從機(jī)地址是2.3.4......廣播地址是255
*/
#include <mega48.h>
#include <delay.h>
#define amount 10 //設(shè)定通訊數(shù)據(jù)量(包括1個(gè)地址幀,n個(gè)數(shù)據(jù)幀,1個(gè)校驗(yàn)幀)
#include <usart.h>
#include <1wire.h> //CRC校驗(yàn)函數(shù)就在這個(gè)文件里面
unsigned char send[amount]; //發(fā)件箱
unsigned char inbox[amount]; //收件箱
unsigned char n=0; //記憶中斷次數(shù)
//--------------------------------------------------------------------
interrupt[19] Rxd_isr(void) //接收中斷
{
unsigned char ERROR=0;
if( UCSR0A&4 || UCSR0A&16 ) ERROR=1; //奇偶效驗(yàn)錯(cuò)誤或者幀錯(cuò)誤就記錄下來(lái)
inbox[n]=UDR0; //保存到收件箱
n++; //記憶中斷次數(shù)
if(ERROR) inbox[0]=0; //如果通訊有錯(cuò),收件箱的地址幀就標(biāo)記成無(wú)效地址0
}
//---------------------------------------------------------------------
void main(void)
{
USARTinit(); //串口初始化
UCSR0A=0; //主機(jī)關(guān)閉地址篩選功能(多機(jī)通訊功能)
#asm("sei") //打開(kāi)全局中斷
while(1)
{
//-------------與從機(jī)2對(duì)話,與其他從機(jī)對(duì)話與下面的程序類似-------------------
n=0; //中斷次數(shù)清0
inbox[0]=0; //收件箱地址清0
send[0]=2; //改變這個(gè)地址就可以實(shí)現(xiàn)與某個(gè)從機(jī)對(duì)話
send[amount-1]=w1_dow_crc8(send,amount-1); //計(jì)算發(fā)件箱的crc8校驗(yàn)碼
TXD(send); //將發(fā)件箱的數(shù)據(jù)send[]發(fā)送出去;
//等待,從機(jī)接收到數(shù)據(jù)后會(huì)回復(fù)數(shù)據(jù)的,如果是10個(gè)字節(jié)數(shù)據(jù)量,不能少于13ms!!!
//這個(gè)時(shí)間由人工計(jì)算,要考慮從機(jī)由于各種中斷延長(zhǎng)回復(fù)時(shí)間的可能
delay_ms(30);
//如果收件箱已經(jīng)收到amount個(gè)數(shù)據(jù),并且crc8校驗(yàn)成功就...
if(n==amount && inbox[amount-1]==w1_dow_crc8(inbox,amount-1))
{
if(inbox[0]==1) //如果收件箱地址幀屬于本機(jī)就運(yùn)行下面的測(cè)試代碼
{
DDRD.3=1;
PORTD.3=1; delay_ms(50);
PORTD.3=0; delay_ms(950);
}
if(inbox[0]==255)
{
//請(qǐng)?jiān)谶@里添加收到廣播數(shù)據(jù)的處理程序
}
}
}
} //end
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -