SPI nRF24L01无线 [可以放在2个单片机里实现通信]

发布者:Blissful444最新更新时间:2017-01-15 来源: eefocus关键字:SPI  nRF24L01  单片机 手机看文章 扫描二维码
随时随地手机看文章

main.c

 1 #include

 2 #include"2401.h"

 3 

 4 #define uint unsigned int

 5 #define uchar unsigned char

 6 

 7 sbit KEY8=P3^7;     //发送按键 

 8 sbit beep=P2^3;//喇叭 

 9 sbit LED6=P1^6;     ////接收到数据后的功能实现灯  

10 

11 void delay_ms(uint z)     //延时函数 

12 {

13     uint x,y;

14     for(x=z;x>0;x--)

15         for(y=110;y>0;y--);

16 }

17 void delayms(unsigned int x)

18 {

19     unsigned int i;

20     while(x--)

21         for(i=125;i>0;i--);

22 }

23 void main()

24 {

25      uchar Tx_Buf1[]={1};//发送的信息1 

26      uchar Rx_Buf[32];  //接收到的数据暂存器,最多32字节数据  

27      init_NRF24L01();

28      LED6=1;//初始灯6熄灭   

29 

30 

31     while(NRF24L01_Check())        //检查不到24l01则报警 

32     {

33         beep=0;

34         delayms(200);

35         beep=1;

36         delayms(200);

37     }

38     while(1)

39     {    

40         RX_Mode();//接收模式  

41         while(!nRF24L01_RxPacket(Rx_Buf)) //等待接收数据 ,返回1则接收到数据 ,在等待接收数据期间,可以随时变成发送模式  

42         {

43             if(KEY8==0)     //按了按键8   则变成发送模式,发送对应数据,发送完后变成接收模式 

44             {    

45                 delay_ms(5);//消抖动 

46                 if(KEY8==0)

47                 {

48                      while(!KEY8);

49                     TX_Mode();     //发送模式 

50                     nRF24L01_TxPacket(Tx_Buf1);    // 发送命令数据

51                       LED6=0;

52                     delay_ms(300);

53                     LED6=1;

54                     delay_ms(300);            //发送后LED6闪一下 

55                     break;    //退出最近的循环,从而变回接收模式,这句关键

56                  }

57                 

58              }

59          }

60          if(Rx_Buf[0]==1)       //若接收到对应的数据则实现对应功能 

61          {

62              Rx_Buf[0]=0;//清空数据 

63                LED6=0;

64              delay_ms(300);

65              LED6=1;

66              delay_ms(300);//接收到数据 后闪烁      

67          }         

68     }

69 }

