C51 COMPILER V9.53.0.0 MAIN 09/30/2018 11:45:29 PAGE 1 C51 COMPILER V9.53.0.0, COMPILATION OF MODULE MAIN OBJECT MODULE PLACED IN .\Output\Main.obj COMPILER INVOKED BY: D:\Keil_v5\C51\BIN\C51.EXE ..\..\Code\User\Main.c LARGE OPTIMIZE(0,SPEED) BROWSE INCDIR(../../Code/ -Include;../../Code/User;../../Code/User/Common;../../Code/User/Driver) DEFINE(FOSC_160000=1) DEBUG OBJECTEXTEND PRINT(.\ -Output\LST\Main.lst) TABS(2) OBJECT(.\Output\Main.obj) line level source 1 /******************************************************************************/ 2 /* -- 居加居-- */ 3 /* 4 // 文件名: 5 // 说明: 6 // 编写人员:kinve 7 // 编写日期:2018-8-21 8 // 程序维护: 9 // 维护记录: 10 // 11 // 12 */ 13 // 免责声明: 14 // (c) Anxinke Corporation. All rights reserved. 15 /******************************************************************************/ 16 #include 17 #include "Common.h" 18 #include "Delay.h" 19 #include "Timer.h" 20 #include "Interrupt.h" 21 #include "Flash.h" 22 #include "Version.h" 23 #include "Packdata.h" 24 #include "DHT11.h" 25 #include "Keys.h" 26 27 #define USE_2401_API 28 #ifdef USE_2401_API 29 #include "nRF24L01_API.h" 30 #else #include "NRF24L01_inte.H" #define TX_PLOAD_WIDTH NRF24L01_TX_PLOAD_LEN #define RX_PLOAD_WIDTH NRF24L01_TX_PLOAD_LEN #endif 35 unsigned char P12_Led_state = 0; 36 unsigned char P04_Delay_state = 0; 37 unsigned char Sys_Type = SysRun_Norm; 38 39 //******************************************************************************************************** -*** 40 // Application: SPI Function 41 // Master send 0x90 and recevie 0x4E 42 // Master send 0x01 and recevie 0x55 43 // Master send 0x02 and recevie 0x56 44 // Master send 0x03 and recevie 0x4F 45 // Master send 0x04 and recevie 0x54 46 // 47 // Master recevie 0x4E and 0x4F form slave after transmitting 48 //******************************************************************************************************** -*** 49 50 //-------------------------------------------------------------------------------------------------------- ---- C51 COMPILER V9.53.0.0 MAIN 09/30/2018 11:45:29 PAGE 2 51 void SPI_Error ( void ) 52 { 53 1 DBG ( "\nSPI error.\n" ); 54 1 55 1 while ( 1 ) // SPI error and P0.7 flash/ 56 1 { 57 2 P07 = 1; 58 2 Timer0_Delay1ms ( 500 ); 59 2 P07 = 0; 60 2 Timer0_Delay1ms ( 500 ); 61 2 } 62 1 } 63 64 //-------------------------------------------------------------------------------------------------------- ---- 65 void SPI_Initial ( void ) 66 { 67 1 clr_SPIEN; //禁止SPI 68 1 P15_Quasi_Mode; // P15 (SS) Quasi mode 69 1 P10_Quasi_Mode; // P10(SPCLK) Quasi mode 70 1 P00_Quasi_Mode; // P00 (MOSI) Quasi mode 71 1 P01_Quasi_Mode; // P22 (MISO) Quasi mode 72 1 73 1 //SS仅在从机有效 74 1 set_DISMODF; // 1 = 禁止模式错误检测. SS的特征依赖SSOE 位 75 1 clr_SSOE; // SS 作为 0.普通IO 1.自动拉低 76 1 77 1 clr_LSBFE; // 0.MSB first 78 1 79 1 clr_CPOL; // 0.SPI空闲时SCL为低 80 1 clr_CPHA; // 0.在第1个边沿采样 81 1 82 1 set_MSTR; // 主设备 83 1 //SPICLK_DIV16; // Select SPI clock=1Mhz 84 1 SPICLK_DIV4; // 16/4=4Mhz, 24l01速度不能太快,最大的数据传输率为 10Mbps 85 1 set_SPIEN; // 使能SPI 86 1 clr_SPIF; // 清标志位 87 1 } 88 //-------------------------------------------------------------------------------------------------------- ---- 89 void Start_Sending_SPI ( uint8 *pu8MID, uint8 *pu8DID ) 90 { 91 1 SS = 0; 92 1 93 1 SPDR = 0x90; 94 1 Timer3_Delay10us ( 1 ); // Send 0x90 to Slave 95 1 96 1 while ( ! ( SPSR & SET_BIT7 ) ); 97 1 98 1 clr_SPIF; 99 1 100 1 if ( SPDR != 0x4E ) 101 1 SPI_Error(); 102 1 103 1 DBG ( "\nSlave Return %c!\n", SPDR ); 104 1 105 1 SPDR = 0x01; // Send 0x01 to Slave 106 1 Timer3_Delay10us ( 1 ); 107 1 108 1 while ( ! ( SPSR & SET_BIT7 ) ); 109 1 110 1 clr_SPIF; C51 COMPILER V9.53.0.0 MAIN 09/30/2018 11:45:29 PAGE 3 111 1 112 1 if ( SPDR != 0x55 ) 113 1 SPI_Error(); 114 1 115 1 DBG ( "\nSlave Return %c!\n", SPDR ); 116 1 117 1 SPDR = 0x02; // Send 0x02 to Slave 118 1 Timer3_Delay10us ( 1 ); 119 1 120 1 while ( ! ( SPSR & SET_BIT7 ) ); 121 1 122 1 clr_SPIF; 123 1 124 1 if ( SPDR != 0x56 ) 125 1 SPI_Error(); 126 1 127 1 DBG ( "\nSlave Return %c!\n", SPDR ); 128 1 129 1 SPDR = 0x03; // Send 0x03 to Slave 130 1 Timer3_Delay10us ( 1 ); 131 1 132 1 while ( ! ( SPSR & SET_BIT7 ) ); 133 1 134 1 clr_SPIF; 135 1 136 1 if ( SPDR != 0x4F ) 137 1 SPI_Error(); 138 1 139 1 DBG ( "\nSlave Return %c!\n", SPDR ); 140 1 141 1 SPDR = 0x04; // Send 0x04 to Slave 142 1 Timer3_Delay10us ( 1 ); 143 1 144 1 while ( ! ( SPSR & SET_BIT7 ) ); 145 1 146 1 clr_SPIF; 147 1 148 1 if ( SPDR != 0x54 ) 149 1 SPI_Error(); 150 1 151 1 DBG ( "\nSlave Return %c!\n", SPDR ); 152 1 153 1 SPDR = 0xFF; 154 1 Timer3_Delay10us ( 1 ); 155 1 156 1 while ( ! ( SPSR & SET_BIT7 ) ); 157 1 158 1 clr_SPIF; 159 1 *pu8MID = SPDR; // Receive Slave 1st DATA from Slave 160 1 DBG ( "\nSlave Return %c!\n", SPDR ); 161 1 162 1 SPDR = 0xFF; 163 1 Timer3_Delay10us ( 1 ); 164 1 165 1 while ( ! ( SPSR & SET_BIT7 ) ); 166 1 167 1 clr_SPIF; 168 1 *pu8DID = SPDR; // Receive Slave 2nd DATA from Slave 169 1 DBG ( "\nSlave Return %c!\n", SPDR ); 170 1 171 1 SS = 1; 172 1 } C51 COMPILER V9.53.0.0 MAIN 09/30/2018 11:45:29 PAGE 4 173 174 //1.关闭POR (TA 保护) 上电复位(检测电源上升到系统可以工作的电压) 175 #ifdef N76E003_IAR __sfr __no_init volatile unsigned char PORDIS @ 0XFD; #else 178 sfr PORDIS = 0XFD; 179 #endif 180 void CLOSE_POR ( void ) 181 { 182 1 TA = 0XAA; 183 1 TA = 0X55; 184 1 PORDIS = 0X5A; 185 1 TA = 0XAA; 186 1 TA = 0X55; 187 1 PORDIS = 0XA5; 188 1 } 189 190 /****************************************************************************** 191 This code illustrates how to do APROM and CONFIG IAP from LDROM. 192 APROM are re-programmed by the code to output P1 as 55h and P0 as aah. 193 The CONFIG2 is also updated to disable BOD reset. 194 User needs to configure CONFIG0 = 0x7F, CONFIG1 = 0xFE, CONFIG2 = 0xFF. 195 ******************************************************************************/ 196 //2.关闭BOD 欠压检测 (监测运行期间VDD电平) 197 #ifdef N76E003_IAR __sfr __no_init volatile unsigned char BODCON0 @ 0XA3; __sfr __no_init volatile unsigned char BODCON1 @ 0XAB; //__sfr __no_init volatile unsigned char CONFIG2 @ 0XFD; #else 202 //sfr BODCON0 = 0XA3; 203 //sfr BODCON1 = 0XAB; 204 #endif 205 void CLOSE_BOD ( void ) 206 { 207 1 BODCON0 &= ~ ( 1 << 7 ); //0 =禁用欠压检测电路 208 1 } 209 210 enum 211 { 212 UMKNOW_RESET, 213 POWER_ON_RESET, //上电复位 214 BROWN_OUT_RESET, //欠压复位 215 RST_PIN_RESET, //RST引脚复位 216 HARD_FAULT_RESET, //硬件故障复位 217 WATCHGOD_TIMER_RESET, //看门狗定时器复位 218 SOFTWARE_RESET, //软件复位 219 MAX_RESET 220 }; 221 /* 222 RST pin reset 223 Brown-out reset 224 Software reset 225 Power-on reset 226 Watchgod Timer reset 227 Hard Fault reset 228 */ 229 unsigned char Reset_Reason ( void ) 230 { 231 1 unsigned char res = UMKNOW_RESET; 232 1 233 1 if ( PCON & ( 1 << 4 ) ) 234 1 { C51 COMPILER V9.53.0.0 MAIN 09/30/2018 11:45:29 PAGE 5 235 2 PCON &= ~ ( 1 << 4 ); 236 2 res = POWER_ON_RESET; 237 2 } 238 1 239 1 if ( BODCON0 & ( 1 << 1 ) ) 240 1 { 241 2 BODCON0 &= ~ ( 1 << 1 ); 242 2 res = BROWN_OUT_RESET; 243 2 } 244 1 245 1 if ( AUXR1 & ( 1 << 6 ) ) 246 1 { 247 2 AUXR1 &= ~ ( 1 << 6 ); 248 2 res = RST_PIN_RESET; 249 2 } 250 1 251 1 if ( AUXR1 & ( 1 << 5 ) ) 252 1 { 253 2 AUXR1 &= ~ ( 1 << 5 ); 254 2 res = HARD_FAULT_RESET; 255 2 } 256 1 257 1 if ( WDCON & ( 1 << 3 ) ) 258 1 { 259 2 WDCON &= ~ ( 1 << 3 ); 260 2 res = WATCHGOD_TIMER_RESET; 261 2 } 262 1 263 1 if ( AUXR1 & ( 1 << 7 ) ) 264 1 { 265 2 AUXR1 &= ~ ( 1 << 7 ); 266 2 res = SOFTWARE_RESET; 267 2 } 268 1 269 1 return res; 270 1 } 271 272 273 void ResetSys ( void ) 274 { 275 1 AUXR1 &= ~ ( 1 << 7 ); //software reset flag clear 276 1 EA = 0; 277 1 TA = 0xAA; 278 1 TA = 0x55; 279 1 CHPCON |= ( 1 << 7 ); //software reset 280 1 } 281 282 void P12_Flash ( unsigned char num ) 283 { 284 1 unsigned char i; 285 1 286 1 for ( i = 0; i < num && num < 5 ; i++ ) 287 1 { 288 2 P12 = 1; 289 2 Timer3_Delay100ms ( 1 ); 290 2 P12 = 0; 291 2 Timer3_Delay100ms ( 1 ); 292 2 } 293 1 294 1 P12_Led_state = P12; 295 1 } 296 #if 0 C51 COMPILER V9.53.0.0 MAIN 09/30/2018 11:45:29 PAGE 6 unsigned char flag; //NRF24L01中断处理 #ifdef N76E003_IAR #pragma vector=0x3B __interrupt void NRF24L01_Handler ( void ) #else void NRF24L01_Handler ( void ) interrupt 7 //interrupt address is 0x001B #endif { clr_EPI; //关闭管脚中断7 flag = PIF; PIF = 0x00; //清除全部标志 DBG ( "\nNRF24L01 interrupt!\n" ); set_EPI; //开启管脚中断7 } void NRF24L01_Interrupt_P03 ( void ) { //P0M1|=SET_BIT3;P0M2&=~SET_BIT3; //input PICON &= ~ ( SET_BIT0 | SET_BIT1 ); PICON |= ( 0x00 ); //[1:0]=0.端口0 PICON |= SET_BIT5; //通道3=1.边沿触发 PINEN |= SET_BIT3; // 1 = 低电平/ 下降沿触发中断 PIPEN &= ~SET_BIT3; //0 = 关闭中断(高电平/ 上升沿触发中断) EIE |= SET_BIT1; //管脚中断,最多8个,中断号7 EA = 1; //总中断 } #endif 327 //96位 UID与128位UCID 328 unsigned char xdata UIDBuf[12]; //本机的存储96bit的UID内容 329 unsigned char xdata UID_Master[12]; //主机的存储96bit的UID内容 330 UINT8 UID_BYTE ( UINT8 Addr ) 331 { 332 1 UINT8 DATATEMP; 333 1 set_IAPEN; 334 1 IAPAL = Addr; 335 1 IAPAH = 0x00; 336 1 IAPCN = READ_UID; 337 1 set_IAPGO; 338 1 DATATEMP = IAPFD; 339 1 clr_IAPEN; 340 1 return DATATEMP; 341 1 } 342 343 //读出芯片的96bit的UID 344 void ReadUID_UCID ( UINT8 UID, UINT8 *out ) 345 { 346 1 UINT8 i; 347 1 348 1 for ( i = 0; i < 12; i++ ) 349 1 { 350 2 out[i] = UID_BYTE ( i + UID ); //ucid=0x20 351 2 } 352 1 } 353 354 355 //最长4byte 356 #define GET_VER_POS(NUM,VER) ((VER>>(8*NUM))&0xff) 357 //-------------------------------------------------------------------------------------------------------- ---- C51 COMPILER V9.53.0.0 MAIN 09/30/2018 11:45:29 PAGE 7 358 void main ( void ) 359 { 360 1 unsigned char reset_num, i; 361 1 //unsigned char datatemp[8]; 362 1 unsigned char TxBuf[TX_PLOAD_WIDTH] = {'>', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'}; // 363 1 unsigned char RxBuf[RX_PLOAD_WIDTH] = {0}; 364 1 unsigned char PackBuf[TX_PLOAD_WIDTH]; 365 1 pDataBuff CheckRxBuf = {0}; 366 1 unsigned char CheckUID = 0; 367 1 //uint8 u8MID, u8DID; 368 1 reset_num = Reset_Reason(); 369 1 370 1 CLOSE_POR(); 371 1 CLOSE_BOD(); 372 1 373 1 Set_All_GPIO_Quasi_Mode; 374 1 375 1 376 1 //NRF24L01_Interrupt_P03(); 377 1 //定时器 378 1 Timer0_init ( TIMER_SCAN ); //1ms 379 1 380 1 //ResetSys(); 381 1 InitialUART0_Timer1 ( 115200 ); /* 115200 Baud Rate*/ 382 1 Timer3_Delay10us ( 1000 ); 383 1 DBG ( "\nHome Light %s, Build by Kinve in %ld\n", THIS_VER, CUSTOM_VER ); 384 1 385 1 ReadUID_UCID ( 0x00, UIDBuf ); //0x00=uid 0x20=ucid 386 1 DBG ( "UID=%x%x%x%x\n", UIDBuf[0], UIDBuf[1], UIDBuf[2], UIDBuf[3] ); 387 1 388 1 #if 0 //call read byte datatemp[5] = Read_APROM_BYTE ( 0x3885 ); if ( datatemp[5] != 0x4A ) { //call write byte for ( i = 0; i < sizeof ( datatemp ); i++ ) { if ( i == 5 ) Write_DATAFLASH_BYTE ( 0x3880 + i, 0x4A ); else Write_DATAFLASH_BYTE ( 0x3880 + i, GET_VER_POS ( i, CUSTOM_VER ) ); datatemp[i] = Read_APROM_BYTE ( ( UINT16 code * ) ( 0x3880 + i ) ); } } #endif 404 1 for ( i = 0; i < sizeof ( UID_Master ); i++ ) 405 1 { 406 2 UID_Master[i] = Read_APROM_BYTE ( ( UINT16 code * ) ( 0x3881 + i ) ); 407 2 } 408 1 409 1 Timer3_Delay100ms(1); 410 1 if(Keys[KEY_CS].Res == ONE_HITS_KEY_FLAG) 411 1 { 412 2 Keys[KEY_CS].Res = NO_KEY_FLAG; 413 2 Sys_Type = SysRun_Test; 414 2 } 415 1 416 1 SPI_Initial(); 417 1 418 1 NRF24L01_Wait_Check(); // 等待检测到NRF24L01,程序才会向下执行 419 1 NRF24L01_RT_Init (); C51 COMPILER V9.53.0.0 MAIN 09/30/2018 11:45:29 PAGE 8 420 1 DBG ( "NRF24L01 init OK!\n" ); 421 1 422 1 while ( 1 ) 423 1 { 424 2 switch(Sys_Type) 425 2 { 426 3 case SysRun_Test: 427 3 if ( System_Flag_200Ms) 428 3 { 429 4 System_Flag_200Ms = 0; 430 4 P12_Led_state = !P12_Led_state; 431 4 P12 = P12_Led_state; 432 4 } 433 3 434 3 if(Keys[KEY_CS].Res == ONE_HITS_KEY_FLAG) //配对发 435 3 { 436 4 Keys[KEY_CS].Res = NO_KEY_FLAG; 437 4 memset(TxBuf, 0, sizeof(TxBuf)); 438 4 TxBuf[0] = '*'; //*(1byte)+?(1byte) 439 4 TxBuf[1] = '?'; 440 4 PackData(TxBuf, 2, PackBuf); 441 4 SEND_BUF ( PackBuf, sizeof(PackBuf) ); 442 4 DBG ( "Send: %s\n", &PackBuf[2] ); 443 4 } 444 3 445 3 if(Keys[KEY_CS].Res == LONG_KEY_FLAG) //配对删除 446 3 { 447 4 Keys[KEY_CS].Res = NO_KEY_FLAG; 448 4 //保存到flash 449 4 memset(UID_Master, 0xFF, sizeof(UID_Master)); 450 4 Write_DATAFLASH_BYTE ( 0x3880, 0xFF ); 451 4 for ( i = 0; i < sizeof ( UID_Master ); i++ ) 452 4 { 453 5 Write_DATAFLASH_BYTE ( 0x3881 + i, UID_Master[i] ); 454 5 } 455 4 } 456 3 break; 457 3 case SysRun_Norm: 458 3 default: 459 3 if ( System_Flag_1s ) 460 3 { 461 4 System_Flag_1s = 0; 462 4 P12_Led_state = !P12_Led_state; 463 4 P12 = P12_Led_state; 464 4 465 4 //温湿度获取 466 4 if(DHT11_Read_Data( &DHT11_Data )){ 467 5 DBG ( "%02d%% - %02dC\n", DHT11_Data.humi_int, DHT11_Data.temp_int ); 468 5 } 469 4 } 470 3 471 3 if(Keys[KEY_CS].Res == ONE_HITS_KEY_FLAG)//配对发 472 3 { 473 4 Keys[KEY_CS].Res = NO_KEY_FLAG; 474 4 memset(TxBuf, 0, sizeof(TxBuf)); 475 4 TxBuf[0] = '>'; //*(1byte)+?(1byte) 476 4 TxBuf[1] = 'L'; //灯 477 4 TxBuf[2] = 'T'; //翻转 478 4 memcpy(&TxBuf[3], UID_Master, 12); 479 4 PackData(TxBuf, 15, PackBuf); 480 4 SEND_BUF ( PackBuf, sizeof(PackBuf) ); 481 4 DBG ( "Send: %s\n", &PackBuf[2] ); C51 COMPILER V9.53.0.0 MAIN 09/30/2018 11:45:29 PAGE 9 482 4 } 483 3 break; 484 3 } 485 2 486 2 487 2 if ( NRF_IRQ == 0 ) 488 2 { 489 3 if ( NRF24L01_RxPacket ( RxBuf, sizeof ( RxBuf ) ) ) 490 3 { 491 4 if(CheckData(RxBuf, RX_PLOAD_WIDTH, &CheckRxBuf)){ 492 5 P12_Flash ( 2 ); 493 5 DBG ( "Recv: %s\n", &(CheckRxBuf.Data[2]) ); 494 5 switch(CheckRxBuf.Data[2]){ 495 6 case '*': //配对 496 6 switch(CheckRxBuf.Data[3]){ 497 7 case '?': 498 7 memset(TxBuf, 0, sizeof(TxBuf)); 499 7 TxBuf[0] = '*'; //*(1byte)+Y(1byte)+uid(12byte) 500 7 TxBuf[1] = '1'; 501 7 memcpy(&TxBuf[2], UIDBuf, 12); 502 7 PackData(TxBuf, 14, PackBuf); 503 7 SEND_BUF ( PackBuf, sizeof(PackBuf) ); 504 7 DBG ( "Send: %s\n", &PackBuf[2] ); 505 7 break; 506 7 case '1': 507 7 memcpy(UID_Master, &CheckRxBuf.Data[4], 12); 508 7 //保存到flash 509 7 Write_DATAFLASH_BYTE ( 0x3880, 0x4A ); 510 7 for ( i = 0; i < sizeof ( UID_Master ); i++ ) 511 7 { 512 8 Write_DATAFLASH_BYTE ( 0x3881 + i, UID_Master[i] ); 513 8 } 514 7 //返回成功 515 7 memset(TxBuf, 0, sizeof(TxBuf)); 516 7 TxBuf[0] = '*'; //*(1byte)+Y(1byte)+uid(10byte) 517 7 TxBuf[1] = '2'; 518 7 PackData(TxBuf, 2, PackBuf); 519 7 SEND_BUF ( PackBuf, sizeof(PackBuf) ); 520 7 DBG ( "Send: %s\n", &PackBuf[2] ); 521 7 break; 522 7 case '2': 523 7 524 7 break; 525 7 } 526 6 break; 527 6 case '>': //数据 528 6 switch(CheckRxBuf.Data[3]){ 529 7 case 'L': 530 7 if(CheckRxBuf.Data[4] == 'T'){ 531 8 CheckUID = 0; 532 8 if(0 == memcmp(&(CheckRxBuf.Data[5]), UIDBuf, 12)){ 533 9 P04_Delay_state = !P04_Delay_state; 534 9 P04 = P04_Delay_state; 535 9 CheckUID = 1; 536 9 } 537 8 //返回成功 538 8 memset(TxBuf, 0, sizeof(TxBuf)); 539 8 TxBuf[0] = '>'; //*(1byte)+Y(1byte)+uid(10byte) 540 8 TxBuf[1] = 'L'; 541 8 TxBuf[2] = 'T'; 542 8 TxBuf[3] = CheckUID?'N':'Y'; 543 8 PackData(TxBuf, 4, PackBuf); C51 COMPILER V9.53.0.0 MAIN 09/30/2018 11:45:29 PAGE 10 544 8 SEND_BUF ( PackBuf, sizeof(PackBuf) ); 545 8 DBG ( "Send: %s\n", &PackBuf[2] ); 546 8 } 547 7 break; 548 7 } 549 6 break; 550 6 } 551 5 } 552 4 } 553 3 } 554 2 555 2 } 556 1 } 557 //-------------------------------------------------------------------------------------------------------- ---- 558 559 560 561 MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 2739 ---- CONSTANT SIZE = 214 ---- XDATA SIZE = 147 ---- PDATA SIZE = ---- ---- DATA SIZE = ---- ---- IDATA SIZE = ---- ---- BIT SIZE = ---- ---- END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)