




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、注明:本發(fā)射程序帶SC12A觸摸按鍵程序,不要可以去掉,不去也行。 接收程序帶液晶1602程序。 實現功能發(fā)射端按鍵后控制接收端兩個LED燈亮滅。其它功能可根據愛好自己添加。 本程序編譯軟件IAR。運行平臺為ATmega16。晶振頻率為8MHZ,其他頻率也可以,但是要修改延時函數void inerDelay_us(uchar n),使其延時時間不變,不然運行不成功(切記,經驗教訓?。。┌l(fā)射程序:nrf24l01.htypedef unsigned char uchar;typedef unsigned int uint;/*NRF24L01端口定義*#define CE PORTA_Bit0#
2、define CSN PORTA_Bit1#define SCK PORTA_Bit2#define MOSI PORTA_Bit3#define Read_MISO PINA&(1<<4)#define Read_IRQ PINA&(1<<5)/*NRF24L01*#define TX_ADR_WIDTH 5 / 5 uints TX address width#define RX_ADR_WIDTH 5 / 5 uints RX address width#define TX_PLOAD_WIDTH 20 / 20 uints TX payload#
3、define RX_PLOAD_WIDTH 20 / 20 uints TX payloaduchar TX_ADDRESSTX_ADR_WIDTH= 0x34,0x43,0x10,0x10,0x01;/本地地址uchar RX_ADDRESSRX_ADR_WIDTH= 0x34,0x43,0x10,0x10,0x01;/接收地址/*NRF24L01寄存器指令*#define READ_REG 0x00 / 讀寄存器指令#define WRITE_REG 0x20 / 寫寄存器指令#define RD_RX_PLOAD 0x61 / 讀取接收數據指令#define WR_TX_PLOAD 0x
4、A0 / 寫待發(fā)數據指令#define FLUSH_TX 0xE1 / 沖洗發(fā)送 FIFO指令#define FLUSH_RX 0xE2 / 沖洗接收 FIFO指令#define REUSE_TX_PL 0xE3 / 定義重復裝載數據指令#define NOP 0xFF / 保留/*SPI(nRF24L01)寄存器地址*#define CONFIG 0x00 / 配置收發(fā)狀態(tài),CRC校驗模式以及收發(fā)狀態(tài)響應方式#define EN_AA 0x01 / 自動應答功能設置#define EN_RXADDR 0x02 / 可用信道設置#define SETUP_AW 0x03 / 收發(fā)地址寬度設置#
5、define SETUP_RETR 0x04 / 自動重發(fā)功能設置#define RF_CH 0x05 / 工作頻率設置#define RF_SETUP 0x06 / 發(fā)射速率、功耗功能設置#define STATUS 0x07 / 狀態(tài)寄存器#define OBSERVE_TX 0x08 / 發(fā)送監(jiān)測功能#define CD 0x09 / 地址檢測 #define RX_ADDR_P0 0x0A / 頻道0接收數據地址#define RX_ADDR_P1 0x0B / 頻道1接收數據地址#define RX_ADDR_P2 0x0C / 頻道2接收數據地址#define RX_ADDR_P3
6、 0x0D / 頻道3接收數據地址#define RX_ADDR_P4 0x0E / 頻道4接收數據地址#define RX_ADDR_P5 0x0F / 頻道5接收數據地址#define TX_ADDR 0x10 / 發(fā)送地址寄存器#define RX_PW_P0 0x11 / 接收頻道0接收數據長度#define RX_PW_P1 0x12 / 接收頻道0接收數據長度#define RX_PW_P2 0x13 / 接收頻道0接收數據長度#define RX_PW_P3 0x14 / 接收頻道0接收數據長度#define RX_PW_P4 0x15 / 接收頻道0接收數據長度#define
7、RX_PW_P5 0x16 / 接收頻道0接收數據長度#define FIFO_STATUS 0x17 / FIFO棧入棧出狀態(tài)寄存器設置/*void Delay(unsigned int s);void inerDelay_us(unsigned char n);void init_NRF24L01(void);uint SPI_RW(uint uchar);uchar SPI_Read(uchar reg);void SetRX_Mode(void);uint SPI_RW_Reg(uchar reg, uchar value);uint SPI_Read_Buf(uchar reg, u
8、char *pBuf, uchar uchars);uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);void nRF24L01_TxPacket(unsigned char * tx_buf);void Port_init_nRF24L01(void);/*長延時*void Delay(uint s)uint i;for(i=0; i<s; i+);for(i=0; i<s; i+);/*uchar sta;
9、 /狀態(tài)標志#defineRX_DRsta&(1<<6)#define TX_DSsta&(1<<5)#defineMAX_RTsta&(1<<4)/*/*延時函數/*/void inerDelay_us(uchar n)uchar i,j; for(j=n;j>0;j-) for(i=80;i>0;i-);/*/*NRF24L01初始化/*/void init_NRF24L01(void) inerDelay_us(100); CE=0; / chip enable CSN=1; / Spi disable SCK=0;
10、 / Spi clock line init highSPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); / 寫本地地址SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); / 寫接收端地址SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); / 頻道0自動ACK應答打開SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); / 允許接收地址只有頻道0,如果需要多頻道可以參考Page21 SPI_RW_
11、Reg(WRITE_REG + SETUP_RETR, 0x1a); /自動重發(fā)10次SPI_RW_Reg(WRITE_REG + RF_CH, 0); / 設置信道工作為2.4GHZ,收發(fā)必須一致SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); /設置接收數據長度,本次設置為32字節(jié)SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); /設置發(fā)射速率為1MHZ,發(fā)射功率為最大值0dB/*/*函數:uint SPI_RW(uint uchar)/*功能:NRF24L01的SPI寫時序/*/uint SPI_RW(uin
12、t data)uchar i;/,temp=0; for(i=0;i<8;i+) / output 8-bit if(data & 0x80) MOSI=1 ; / output 'uchar', MSB to MOSI else MOSI=0; data = (data << 1); / shift next bit into MSB.SCK=1; / Set SCK high.if(Read_MISO) data |= 1; / capture current MISO bitSCK=0; / .then set SCK low again ret
13、urn(data); / return read uchar/*/*函數:uchar SPI_Read(uchar reg)/*功能:NRF24L01的SPI時序/*/uchar SPI_Read(uchar reg)uchar reg_val;CSN = 0; / CSN low, initialize SPI communication.SPI_RW(reg); / Select register to read from.reg_val = SPI_RW(0); / .then read registervalueCSN = 1; / CSN high, terminate SPI co
14、mmunicationreturn(reg_val); / return register value/*/*功能:NRF24L01讀寫寄存器函數/*/uint SPI_RW_Reg(uchar reg, uchar value)uint status;CSN = 0; / CSN low, init SPI transactionstatus = SPI_RW(reg); / select registerSPI_RW(value); / .and write value to it.CSN = 1; / CSN high againreturn(status); / return nRF2
15、4L01 status uchar/*/*函數:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于讀數據,reg:為寄存器地址,pBuf:為待讀出數據地址,uchars:讀出數據的個數/*/uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)uint status,uchar_ctr;CSN = 0; / Set CSN low, init SPI tranactionstatus = SPI_RW(reg); / Select register to writ
16、e to and read status ucharfor(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr+)pBufuchar_ctr = SPI_RW(0); / CSN = 1; return(status); / return nRF24L01 status uchar/*/*函數:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于寫數據:為寄存器地址,pBuf:為待寫入數據地址,uchars:寫入數據的個數/*/uint SPI_Write_Buf(uchar reg,
17、uchar *pBuf, uchar uchars)uint status,uchar_ctr;CSN = 0; /SPI使能 status = SPI_RW(reg); for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr+) /SPI_RW(*pBuf+);CSN = 1; /關閉SPIreturn(status); / /*/*函數:void SetRX_Mode(void)/*功能:數據接收配置 /*/void SetRX_Mode(void)CE=0;SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); / IRQ收發(fā)完
18、成中斷響應,16位CRC,主接收CE = 1; inerDelay_us(130);/*/*函數:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)/*功能:數據讀取后放如rx_buf接收緩沖區(qū)中/*/unsigned char nRF24L01_RxPacket(unsigned char* rx_buf) unsigned char revale=0;sta=SPI_Read(STATUS);/ 讀取狀態(tài)寄存其來判斷數據接收狀況if(RX_DR)/ 判斷是否接收到數據 CE = 0; /SPI使能SPI_Read_Buf(RD_RX
19、_PLOAD,rx_buf,TX_PLOAD_WIDTH);/ read receive payload from RX_FIFO bufferrevale =1;/讀取數據完成標志SPI_RW_Reg(WRITE_REG+STATUS,sta); /接收到數據后RX_DR,TX_DS,MAX_PT都置高為1,通過寫1來清楚中斷標志return revale;/*/*函數:void nRF24L01_TxPacket(unsigned char * tx_buf)/*功能:發(fā)送 tx_buf中數據/*/void nRF24L01_TxPacket(unsigned char * tx_buf)
20、CE=0;/StandBy I模式SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); / 裝載接收端地址SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); / 裝載數據SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); / IRQ收發(fā)完成中斷響應,16位CRC,主發(fā)送CE=1; /置高CE,激發(fā)數據發(fā)送inerDelay_us(10);/*nRF24L01端口初始化*void Port_init_nRF24L01(void) DDRA_Bit
21、0=1; /CE設為輸出 DDRA_Bit1=1; /CSN設為輸出 DDRA_Bit2=1; /SCK設為輸出 DDRA_Bit3=1; /MOSI設為輸出 DDRA_Bit4=0; /MISO設為輸入 DDRA_Bit5=0; /IRQ設為輸入/SC12A.h#define SCL PORTC_Bit6#define SDA PORTC_Bit7#define Read_SDA (PINC&(1<<7)/#define ERR P1_3 / 指示通信過程有問題 #define CON_ADDR 0x81 / A6:0 + RWB = 81H ASEL 懸空 void P
22、ort_init_SC12A(void) DDRC_Bit6=1; /SCL設為輸出 DDRC_Bit7=1; /SDA設為輸出 PORTC_Bit6=1; PORTC_Bit7=1; unsigned int ReadKey(void) unsigned char bitnum,temp,addr; unsigned int key2byte; unsigned char bit_temp; addr=CON_ADDR; key2byte=0xffff; / EA=0; / 屏蔽全局中斷 SDA=0; / 拉低 SDA 端口送出 START 信號 for(temp=0;temp<4;t
23、emp+) /延時 /發(fā)送 8 位地址字節(jié) (A6:0+RWB) for(bitnum=0;bitnum<8;bitnum+) SCL=0; temp=addr&0x80; if(temp=0x80) SDA=1; else SDA=0; addr=addr<<1; for(temp=0;temp<4;temp+) /延時 SCL=1; for(temp=0;temp<4;temp+) /延時 SDA=1; /釋放 SDA 端口,將 SDA 設置為輸入端口 SCL=0; for(temp=0;temp<4;temp+) /延時 SCL=1; for(
24、temp=0;temp<4;temp+) /延時 / bit_temp=SDA; / if(bit_temp) /讀 ack 回應 / ERR=0; /ack 信號沒有讀到,指示通信有誤 /讀 16 位按鍵數據字節(jié)(D15:0) for(bitnum=0;bitnum<16;bitnum+) SCL=0; for(temp=0;temp<4;temp+) /延時 SCL=1; for(temp=0;temp<4;temp+) /延時 bit_temp=Read_SDA; if(bit_temp) key2byte=key2byte<<1; key2byte=
25、key2byte|0x01; else key2byte=key2byte<<1; SCL=0; SDA=1; for(temp=0;temp<4;temp+) /延時 SCL=1; for(temp=0;temp<4;temp+) /延時 SCL=0; SDA=0; /發(fā)送 NACK 信號 for(temp=0;temp<4;temp+) /延時 SCL=1; for(temp=0;temp<4;temp+) /延時 SDA=1; /釋放 SDA 端口,將 SDA 設置為輸入端口 key2byte=key2byte0xffff; /EA=1; /全局中斷使
26、能 return(key2byte); /數據位為 1,說明相應按鍵被觸摸。例如,返回值為 0x5000 說明按 /鍵 CIN1 和 CIN3 被觸摸。 /發(fā)射主程序#include <iom16.h>#include "nRF24L01.h"#include "SC12A.h"/*按鍵*#defineup !(PINC&(1<<0)#definedown !(PINC&(1<<1)#defineleft !(PINC&(1<<2)#defineright !(PINC&(1
27、<<3)/*端口初始化*void port_init(void) DDRA_Bit6=1; DDRA_Bit7=1; PORTA |= (1<<6)|(1<<7); /PA5 = 1,PA6 = 1,PA7 = 1 DDRC=0; PORTC=0xff;/*主函數* main()unsigned char TxBuf20=0; unsigned int key; uchar sign=0; port_init(); Port_init_SC12A(); Port_init_nRF24L01(); init_NRF24L01() ;while(1) key=R
28、eadKey(); if(up|(key=0x8000) TxBuf1=1; sign=1; if(down|(key=0x4000) TxBuf2=1; sign=1; if(left|(key=0x2000) TxBuf3=1; sign=1; if(right|(key=0x1000) TxBuf4=1; sign=1; if(sign) nRF24L01_TxPacket(TxBuf);/ Transmit Tx buffer data sign=0; TxBuf1=0; TxBuf2=0; TxBuf3=0; TxBuf4=0; sta = SPI_Read(STATUS); if(
29、sta = 0x2e) /當發(fā)送完成時TX_DS = 1,PC3 = 0 PORTA &= (1 << 7); else PORTA |= (1 << 7); sta=0; SPI_RW_Reg(WRITE_REG + STATUS,0xff);/清除TX FIFO寄存器,避免數據不能及時更新 PORTA = (1 << 6); Delay(6000); Delay(6000); PORTA |= (1 << 7); Nrf24l01接收:delay.h#ifndef _IAR_DELAY_H#define _IAR_DELAY_H#in
30、clude <intrinsics.h>#define XTAL 8.0 /可定義為你所用的晶振頻率(單位Mhz)#define delay_us(x) _delay_cycles ( (unsigned long)(x * XTAL) ) #define delay_ms(x) _delay_cycles ( (unsigned long)(x * XTAL*1000) )#define delay_s(x) _delay_cycles ( (unsigned long)(x * XTAL*1000000) )#endif/1602.h/*設置管腳*/#define RS POR
31、TD_Bit0 #define RW PORTD_Bit1#define E PORTD_Bit2/*LCD1602控制指令*/#define LCD_Set 0x38 / 顯示初始化,16*2顯示,5*7點陣,8位數據接口 ;#define LCD_Clear 0x01 / 清屏LCD ;#define LCD_Display1 0x0f / 顯示功能設置:開顯示,顯示光標,光標閃爍 ;#define LCD_Display2 0x0c / 顯示功能設置:開顯示,不顯示光標,光標不閃爍 ;#define LCD_Mode 0x06 / 設置光標狀態(tài)默認0x06,為讀一個字符光標加1 ;#de
32、fine LCD_FirstLineAddress_Left 0x80 /設置初始化數據指針,指向 左半屏第一行首位 ; #define LCD_SecondLineAddress_Left (0x80+0x40) /設置初始化數據指針,指向 左半屏第二行首位 ;#define LCD_FirstLineAddress_Right (0x80+0x10) /設置初始化數據指針,指向 右半屏第一行首位 ; #define LCD_SecondLineAddress_Right (0x80+0x40+0x10) /設置初始化數據指針,指向 右半屏第二行首位 ;#define LCD_Move_Le
33、ft 0x18 / 整屏左移#define LCD_Move_Right 0x1c / 整屏右移/*端口初始化*/void Port_Init_1602()DDRD_Bit0 = 1; /控制端 RS 定義為輸出DDRD_Bit1 = 1; /控制端 RW 定義為輸出DDRD_Bit2 = 1; /控制端 E 定義為輸出DDRC = 0xFF; /數據端定義為輸出DDRD_Bit3 = 1; /背光控制端PORTD_Bit3 =1; /由三級管控制,高電平導通; 始終打開背光/*液晶1602 寫控制指令函數*/void Write_Command(unsigned char Command)R
34、S = 0 ; / 進行指令的操作RW = 0 ; / 進行寫操作PORTC = Command ; / 賦值指令E = 1 ; / 使能端拉高delay_ms(5); / 等待指令寫完E = 0 ; / 使能端拉低/*液晶1602 寫數據函數*/void Write_Data(unsigned char Data)RS = 1 ; / 進行數據的操作RW = 0 ; / 進行寫操作PORTC = Data ; / 賦值數據E = 1 ; / 使能端拉高delay_ms(5); / 等待數據寫完E = 0 ; / 使能端拉低/*液晶1602 使用初始化*/void LCD1602_Init()
35、E = 0;Write_Command(LCD_Set);Write_Command(LCD_Clear);Write_Command(LCD_Display2);Write_Command(LCD_Mode);/*液晶1602 清屏*/void LCD1602_Clear(void)Write_Command(LCD_Clear);/*液晶1602 左半屏顯示*/void LCD1602_Left_Display(unsigned char *table1 , unsigned char *table2)unsigned char i;Write_Command(LCD_FirstLineA
36、ddress_Left);delay_ms(1); /第一行顯示16個字符for(i=0;i<16;i+)Write_Data(table1i);delay_ms(1); Write_Command(LCD_SecondLineAddress_Left);delay_ms(1); /第二行顯示16個字符for(i=0;i<16;i+)Write_Data(table2i);delay_ms(1);/*液晶1602 右半屏顯示*/void LCD1602_Right_Display(unsigned char *table1 , unsigned char *table2)unsigned char i;Write_Command(LCD_FirstLineAddress_Right); /第一行顯示16個字符dela
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年海水淡化及水處理設備項目發(fā)展計劃
- 教育技術創(chuàng)新塑造未來的學習體驗
- 教育政策與教師能力提升的相互促進關系
- 未來十年的教育創(chuàng)新趨勢與挑戰(zhàn)
- 企業(yè)如何通過智能倉儲提升競爭力
- 教育心理學視角下的學生成效評估體系構建
- 基礎護士重癥科生命支持技術考試題庫及答案
- 醫(yī)療輔助教育探索新型教育模式
- 中職政治教學課件
- 在線考試系統(tǒng)的未來發(fā)展及挑戰(zhàn)分析
- GB/T 1606-2008工業(yè)碳酸氫鈉
- 葛的栽培技術
- 《綠色建筑概論》整套教學課件
- 山東中醫(yī)藥大學2020-2021學年內科護理學試題及答案2
- 2022年綿陽江油市社區(qū)工作者招聘考試模擬試題及答案解析
- 初中道德與法治學科教學經驗交流
- 工程測量、定位放線控制點復核記錄表
- 申辦出入境證件的函
- 安全評估收費指導意見
- 全過程工程造價咨詢服務實施方案
- DB34-T 4289-2022城鎮(zhèn)檢查井蓋安裝管理技術規(guī)程
評論
0/150
提交評論