2401.h

  1 #ifndef __NRF24L01_H__

  2 #define __NRF24L01_H__

  3 #include

  4 #define uchar unsigned char

  5 #define uint unsigned int

  6 

  7 sbit    CE        =P1^0;

  8 sbit    CSN        =P1^1;

  9 sbit    SCK        =P1^2;

 10 sbit     MOSI    =P1^3;

 11 sbit     MISO    =P1^4;

 12 sbit    IRQ        =P1^5;

 13 

 14 //uchar TxBuf[20]={"1234567890abcdefghij"};

 15 #define TX_ADR_WIDTH    5       // 5 uints TX address width

 16 #define RX_ADR_WIDTH    5       // 5 uints RX address width

 17 #define TX_PLOAD_WIDTH  32      // 32 uints TX payload

 18 #define RX_PLOAD_WIDTH  32      // 32 uints TX payload

 19 uchar  TX_ADDRESS[TX_ADR_WIDTH]= {0xE7,0xE7,0xE7,0xE7,0xE7};    //本地地址

 20 uchar  RX_ADDRESS[RX_ADR_WIDTH]= {0xE7,0xE7,0xE7,0xE7,0xE7};    //接收地址

 21 ///***************************************NRF24L01寄存器指令*******************************************************

 22 #define READ_REG        0x00      // 读寄存器指令

 23 #define WRITE_REG       0x20     // 写寄存器指令

 24 #define RD_RX_PLOAD     0x61      // 读取接收数据指令

 25 #define WR_TX_PLOAD     0xA0      // 写待发数据指令

 26 #define FLUSH_TX        0xE1     // 冲洗发送 FIFO指令

 27 #define FLUSH_RX        0xE2      // 冲洗接收 FIFO指令

 28 #define REUSE_TX_PL     0xE3      // 定义重复装载数据指令

 29 #define NOP             0xFF      // 保留

 30 ///*************************************SPI(nRF24L01)寄存器地址****************************************************

 31 #define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式

 32 #define EN_AA           0x01  // 自动应答功能设置

 33 #define EN_RXADDR       0x02  // 可用信道设置

 34 #define SETUP_AW        0x03  // 收发地址宽度设置

 35 #define SETUP_RETR      0x04  // 自动重发功能设置

 36 #define RF_CH           0x05  // 工作频率设置

 37 #define RF_SETUP        0x06  // 发射速率、功耗功能设置

 38 #define NRFRegSTATUS    0x07  // 状态寄存器

 39 #define OBSERVE_TX      0x08  // 发送监测功能

 40 #define CD              0x09  // 地址检测           

 41 #define RX_ADDR_P0      0x0A  // 频道0接收数据地址

 42 #define RX_ADDR_P1      0x0B  // 频道1接收数据地址

 43 #define RX_ADDR_P2      0x0C  // 频道2接收数据地址

 44 #define RX_ADDR_P3      0x0D  // 频道3接收数据地址

 45 #define RX_ADDR_P4      0x0E  // 频道4接收数据地址

 46 #define RX_ADDR_P5      0x0F  // 频道5接收数据地址

 47 #define TX_ADDR         0x10  // 发送地址寄存器

 48 #define RX_PW_P0        0x11  // 接收频道0接收数据长度

 49 #define RX_PW_P1        0x12  // 接收频道1接收数据长度

 50 #define RX_PW_P2        0x13  // 接收频道2接收数据长度

 51 #define RX_PW_P3        0x14  // 接收频道3接收数据长度

 52 #define RX_PW_P4        0x15  // 接收频道4接收数据长度

 53 #define RX_PW_P5        0x16  // 接收频道5接收数据长度

 54 #define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置

 55 ///*****************************子函数集*********************************************************

 56 uchar NRF24SPI_Send_Byte(uchar dat);

 57 uchar SPI_WR_Reg(uchar reg, uchar value);

 58 uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar Len);

 59 uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar Len);

 60 uchar nRF24L01_RxPacket(unsigned char* rx_buf);

 61 void nRF24L01_TxPacket(unsigned char * tx_buf);

 62 uchar SPI_RD_Reg(uchar reg);

 63 void init_NRF24L01(void);

 64 void TX_Mode(void);

 65 void RX_Mode(void);

 66 void NRF_Send(void);

 67 uchar NRF24L01_Check(void);

 68 ///*************************************************************************************

 69 uchar NRF24SPI_Send_Byte(uchar dat)

 70 {

 71   uchar i;

 72    for (i = 0; i < 8; i++) // output 8-bit

 73    {

 74       //发送1位数据

 75       if (dat & 0x80)         // output 'uchar', MSB to MOSI

 76       {

 77          MOSI = 1;

 78       }

 79       else

 80       {

 81          MOSI = 0;

 82       }

 83 

 84       dat <<= 1;           // shift next bit into MSB..

 85       

 86       //读取1位数据

 87       SCK = 1;                      // Set SCK high..

 88 

 89       if (MISO)

 90       {

 91          dat |= 1;

 92       }             // capture current MISO bit

 93       else

 94       {

 95          dat &= 0xFE;

 96       }

 97       SCK = 0;                    // ..then set SCK low again

 98    }

 99    

100    return(dat);                  // return read uchar

101 }

102 

103 void Delay_n10us(uint n)       //延时n个10us

104 {

105    for(;n>0;n--)

106    {

107         unsigned char a,b;

108      for(b=1;b>0;b--)

109          for(a=2;a>0;a--);

110    }

111 }

112 ///****************************************************************************************

113 ///*NRF24L01检测是否存在

114 ///***************************************************************************************/

115 uchar NRF24L01_Check(void)

116 {

117     uchar bu[5]={0XA5,0XA5,0XA5,0XA5,0XA5};

118     uchar bu1[5];

119     uchar i;        

120     SPI_Write_Buf(WRITE_REG+TX_ADDR,bu,5);//写入5个字节的地址.    

121     SPI_Read_Buf(TX_ADDR,bu1,5);              //读出写入的地址      

122     for(i=0;i<5;i++)if(bu1[i]!=0XA5)break;                       

123     if(i!=5)return 1;                               //NRF24L01不在位    

124     return 0;                                        //NRF24L01在位

125 }          

126 ///****************************************************************************************

127 ///*NRF24L01初始化

128 ///***************************************************************************************/

129 void init_NRF24L01(void)

130 {

131    uchar buf[5]={0};

132    Delay_n10us(10);

133    CE = 0;    // chip enable

134    CSN= 0;    // Spi disable 

135   

136   SPI_Read_Buf(TX_ADDR, buf, TX_ADR_WIDTH);//debug 测试原来的本地地址:复位值是:0xE7 0xE7 0xE7 0xE7 0xE7

137   

138 //    SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写本地地址    

139 //    SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址

140 

141 //    

142 //    SPI_WR_Reg(WRITE_REG + EN_AA, 0x01);      //  频道0自动    ACK应答允许    

143 //    SPI_WR_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允许接收地址只有频道0,如果需要多频道可以参考Page21  

144 //    SPI_WR_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 设置自动重发时间和次数:500us + 86us, 10 retrans...

145 //    SPI_WR_Reg(WRITE_REG + RF_CH, 22);        //   设置信道工作为2.4GHZ,收发必须一致

146 //    SPI_WR_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节

147 //    SPI_WR_Reg(WRITE_REG + RF_SETUP, 0x07);           //设置发射速率为1MHZ,发射功率为最大值0dB

148 //  

149 //  SPI_RD_Reg(WRITE_REG + EN_AA);

150 //  SPI_RD_Reg(WRITE_REG + EN_RXADDR);

151 //  SPI_RD_Reg(WRITE_REG + RF_CH);

152 //  SPI_RD_Reg(WRITE_REG + RX_PW_P0);

153 //  SPI_RD_Reg(WRITE_REG + RF_SETUP);

154 }

155 ///****************************************************************************************************

156 ///*函数:uchar SPI_Read(uchar reg)

157 ///*功能:NRF24L01的SPI时序

158 ///****************************************************************************************************/

159 uchar SPI_RD_Reg(uchar reg)

160 {

161     uchar reg_val;

162     

163     CSN = 0;                // CSN low, initialize SPI communication...

164     NRF24SPI_Send_Byte(reg);            // Select register to read from..

165     reg_val = NRF24SPI_Send_Byte(0);    // ..then read registervalue

166     CSN = 1;                // CSN high, terminate SPI communication

167     

168     return(reg_val);        // return register value

169 }

170 //****************************************************************************************************/

171 //*功能:NRF24L01读写寄存器函数

172 //****************************************************************************************************/

173 uchar SPI_WR_Reg(uchar reg, uchar value)

174 {

175     uchar status;

176     

177     CSN = 0;                   // CSN low, init SPI transaction

178     status = NRF24SPI_Send_Byte(reg);// select register

179     NRF24SPI_Send_Byte(value);             // ..and write value to it..

180     CSN = 1;                   // CSN high again

181     

182     return(status);            // return nRF24L01 status uchar

183 }

184 ///****************************************************************************************************/

185 //*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar Len)

186 //*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数

187 //****************************************************************************************************/

188 uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar Len)

189 {

190     uint status,i;

191     

192     CSN = 0;                            // Set CSN low, init SPI tranaction

193     status = NRF24SPI_Send_Byte(reg);               // Select register to write to and read status uchar

194     

195   for(i=0;i

196   {

197      pBuf[i] = NRF24SPI_Send_Byte(0);

198   }

199     

200     CSN = 1;                           

201     

202     return(status);                    // return nRF24L01 status uchar

203 }

204 //*********************************************************************************************************

205 //*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar Len)

206 //*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数

207 //*********************************************************************************************************/

208 uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar Len)

209 {

210     uint status,i;

211     

212     CSN = 0;            //SPI使能       

213     status = NRF24SPI_Send_Byte(reg);   

214     for(i=0; i

215     {

216        NRF24SPI_Send_Byte(*pBuf);

217          pBuf ++;

218     }

219     CSN = 1;           //关闭SPI

220     return(status);    // 

221 }

222 

223 //****************************************************************************************************/

224 //*函数:void SetRX_Mode(void)

225 //*功能:数据接收配置 

226 //****************************************************************************************************/

227 void RX_Mode(void)

228 {

229     uchar buf[5]={0};

230     CE = 0;

231     

232     SPI_Read_Buf(TX_ADDR, buf, TX_ADR_WIDTH);//debug 测试原来的本地地址:复位值是:0xE7 0xE7 0xE7 0xE7 0xE7

233     //SPI_WR_Reg(WRITE_REG + CONFIG, 0x03);//SPI_WR_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC    ,主接收

234     

235     //SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写本地地址    

236     SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址

237     

238     SPI_WR_Reg(WRITE_REG + EN_AA, 0);//0x01);      //  频道0自动    ACK应答允许    

239     SPI_WR_Reg(WRITE_REG + EN_RXADDR,0x01);  //  允许接收地址只有频道0,如果需要多频道可以参考Page21  

240     SPI_WR_Reg(WRITE_REG + SETUP_RETR,0x1a); // 设置自动重发时间和次数:500us + 86us, 10 retrans...

241     SPI_WR_Reg(WRITE_REG + RF_CH, 40);        //   设置信道工作为2.4GHZ,收发必须一致

242     SPI_WR_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节

243     SPI_WR_Reg(WRITE_REG + RF_SETUP, 0x0F);           //设置发射速率为2MHZ,发射功率为最大值0dB

244     

245     SPI_WR_Reg(WRITE_REG + CONFIG, 0x0F);//0x0F);    

246     CE = 1; 

247     Delay_n10us(20); //200us

248 }

249 //******************************************************************************************************/

250 //*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)

251 //*功能:数据读取后放如rx_buf接收缓冲区中

252 //******************************************************************************************************/

253 uchar nRF24L01_RxPacket(unsigned char* rx_buf)

254 {

255     uchar flag=0;

256     uchar status;

257      

258     status=SPI_RD_Reg(NRFRegSTATUS);    // 读取状态寄存其来判断数据接收状况

259     

260     if(status & 0x40)                // 判断是否接收到数据

261     {

262        CE = 0;             //SPI使能

263          SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer

264          flag =1;            //读取数据完成标志

265     }

266     SPI_WR_Reg(WRITE_REG+NRFRegSTATUS, status);   //接收到数据后RX_DR,TX_DS,MAX_RT都置高为1,通过写1来清楚中断标志

267     return flag;

268 }

269 void TX_Mode(void)

270 {

271     CE = 0;

272     //SPI_WR_Reg(WRITE_REG + CONFIG, 0x02);   //0x0E         // IRQ收发完成中断响应,16位CRC,主发送

273     

274     SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写本地地址    

275     SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址

276     

277     SPI_WR_Reg(WRITE_REG + EN_AA, 0);//0x01);      //  频道0自动    ACK应答允许    

278     SPI_WR_Reg(WRITE_REG + EN_RXADDR,0);// 0x01);  //  允许接收地址只有频道0,如果需要多频道可以参考Page21  

279     SPI_WR_Reg(WRITE_REG + SETUP_RETR, 0);//0x1a); // 设置自动重发时间和次数:500us + 86us, 10 retrans...

280     SPI_WR_Reg(WRITE_REG + RF_CH, 40);        //   设置信道工作为2.4GHZ,收发必须一致

281     SPI_WR_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节

282     SPI_WR_Reg(WRITE_REG + RF_SETUP, 0x0F);           //设置发射速率为2MHZ,发射功率为最大值0dB

283 

284     SPI_WR_Reg(WRITE_REG + CONFIG, 0x0E);

285     CE = 1;

286 }

287 //***********************************************************************************************************

288 //*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)

289 //*功能:发送 tx_buf中数据

290 //**********************************************************************************************************/

291 void nRF24L01_TxPacket(unsigned char * tx_buf)

292 {

293     CE = 0;            //StandBy I模式    

294     SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址

295     SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);              // 装载数据    

296 //    SPI_WR_Reg(WRITE_REG + CONFIG, 0x0e);            // IRQ收发完成中断响应,16位CRC,主发送

297     CE = 1;         //置高CE,激发数据发送

298 }

299 

300 

301 ///************************************主函数************************************************************

302 //void NRF_Send(void)

303 //{

304 //  //static uint counter=0;

305 //  static uchar flag=0;  

306 //   

307 //   //TX_Mode();

308 //   

309 //   //IntervalTimems(100);

310 //   if(flag==0)

311 //   {

312 //      flag=1;

313 //      //memcpy(TxBuf, "1234567890abcdefghij", 20);

314 //      nRF24L01_TxPacket(TxBuf);

315 //   }

316 //   else

317 //   {

318 //      flag=0;

319 //      //memcpy(TxBuf, "abcdefghij1234567890", 20);

320 //      nRF24L01_TxPacket(TxBuf);

321 //   }

322 //   

323 //}

324 

325 #endif   /*__NRF24L01_H__ */





关键字:SPI  nRF24L01  单片机 引用地址:SPI nRF24L01无线 [可以放在2个单片机里实现通信]

上一篇:单片机简单的串口通信
下一篇:SPI nRF24L01 无线简单程序 1

推荐阅读最新更新时间:2024-03-16 15:30

基于STM32 MCU应用的EMC指南之软件篇
在基于微控制器的电子系统中,强壮的软件设计是提高 EMC 性能的主要因素。必须尽量在项目设计阶段的早期考虑 EMC 干扰导致的问题。EMC 导向的软件提高了应用的安全性和可靠性。强化 EMC 性能的软件的实施成本低,可提高最终的抗扰性能,并节约硬件和开发成本。用户应考虑到模拟或数字数据受到的 EMC 干扰,就像任何其它应用参数一样。 EMC 干扰导致的问题示例: 微控制器无响应 程序计数器失控 执行意外指令 地址指向错误 子程序执行错误 寄生复位和 / 或寄生中断 IP 配置损坏 I/O 失灵 软件故障的后果示例: 产品意外响应 上下文丢失 进程中的意外分支 中断丢失 数据完整性缺失 输入值误读 01使用看门狗或时间控制 为了
[单片机]
基于STM32 <font color='red'>MCU</font>应用的EMC指南之软件篇
ATmega88 简介
ATmega88是基于增强的AVR RISC结构的低功耗8 位CMOS微控制器。由于其先进的指令集以及单时钟周期指令执行时间,ATmega88 的数据吞吐率高达1 MIPS/MHz,从而可以缓减系统在功耗和处理速度之间的矛盾。 ATmega88 AVR 内核具有丰富的指令集和32 个通用工作寄存器。所有的寄存器都直接与算逻单元(ALU) 相连接,使得一条指令可以在一个时钟周期内同时访问两个独立的寄存器。这种结构大大提高了代码效率,并且具有比普通的CISC 微控制器最高至10 倍的数据吞吐率。 ATmega88 有如下特点:8K字节的系统内可编程Flash(具有同时读写的能力,即RWW),512 字节EEPROM,1K字节SRA
[单片机]
单片机程序烧录的3种方式(ISP、ICP、IAP)是什么?
说起给单片机烧录程序,大家应该都不陌生吧,我最早接触单片机是从51单片机开始的,型号是STC89C52RC,当时烧录程序就是用的下面这种烧录软件——STC-ISP。 这种方式,通过串口连接单片机,选择一个合适的波特率就可以烧录了。 后来学习STM32,编程时使用KEIL软件自带的下载按钮就能下载程序,方便了不少,但需要额外使用J-Link等下载器。 再后来,接触到产品研发,给已经发布出的产品升级,都是要靠远程无线升级的(想想看,产品已经到客户那里了,当软件需要升级时,要是还使用有线的方式烧录程序,得有多麻烦) 既然给单片机烧录程序的方式有多种,那烧录方式具体怎么分类呢? 可以分为3种: ISP(In-System
[单片机]
<font color='red'>单片机</font>程序烧录的3种方式(ISP、ICP、IAP)是什么?
富士通半导体发布84款FM4系列32位微控制器产品
富士通半导体(上海)有限公司日前宣布,推出首批基于ARM® Cortex™-M4处理器内核的FM4系列32位RISC 微控制器。富士通半导体本次共推出84款MB9B560R/460R/360R/160R 系列产品,将于2013年7月底开始提供样片。 FM4系列是基于现有的FM3系列,能够提供具有更高计算性能和增强的外设性能的产品。FM4系列推出的新品继承了FM3系列的高品质和易用性,应用领域较FM3更广泛。新品适合需要先进高速计算性能的应用领域,例如:通用变频器、伺服电机、可编程逻辑控制器(PLC)和其它工业设备及使用变频的家电。 富士通半导体自2010年推出FM3系列产品以来,致力于提供易于选择、使用且
[单片机]
SPI,UART,I2C都有什么区别,及其各自的特点
区别: SPI:高速同步串行口。3~4线接口,收发独立、可同步进行 UART:通用异步串行口。按照标准波特率完成双向通讯,速度慢 I2C:一种串行传输方式,三线制,网上可找到其通信协议和用法的 3根线实现数据双向传输 串行外围接口 Serial peripheral interface UART:通用异步收发器 UART是用于控制计算机与串行设备的芯片。有一点要注意的是,它提供了RS-232C数据终端设备接口,这样计算机就可以和调制解调器或其它使用RS-232C接口的串行设备通信了。作为接口的一部分,UART还提供以下功能: 将由计算机内部传送过来的并行数据转换为输出的串行数据流。将计算机外部来的串行数据转换为字
[单片机]
基于单片机微控制器在系统编程
介绍 Dallas Semiconductor基于8051的微控制器类产品中,许多型号都支持通过通用RS-232串口实现在系统编程。在系统编程意味着程序和/或数据存储器能够在不用拆解嵌入式系统来替换存储器的情况下进行修改。这种特性强调易使用性和多功能性,在所有嵌入式设计中增加了许多非常重要的特性: 允许硬件在工厂组装和存放,而在出厂前才进行软件定制, 需要进行软件升级时,消除了在现场拆解器件的高昂代价, 允许对位置不可达的应用进行软件升级, 访问专用配置与状态寄存器,以及 使用存储器加密的方式把软件加载到安全微控制器。 具有这种特性的器件包括: DS2250, DS2250T, DS2251T, DS2252T, DS500
[单片机]
爱特梅尔扩展6引脚picoPower AVR微控制器系列
爱特梅尔公司(Atmel® Corporation)宣布推出三种全新6引脚picoPower™ AVR® 微控制器产品ATtiny4、ATtiny5和ATtiny9。这些新器件均为引脚和代码兼容,并提供了丰富的功能集,执行代码速度更较市场上最接近竞争对手快六倍。 这些6引脚tinyAVR微控制器使用AVR CPU,在12 MHz下的处理能力高达12 MIPS,性能较市场上任何其它容量相似的微控制器高六倍。这种高处理效率大幅减少了器件处于工作模式的时间,并延长处于节能睡眠模式的时间。上述特点结合爱特梅尔的picoPower技术,能保证提供业界领先的低功耗。 ATtiny4、ATtiny5和ATtiny9的
[单片机]
爱特梅尔扩展6引脚picoPower AVR<font color='red'>微控制器</font>系列
单片机矩阵按键的设计
一、矩阵按键的原理 矩阵键盘一般是4*4的按键组成,当然也有其他的按键组合,这里我们分析4*4的按键,其他组合原理类似。4*4的按键采用的行列扫描方式,也就是先预设端口的状态,然后扫描行的状态,检测到扫描行的状态以后,再次检测扫描列的状态。 下面这段程序是4*4的行列按键的扫描程序 void scankey(void) //16路热键扫描 { char a=0; P1=0x0F; if(P1!=0x0F)//读取按键是否按下 { delay_ms(150);//延时150ms进行消抖 if(P1!=0x0F)//再次检测键盘是否按下 { switch(P1)
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved