单片机成长之路(51基础篇) - 029 stc89c52_register.h
感觉stc89c51的库不好用,自己写了个:stc89c52_register.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 | #ifndef __STC89C52_REGISTER_H_ #define __STC89C52_REGISTER_H_ /* Above is STC additional SFR */ // -------------------------------------------------------------------- /* Registers */ sfr P0 = 0x80; // Port 0 sfr SP = 0x81; // 堆栈指针 sfr DPL = 0x82; // 数据指针(低) sfr DPH = 0x83; // 数据指针(高) sfr PCON = 0x87; // 电源控制寄存器 sfr TCON = 0x88; // 定时器控制寄存器 sfr TMOD = 0x89; // 定时器控制寄存器 sfr TL0 = 0x8A; // 定时器0低8位寄存器 sfr TL1 = 0x8B; // 定时器1低8位寄存器 sfr TH0 = 0x8C; // 定时器0高8位寄存器 sfr TH1 = 0x8D; // 定时器1高8位寄存器 sfr AUXR = 0x8E; // 辅助寄存器 sfr P1 = 0x90; // Port 1 sfr SCON = 0x98; // 串口控制寄存器 sfr SBUF = 0x99; // 串口数据缓存器 sfr P2 = 0xA0; // Port 2 sfr AUXR1 = 0xA2; // 辅助寄存器 sfr IE = 0xA8; // 中断允许寄存器 sfr SADDR = 0xA9; // 从地址寄存器 sfr P3 = 0xB0; // Port 3 sfr IPH = 0xB7; // 中断优先级寄存器(高) sfr IP = 0xB8; // 中断优先级寄存器(低) sfr SADEN = 0xB9; // 中断优先级寄存器(低) sfr XICON = 0xC0; // Auxiliary Interrupt Control sfr T2CON = 0xC8; // Timer/Counter 2 Mode sfr T2MOD = 0xC9; // Timer/Counter 2 Mode sfr RCAP2L = 0xCA; // Timer/Counter 2 Reload/Capture Low Byte sfr RCAP2H = 0xCB; // Timer/Counter 2 Reload/Capture High Byte sfr TL2 = 0xCC; // Timer/Counter Low Byte sfr TH2 = 0xCD; // Timer/Counter High Byte sfr PSW = 0xD0; // 程序状态寄存器 sfr ACC = 0xE0; // 累加器 sfr WDT_CONTR = 0xe1; // 看门狗控制寄存器 sfr ISP_DATA = 0xe2; // ISP/IAP 数据寄存器 sfr ISP_ADDRH = 0xe3; // ISP/IAP 高8位地址寄存器 sfr ISP_ADDRL = 0xe4; // ISP/IAP 低8位地址寄存器 sfr ISP_CMD = 0xe5; // ISP/IAP 命令寄存器 sfr ISP_TRIG = 0xe6; // ISP/IAP 命令触发寄存器 sfr ISP_CONTR = 0xe7; // ISP/IAP 控制寄存器 sfr P4 = 0xe8; // Port 4 sfr B = 0xF0; // B 寄存器 // -------------------------------------------------------------------- /* Bit definition */ // ----------------------------------- // Bit # define Bit0 0x01 # define Bit1 0x02 # define Bit2 0x04 # define Bit3 0x08 # define Bit4 0x10 # define Bit5 0x20 # define Bit6 0x40 # define Bit7 0x80 // ----------------------------------- // sfr P0 = 0x80; // Port 0 sbit P00 = P0^0; # define set_P00 P00=1 # define cle_P00 P00=0 # define git_P00 P00 sbit P01 = P0^1; # define set_P01 P01=1 # define cle_P01 P01=0 # define git_P01 P01 sbit P02 = P0^2; # define set_P02 P02=1 # define cle_P02 P02=0 # define git_P02 P02 sbit P03 = P0^3; # define set_P03 P03=1 # define cle_P03 P03=0 # define git_P03 P03 sbit P04 = P0^4; # define set_P04 P04=1 # define cle_P04 P04=0 # define git_P04 P04 sbit P05 = P0^5; # define set_P05 P05=1 # define cle_P05 P05=0 # define git_P05 P05 sbit P06 = P0^6; # define set_P06 P06=1 # define cle_P06 P06=0 # define git_P06 P06 sbit P07 = P0^7; # define set_P07 P07=1 # define cle_P07 P07=0 # define git_P07 P07 // ----------------------------------- // sfr PCON = 0x87; // 电源控制寄存器 // IDL # define set_IDL (PCON | Bit0) // 进入IDLE模式(空闲),除系统不给CPU供时钟,cpu不执行指令,其余功能部件仍可继续工作,可由任何一个中断唤醒。 # define cle_IDL (PCON & (~Bit0)) // 默认(关闭) # define git_IDL (Bit0 == (PCON&Bit0)) // PD # define set_PD (PCON | Bit1) // 进入Power Down模式(停机,掉电),可以外部中断低电平触发或下降沿触发唤醒,进入掉电模式时,内部时钟停振,由于无时钟CPU、定时器、串行口等功能部件停止工作,只有外部中断继续工作。停电模式可由外部中断唤醒,中断返回后,继续执行原程序。掉电模式也叫停机模式,此时功耗 < 0.1uA。 # define cle_PD (PCON & (~Bit1)) // 默认(关闭) # define git_PD (Bit1 == (PCON&Bit1)) // DF0:通用工作标志位,用户可以任意使用 # define set_DF0 (PCON | Bit2) # define cle_DF0 (PCON &(~Bit2)) # define git_DF0 (Bit2 == (PCON&Bit2)) // DF1:通用工作标志位,用户可以任意使用 # define set_DF1 (PCON | Bit3) # define cle_DF1 (PCON &(~Bit3)) # define git_DF1 (Bit3 == (PCON&Bit3)) // POF:启动标志位(启动时判断:0为软复位,1位冷启动上电复位) # define set_POF (PCON | Bit4) // 判断结果为:冷启动 # define cle_POF (PCON & (~Bit4)) // 判断结果为:热启动 # define git_POF (Bit4 == (PCON&Bit4)) // 串口部分(SMOD 和 SMOD0) // SMOD0:帧错误检测有效控制位。 # define set_SMOD0 (PCON | Bit6) // SCON 寄存器中的SM0/FE位用于FE(帧错误检测)功能; # define cle_SMOD0 (PCON &(~Bit6)) // SCON 寄存器中的SM0/FE位用于SM0功能,和SM1一起指定串口的工作方式。复位时SMOD0 = 0; # define git_SMOD0 (Bit6 == (PCON&Bit6)) // SMOD:波特率选择位。当SMOD # define set_SMOD (PCON | Bit7) // 是串口通信方式1、2、3的波特率加倍 # define cle_SMOD (PCON &(~Bit7)) // 所有串口通信方式的波特率加倍,复位时 SMOD = 0 # define git_SMOD (Bit7 == (PCON&Bit7)) // ----------------------------------- // sfr TCON = 0x88; // 定时器控制寄存器 sbit IT0 = TCON^0; // 外部中断0触发方式 # define set_IT0 IT0=1 // 下降沿触发 # define cle_IT0 IT0=0 // 低电平触发 # define git_IT0 IT0 sbit IE0 = TCON^1; // 外部中断0请求标志位,当IE0=1外部中断0向CPU请求中断,当CPU响应外部中断时,由硬件清 0(触发方式为边沿触发) # define set_IE0 IE0=1 // CPU中断请求 # define cle_IE0 IE0=0 // 已清零 # define git_IE0 IE0 sbit IT1 = TCON^2; // 外部中断1触发方式 # define set_IT1 IT1=1 // 下降沿触发 # define cle_IT1 IT1=0 // 低电平触发 # define git_IT1 IT1 sbit IE1 = TCON^3; // 外部中断1请求标志位,当IE1=1外部中断1向CPU请求中断,当CPU响应外部中断时,由硬件清 0(触发方式为边沿触发) # define set_IE1 IE1=1 // CPU中断请求 # define cle_IE1 IE1=0 // 已清零 # define git_IE1 IE1 sbit TR0 = TCON^4; // 定时器0的运行控制位 # define set_TR0 TR0=1 // 允许 T0 开始计数 # define cle_TR0 TR0=0 // 禁止 T0 计数 # define git_TR0 TR0 sbit TF0 = TCON^5; // 定时器/计数器 T0 溢出中断标志位 # define set_TF0 TF0=1 // 定时器溢出 # define cle_TF0 TF0=0 // 硬件清零 # define git_TF0 sbit TR1 = TCON^6; // 定时器1的运行控制位 # define set_TR1 TR1=1 // 允许 T1 开始计数 # define cle_TR1 TR1=0 // 禁止 T1 计数 # define git_TR1 TR1 sbit TF1 = TCON^7; # define set_TF1 TF1=1 # define cle_TF1 TF1=0 # define git_TF1 TF1 // ----------------------------------- // sfr TMOD = 0x89; // 定时器控制寄存器 // Time0 // 定时器/计数器0 // Time0_M0 模式选择(低) # define set_Count0_M0 (TMOD | Bit0) # define cle_Count0_M0 (TMOD &(~Bit0)) # define git_Count0_M0 (Bit0 == (TMOD&Bit0)) // Time0_M1 模式选择(高) # define set_Count0_M1 (TMOD | Bit1) # define cle_Count0_M1 (TMOD &(~Bit1)) # define git_Count0_M1 (Bit1 == (TMOD&Bit1)) // C/T0:T0 计数器的时钟输入方式选择 # define set_Count0_CT0 (TMOD | Bit2) // 电平来源(外部) # define cle_Count0_CT0 (TMOD &(~Bit2)) // 内部时钟(内部时钟6/12分频) # define git_Count0_CT0 (Bit2 == (TMOD&Bit2)) // GATE0:门控制位置 # define set_Count0_GATE (TMOD | Bit3) // 要用软件使 TR 或 TR 为1,可以启动定时器/计数器 # define cle_Count0_GATE (TMOD &(~Bit3)) // 只要用软件TCON中的 TR* 寄存器为1,就可以启动计数器工作 # define git_Count0_GATE (Bit3 == (TMOD&Bit3)) // Time1 // 定时器/计数器0 // Time1_M0 模式选择(低) # define set_Count1_M0 (TMOD | Bit4) # define cle_Count1_M0 (TMOD &(~Bit4)) # define git_Count1_M0 (Bit4 == (TMOD&Bit4)) // Time1_M1 模式选择(高) # define set_Count1_M1 (TMOD | Bit5) # define cle_Count1_M1 (TMOD &(~Bit5)) # define git_Count1_M1 (Bit5 == (TMOD&Bit5)) // C/T1:T1 计数器的时钟输入方式选择 # define set_Count1_CT1 (TMOD | Bit6) // 电平来源(外部) # define cle_Count1_CT1 (TMOD &(~Bit6)) // 内部时钟(内部时钟6/12分频) # define git_Count0_CT1 (Bit6 == (TMOD&Bit6)) // GATE1:门控制位置 # define set_Count1_GATE (TMOD | Bit7) // 要用软件使 TR 或 TR 为1,可以启动定时器/计数器 # define cle_Count1_GATE (TMOD &(~Bit7)) // 只要用软件TCON中的 TR* 寄存器为1,就可以启动计数器工作 # define git_Count1_GATE (Bit7 == (TMOD&Bit7)) // 定时器模式配置 // Time0 # define Time0_mode_0 cle_Count0_M1;cle_Count0_M0 # define Time0_mode_1 cle_Count0_M1;set_Count0_M0 # define Time0_mode_2 set_Count0_M1;cle_Count0_M0 # define Time0_mode_3 set_Count0_M1;set_Count0_M0 // Time1 # define Time1_mode_0 cle_Count1_M1;cle_Count1_M0 # define Time1_mode_1 cle_Count1_M1;set_Count1_M0 # define Time1_mode_2 set_Count1_M1;cle_Count1_M0 # define Time1_mode_3 set_Count1_M1;set_Count1_M0 // ----------------------------------- // sfr AUXR = 0x8E; // 辅助寄存器 // ALEOFF/P4.5 // ALE 信号输出控制使能 # define set_ALEOFF (AUXR|Bit0) // 为P4.5引脚 # define cle_ALEOFF (AUXR&(~Bit0)) // 设置为 ALE 输出引脚 # define git_ALEOFF (Bit0 == (AUXR&Bit0)) // EXTRAM 内部/外部RAM存取控制 # define set_EXTRAM (AUXR|Bit1) // 内部扩展的 EXTRAM 可以存取 # define cle_EXTRAM (AUXR&(~Bit1) // 外部数据存取存储器 # define git_EXTRAM (Bit1 == (AUXR&Bit1)) // ----------------------------------- // sfr P1 = 0x90; // Port 1 sbit P10 = P1^0; # define set_P10 P10=1 # define cle_P10 P10=0 # define git_P10 P10 sbit P11 = P1^1; # define set_P11 P11=1 # define cle_P11 P11=0 # define git_P11 P11 sbit P12 = P1^2; # define set_P12 P12=1 # define cle_P12 P12=0 # define git_P12 P12 sbit P13 = P1^3; # define set_P13 P13=1 # define cle_P13 P13=0 # define git_P13 P13 sbit P14 = P1^4; # define set_P14 P14=1 # define cle_P14 P14=0 # define git_P14 P14 sbit P15 = P1^5; # define set_P15 P15=1 # define cle_P15 P15=0 # define git_P15 P15 sbit P16 = P1^6; # define set_P16 P16=1 # define cle_P16 P16=0 # define git_P16 P16 sbit P17 = P1^7; # define set_P17 P17=1 # define cle_P17 P17=0 # define git_P17 P17 // -------------- sbit T2 = P1^0; # define set_T2 T2=1 # define cle_T2 T2=0 # define git_T2 T2 sbit T2EX = P1^1; # define set_T2EX T2EX=1 # define cle_T2EX T2EX=0 # define git_T2EX T2EX // ----------------------------------- // sfr SCON = 0x98; // 串口控制寄存器 sbit RI = SCON^0; // 串行口1接受中断标志位。若串行口1允许接受且以方式0工作,则每当接受到第8位数据时置1;若以方式1、2、3工作且SM2=0时,则每当接受到停止位的中间时置1当串口以方式1、2、3工作且SM2=1时,则仅当接收到第9位数据RB8位1后,同时还要接受到停止位的中间时置1。RI为1表示串行口1正向CPU申请中断(接受中断)。RI必须由用户的中断服务程序清零。 # define set_RI RI=1 // 向CPU申请中断(需要用户清理申请RI=0) # define cle_RI RI=0 // 用户已经清理 # define git_RI RI sbit TI = SCON^1; // 串行口1发送中断标志。串行口1以方式0发送完8位数据,由硬件置1;若以方式1、方式2或方式3发送时,在发送停止位的开始时置1。TI=1表示串行口1正在向CPU申请中断(发送中断) 。值得注意的是,CPU响应发送中断请求,转向执行中断服务程序时并不将TI清零,TI必须由用户在中断服务程序中清零。 # define set_TI TI=1 // 向CPU申请中断(需要用户清理申请TI=0) # define cle_TI TI=0 // 用户已经清理 # define git_TI TI sbit RB8 = SCON^2; // 在方式2或方式3,是接收到的第9位数据,按需求由软件置位或清零。例如,可用作数据的校验位或多机通信中表示地址帧/数据帧的标志位。 # define set_RB8 RB8=1 # define cle_RB8 RB8=0 # define git_RB8 RB8 sbit TB8 = SCON^3; // 在方式2或方式3,它为要发送的第9位数据,按需求由软件置位或清零。例如,可用作数据的检验位或多机通信中表示地址帧/数据帧的标志位。 # define set_TB8 TB8=1 # define cle_TB8 TB8=0 # define git_TB8 TB8 sbit REN = SCON^4; // 允许/禁止 串行接收控制位。由软件置位 REN,即 REN=1 为允许串行接收状态,可启动串行接收器 RxD,开始接收信息。软件复位 REN,即 REN=0,则禁止接收。 # define set_REN REN=1 // 允许串口接收 # define cle_REN REN=0 // 禁止串口接收 # define git_REN REN sbit SM2 = SCON^5; // 允许方式2或方式3多级通信控制位。在方式2或方式3时,如 SM2 位为1,REN位为1,则从机处于只有接收到RB8位为1(地址帧)时才激活中断申请标志位RI位1,并向主机请求中断处理。被确认为寻址的从机则复位SM2为1,则只有在接收到有效的停止位时才置位中断请求标志位RI为1;在方式0时,SM2应为0。 # define set_SM2 SM2=1 // 在方式2或方式3时,如 SM2 位为1,REN位为1,则从机处于只有接收到RB8位为1(地址帧)时才激活中断申请标志位RI位1,并向主机请求中断处理。被确认为寻址的从机则复位SM2为1,则只有在接收到有效的停止位时才置位中断请求标志位RI为1; # define cle_SM2 SM2=0 // 在方式0时,SM2应为0。 # define git_SM2 SM2 sbit SM1 = SCON^6; // 串口的工作方式(高位) # define set_SM1 SM1=1 # define cle_SM1 SM1=0 # define git_SM1 SM1 sbit FE = SCON^7; // alternatively "FE" 当PCON寄存器中的SMOD0/PCON.6位为1时,该位用于帧错误检测。当检测到一个无效停止位时,通过UART接收器设置改位。它必须由软件清零。 # define set_FE FE=1 # define cle_FE FE=0 # define git_FE FE sbit SM0 = SCON^7; // 串口的工作方式(低位) 当PCON寄存器中的SMOD0/PCON.6位为0时,该位和SM1一起指定串行通信的工作方式如下: # define set_SM0 SM0=1 # define cle_SM0 SM0=0 # define git_SM0 SM0 // SM0、SM1 工作方式 // 当单片机工作在12T 模式时,定时器1的溢出率 = sysclk/12/(256 - TH1) // 当单片机工作在 6T 模式时,定时器1的溢出率 = sysclk/ 6/(256 - TH1) #define UART0_mode_0 cle_SM0;cle_SM1 // 方式0,同步移位串行方式;移位寄存器 波特率时sysclk/12 #define UART0_mode_1 cle_SM0;set_SM1 // 方式1,8位UART,波特率可变 ((2^SMOD)/32)x(定时器1的溢出率) #define UART0_mode_2 set_SM0;cle_SM1 // 方式2,9位UART ((2^SMOD)/64)xSYSclk系统工作时钟频率) #define UART0_mode_3 set_SM0;set_SM1 // 方式3,9位UART, 波特率可变 ((2^SMOD)/32)x(定时器1的溢出率) // ----------------------------------- // sfr P2 = 0xA0; // Port 2 sbit P20 = P2^0; # define set_P20 P20=1 # define cle_P20 P20=0 # define git_P20 P20 sbit P21 = P2^1; # define set_P21 P21=1 # define cle_P21 P21=0 # define git_P21 P21 sbit P22 = P2^2; # define set_P22 P22=1 # define cle_P22 P22=0 # define git_P22 P22 sbit P23 = P2^3; # define set_P23 P23=1 # define cle_P23 P23=0 # define git_P23 P23 sbit P24 = P2^4; # define set_P24 P24=1 # define cle_P24 P24=0 # define git_P24 P24 sbit P25 = P2^5; # define set_P25 P25=1 # define cle_P25 P25=0 # define git_P25 P25 sbit P26 = P2^6; # define set_P26 P26=1 # define cle_P26 P26=0 # define git_P26 P26 sbit P27 = P2^7; # define set_P27 P27=1 # define cle_P27 P27=0 # define git_P27 P27 // ----------------------------------- // 此系列单片机有两个16-bit数据指针,DPTR0,DPTR1,当 DPS 选择位为0时,选择DPTR0,当 DPS 选择位为1时,选择DPTR1. // AUXR1 特殊功能寄存器,位于A2H单元,其中的位不可用布尔指针快速访问,但由于DPS位位于bit0,故对AUXR1寄存器用INC指令,DPS位便会翻转,由0变成1或由1变成0,即可实现双数据指针的快速切换。 // sfr AUXR1 = 0xA2; // 辅助寄存器 双数据指针功能寄存器 // DPS DPTR 寄存器选择 # define set_DPS (AUXR1|Bit0) // DPTR0 被选择 # define cle_DPS (AUXR1&(~Bit0)) // DPTR1 被选择 # define git_DPS (Bit0 == (AUXR1&Bit0)) // GF2: 通用工作标志位,用户可以任意使用。 # define set_GF2 (AUXR1|Bit3) # define cle_GF2 (AUXR1&(~Bit3)) # define git_GF2 (Bit3 == (AUXR1&Bit3)) // ----------------------------------- // sfr IE = 0xA8; // 中断允许控制寄存器 // 外部中断0中断允许位。 sbit EX0 = IE^0; # define set_EX0 EX0=1 // 允许中断 # define cle_EX0 EX0=0 // 禁止中断 # define git_EX0 EX0 // T0的溢出中断允许位。 sbit ET0 = IE^1; # define set_ET0 ET0=1 // 允许T0中断 # define cle_ET0 ET0=0 // 禁止T0中断 # define git_ET0 ET0 // 外部中断1中断允许位。 sbit EX1 = IE^2; # define set_EX1 EX1=1 // 允许外部中断1中断 # define cle_EX1 EX1=0 // 禁止外部中断1中断 # define git_EX1 EX1 // 定时/计数器 T1 的溢出中断允许位。 sbit ET1 = IE^3; # define set_ET1 ET1=1 // 允许T1中断 # define cle_ET1 ET1=0 // 禁止T1中断 # define git_ET1 ET1 // 串行口1中断允许位。 sbit ES = IE^4; # define set_ES ES=1 // 允许串行口1中断 # define cle_ES ES=0 // 禁止串行口1中断 # define git_ES ES // 定时/计数器 T2 的溢出中断允许位。 sbit ET2 = IE^5; # define set_ET2 ET2=1 // 允许T2中断 # define cle_ET2 ET2=0 // 禁止T2中断 # define git_ET2 ET2 // 低压检测中断 sbit EC = IE^6; # define set_EC EC=1 # define cle_EC EC=0 # define git_EC EC // CPU的总中断允许控制位, sbit EA = IE^7; # define set_EA EA=1 // CPU 开放中断 # define cle_EA EA=0 // CPU屏蔽所有中断申请。 # define git_EA EA // ----------------------------------- // sfr P3 = 0xB0; // Port 3 sbit P30 = P3^0; // P30 # define set_P30 P30=1 # define cle_P30 P30=0 # define git_P30 P30 sbit RxD = P3^0; // 串口1接收引脚 # define set_P30 P30=1 # define cle_P30 P30=0 # define git_P30 P30 sbit P31 = P3^1; // P31 # define set_P31 P31=1 # define cle_P31 P31=0 # define git_P31 P31 sbit TxD =P3^1; // 串口1发送引脚 # define set_P31 P31=1 # define cle_P31 P31=0 # define git_P31 P31 sbit P32 = P3^2; // P32 # define set_P32 P32=1 # define cle_P32 P32=0 # define git_P32 P32 sbit INT0 = P3^2; // INT0:外部中断0,下降沿中断或低电平中断 # define set_INT0 INT0=1 # define cle_INT0 INT0=0 # define git_INT0 INT0 sbit P33 = P3^3; // P33 # define set_P33 P33=1 # define cle_P33 P33=0 # define git_P33 P33 sbit INT1 = P3^3; // INT0:外部中断1,下降沿中断或低电平中断 # define set_INT1 INT1=1 # define cle_INT1 INT1=0 # define git_INT1 INT1 sbit P34 = P3^4; // P34 # define set_P34 P34=1 # define cle_P34 P34=0 # define git_P34 P34 sbit T0 = P3^4; // 定时器/计数器 0 的外部输入 # define set_T0 T0=1 # define cle_T0 T0=0 # define git_T0 T0 sbit P35 = P3^5; // P35 # define set_P35 P35=1 # define cle_P35 P35=0 # define git_P35 P35 sbit T1 = P3^5; // 定时器/计数器 1 的外部输入 # define set_T1 T1=1 # define cle_T1 T1=0 # define git_T1 T1 sbit P36 = P3^6; // P36 # define set_P36 P36=1 # define cle_P36 P36=0 # define git_P36 P36 sbit WR = P3^6; // 外部数据存储写脉冲 # define set_WR WR=1 # define cle_WR WR=0 # define git_WR WR sbit P37 = P3^7; // P37 # define set_P37 P37=1 # define cle_P37 P37=0 # define git_P37 sbit RD = P3^7; // 外部数据存储器读脉冲 # define set_RD RD=1 # define cle_RD RD=0 # define git_RD RD // ----------------------------------- // sfr IPH = 0xB7; // 中断优先级寄存器(高) // PT0H:外部中断0优先级配置位(高) # define set_PX0H (IPH |Bit0) # define cle_PX0H (IPH &(~Bit0)) # define git_PX0H (Bit0 == (IPH&Bit0)) // PX0H:计数器0优先级配置位(高) # define set_PT0H (IPH |Bit1) # define cle_PT0H (IPH &(~Bit1)) # define git_PT0H (Bit1 == (IPH&Bit1)) // PT1H:外部中断1优先级配置位(高) # define set_PX1H (IPH |Bit2) # define cle_PX1H (IPH &(~Bit2)) # define git_PX1H (Bit2 == (IPH&Bit2)) // PX1H:计数器1优先级配置位(高) # define set_PT1H (IPH |Bit3) # define cle_PT1H (IPH &(~Bit3)) # define git_PT1H (Bit3 == (IPH&Bit3)) // PSH:串口优先级配置位(高) # define set_PSH (IPH |Bit4) # define cle_PSH (IPH &(~Bit4)) # define git_PSH (Bit4 == (IPH&Bit4)) // PT2H:定时器2中断优先级控制位(高) # define set_PT2H (IPH |Bit5) # define cle_PT2H (IPH &(~Bit5)) # define git_PT2H (Bit5 == (IPH&Bit5)) // PX2H:外部中断2优先级控制位(高) # define set_PX2H (IPH |Bit6) # define cle_PX2H (IPH |(~Bit6)) # define git_PX2H (Bit6 == (IPH&Bit6)) // PX3H:外部中断3优先级控制位(高) # define set_PX3H (IPH |Bit7) # define cle_PX3H (IPH &(~Bit7)) # define git_PX3H (Bit7 == (IPH&Bit7)) // ----------------------------------- // sfr IP = 0xB8; // 中断优先级寄存器(低) sbit PX0 = IP^0; // 外部中断0优先级控制位(低) # define set_PX0 PX0=1 # define cle_PX0 PX0=0 # define git_PX0 PX0 sbit PT0 = IP^1; // 定时器0中断优先级控制位(低) # define set_PT0 PT0=1 # define cle_PT0 PT0=0 # define git_PT0 PT0 sbit PX1 = IP^2; // 外部中断1优先级控制位(低) # define set_PX1 PX1=1 # define cle_PX1 PX1=0 # define git_PX1 PX1 sbit PT1 = IP^3; // 定时器1中断优先级控制位(低) # define set_PX1 PX1=1 # define cle_PX1 PX1=0 # define git_PX1 PX1 sbit PS = IP^4; // 串口优先级配置位(低) # define set_PS PS=1 # define cle_PS PS=0 # define git_PS PS sbit PT2 = IP^5; // 定时器2中断优先级控制位(低) # define set_PT2 PT2=1 # define cle_PT2 PT2=0 # define git_PT2 PT2 // ----------------------------------- // sfr XICON = 0xC0; // Auxiliary Interrupt Control // IT2:外部中断2中断源类型选择位。IT2=0,(~INT2)/P4.3 引脚上的低电平可触发外部中断2。IT2=1,外部中断2为下降沿触发方式。 # define set_IT2 IT2=1 # define cle_IT2 IT2=0 # define git_IT2 IT2 // IE2:外部中断2中断申请标志位,中断条件成立后,IE2=1,可由硬件自动复位。 # define set_IE2 IE2=1 # define cle_IE2 IE2=0 # define git_IE2 IE2 // EX2:如被设置成1,允许外部中断2中断;如被清成0,禁止外部中断2中断。 # define set_EX2 EX2=1 # define cle_EX2 EX2=0 # define git_EX2 EX2 // PX2:置位表明外部中断2的优先级为高,优先级最终由[PX2H,PX2]=[0,0],[0,1],[1,0],[1,1]来表决。 # define set_PX2 PX2=1 # define cle_PX2 PX2=0 # define git_PX2 PX2 // IT3:外部中断3中断请求标志位。IT3=0,(~INT3)/P4.2引脚上的低电平可触发外部中断3。IT3=1,外部中断3为下降沿触发方式。 # define set_IT3 IT3=1 # define cle_IT3 IT3=0 # define git_IT3 IT3 // IE3:外部中断3中断源请求标志位,中断条件成立后,IE3=1,可由硬件自动清零。 # define set_IE3 IE3=1 # define cle_IE3 IE3=0 # define git_IE3 IE3 // EX3:如被设置成1,允许外部中断3中断;如被清零,禁止外部中断2中断。 # define set_EX3 EX3=1 # define cle_EX3 EX3=0 # define git_EX3 EX3 // PX3:置位表明外部中断3的优先级为高,优先级最终由[PX3H,PX3]=[0,0],[0,1],[1,0],[1,1]来决定。 # define set_PX3 PX3=1 # define cle_PX3 PX3=0 # define git_PX3 PX3 // ----------------------------------- // sfr T2CON = 0xC8; // Timer/Counter 2 Mode // CP/(~RL2):捕获/从装标志。置位:EXEN=1时,T2EX的负跳变产生捕获。清零:EXEN2=0时,定时器2溢出或T2EX的负跳变都可使定时器自动重装。当RCLK=1或TCLK=1时,该位无效且定时器强制为溢出时自动重装。 sbit CP_RL2= T2CON^0; # define set_CP_RL2 CP_RL2=1 # define cle_CP_RL2 CP_RL2=0 # define git_CP_RL2 CP_RL2 // C/T2:定时器/计数器选择。(定时器2) sbit C_T2 = T2CON^1; # define set_C_T2 C_T2=1 // 外部事件计数器(下降沿触发) # define cle_C_T2 C_T2=0 // 内部定时器(OSC/12或OSC/6) # define git_C_T2 C_T2 // TR2:定时器2启动/停止控制位。置1时启动定时器。 sbit TR2 = T2CON^2; # define set_TR2 TR2=1 # define cle_TR2 TR2=0 # define git_TR2 TR2 // EXEN2:定时器2外部使能标志。当其置位且定时器2未作为串口时钟时,允许T2EX的负跳变产生捕获或重装。EXEN2=0时,T2EX的跳变对定时器2无效。 sbit EXEN2 = T2CON^3; # define set_EXEN2 EXEN2=1 # define cle_EXEN2 EXEN2=0 # define git_EXEN2 EXEN2 // TCLK:发送时钟标志。TCLK置位时,定时器2的溢出脉冲作为串行口模式1和模式3的发送时钟。TCLK=0时,将定时器1的溢出脉冲作为发送时钟。 sbit TCLK = T2CON^4; # define set_TCLK TCLK=1 # define cle_TCLK TCLK=0 # define git_TCLK TCLK // RCLK:接收时钟标志。RCLK置位时,定时器2的溢出脉冲作为串行口模式1和模式3的接收时钟。TCLK=0时,将定时器1的溢出脉冲作为接收时钟。 sbit RCLK = T2CON^5; # define set_RCLK RCLK=1 # define cle_RCLK RCLK=0 # define git_RCLK RCLK // EXF2:定时器2外部中断标志。当EXNE2=1且T2EX的负跳变产生捕获或重装时,EXF2置位。定时器2中断使能时,EXF2=1将使CPU从中断向量处执行定时器2中断子程序。EXF2位必须用软件清零在递增/递减计数器模式(DCEN=1)中,EXF2不会引起中断。 sbit EXF2 = T2CON^6; # define set_EXF2 EXF2=1 # define cle_EXF2 EXF2=0 # define git_EXF2 EXF2 // TF2:定时器2溢出标志。定时器2溢出时置位,必须由软件清零。当RCLK或TCLK=1时,TF2将不会置位。 sbit TF2 = T2CON^7; # define set_TF2 TF2=1 # define cle_TF2 TF2=0 # define git_TF2 TF2 // ----------------------------------- // sfr T2MOD = 0xC9; // Timer/Counter 2 Mode // DECN:向下计数使能位。定时器2 可配置成向上/向下计数器。(用户勿将其置1。这些位在将来80C51系列产品中用来实现新特性。在这种情况下,以后用到保留位,复位时或有效状态时,它的值应为0;而这些位有效状态时,它的值为1。从保留位读到的值是不确定的。) # define set_DECN (T2MOD|Bit0) # define cle_DECN (T2MOD&(~Bit0)) # define git_DECN (Bit0 == (T2MOD&Bit0)) // T2OE:定时器2输出使能位。 # define set_T2OE (T2MOD|Bit1) # define cle_T2OE (T2MOD&(~Bit1)) # define git_T2OE (Bit1 == (T2MOD&Bit1)) // ----------------------------------- // sfr PSW = 0xD0; // 程序状态寄存器 // 奇偶标志位。该标志位始终体现累加器ACC中1的个数的奇偶性。如果累加器ACC中1的个数位奇数,则P置1;当累加器ACC中的个数为偶数(包括0个)时,P位为0 sbit P = PSW^0; # define set_P P=1 # define cle_P P=0 # define git_P P // F1:用户标志位1。 sbit F1 = PSW^1; # define set_F1 F1=1 # define cle_F1 F1=0 # define git_F1 F1 // OV:溢出标志位 sbit OV = PSW^2; # define set_OV OV=1 # define cle_OV OV=0 # define git_OV OV // 工作寄存器组的选择位(低) sbit RS0 = PSW^3; # define set_RS0 RS0=1 # define cle_RS0 RS0=0 # define git_RS0 RS0 // 工作寄存器组的选择位(高) sbit RS1 = PSW^4; # define set_SM1 SM1=1 # define cle_SM1 SM1=0 # define git_SM1 SM1 // 寄存器工作组 # define Register_bank_mode_0 cle_SM1;cle_SM0 # define Register_bank_mode_1 cle_SM1;set_RS0 # define Register_bank_mode_2 set_SM1;cle_SM0 # define Register_bank_mode_3 set_SM1;set_RS0 // 用户标志位0 sbit F0 = PSW^5; # define set_F0 F0=1 # define cle_F0 F0=0 # define git_F0 F0 // 进位辅助位置。进行加法计算时,当B3位由进位,或执行减法运算最高位有借位时,AC为1;反之位0.设置辅助进位标志AC的目的是为了便于BCD码加法、减法运算的调整。 sbit AC = PSW^6; # define set_AC AC=1 # define cle_AC AC=0 # define git_AC AC // 标志位。进行加法运算时,当最高位即B7位有进位,或执行减法运算最高位有借位时,CY为1;反之位0 sbit CY = PSW^7; # define set_CY CY=1 # define cle_CY CY=0 # define git_CY CY // ----------------------------------- // sfr WDT_CONTR = 0xe1; // 看门狗控制寄存器 // PS0:看门狗预分频系数(低位) # define set_PS0_WDT (WDT_CONTR|Bit0) # define cle_PS0_WDT (WDT_CONTR&(~Bit0)) # define git_PS0_WDT (Bit0 == (WDT_CONTR&Bit0)) // PS1:看门狗预分频系数(中位) # define set_PS1_WDT (WDT_CONTR|Bit1) # define cle_PS1_WDT (WDT_CONTR&(~Bit1)) # define git_PS1_WDT (Bit1 == (WDT_CONTR&Bit1)) // PS2:看门狗预分频系数(高位) # define set_PS2_WDT (WDT_CONTR|Bit2) # define cle_PS2_WDT (WDT_CONTR&(~Bit2)) # define git_PS2 _WDT (Bit1 == (WDT_CONTR&Bit2)) // 看门狗定时器分频值 # define WDT_Sub_mode_2 cle_PS2_WDT;cle_PS1_WDT;cle_PS0_WDT # define WDT_Sub_mode_4 cle_PS2_WDT;cle_PS1_WDT;set_PS0_WDT # define WDT_Sub_mode_8 cle_PS2_WDT;set_PS1_WDT;cle_PS0_WDT # define WDT_Sub_mode_16 cle_PS2_WDT;set_PS1_WDT;set_PS0_WDT # define WDT_Sub_mode_32 set_PS2_WDT;cle_PS1_WDT;cle_PS0_WDT # define WDT_Sub_mode_64 set_PS2_WDT;cle_PS1_WDT;set_PS0_WDT # define WDT_Sub_mode_128 set_PS2_WDT;set_PS1_WDT;cle_PS0_WDT # define WDT_Sub_mode_256 set_PS2_WDT;set_PS1_WDT;set_PS0_WDT // IDLE_WDT:看门狗“IDLE”模式位,当设置为“1”,看门狗定时器在“空闲模式”计数当清“0”该位时,看门狗定时器在“空闲模式”时不计数。 # define set_IDLE_WDT (WDT_CONTR|Bit3) // 看门狗在“空闲模式”时计数。 # define cle_IDLE_WDT (WDT_CONTR&(~Bit3)) // 看门狗在“空闲模式”时不计数。 # define git_IDLE_WDT (Bit3 == (IDLE_WDT&Bit3)) // CLR_WDT:看门狗计数自动清零使能 # define set_CLR_WDT (WDT_CONTR | Bit4) // 清空看门狗重置 # define cle_CLR_WDT (WDT_CONTR &(~Bit4)) # define git_CLR_WDT (Bit4 == (WDT_CONTR&Bit4)) // EN_WDT:看门狗允许位 # define set_EN_WDT (WDT_CONTR |Bit5) // 启动看门狗(启动后不可关闭) # define cle_EN_WDT (WDT_CONTR &(~Bit5)) // 默认关闭 # define git_EN_WDT (Bit5 == (WDT_CONTR&Bit5)) // ----------------------------------- // sfr ISP_CMD = 0xe5; // ISP/IAP 命令寄存器 // MS0: # define set_ISP_IAP_MS0 (ISP_CMD |Bit0) # define cle_ISP_IAP_MS0 (ISP_CMD &(~Bit0)) // MS1: # define set_ISP_IAP_MS1 (ISP_CMD |Bit1) # define cle_ISP_IAP_MS1 (ISP_CMD &(~Bit1)) // MS2: # define set_ISP_IAP_MS2 (ISP_CMD |Bit2) # define cle_ISP_IAP_MS2 (ISP_CMD &(~Bit2)) // ISP/IAP mode set # define ISP_IAP_NO_mode cle_ISP_IAP_MS1;cle_ISP_IAP_MS0 // 待机模式,无操作 # define ISP_IAP_Byte_read cle_ISP_IAP_MS1;set_ISP_IAP_MS0 // 从用户的应用程序区对"data flash / eeprom" 进行字节读 # define ISP_IAP_Byte_write set_ISP_IAP_MS1;cle_ISP_IAP_MS0 // 从用户的应用程序区对"data flash / eeprom" 进行字节写 # define ISP_IAP_Sector_erase set_ISP_IAP_MS1;set_ISP_IAP_MS0 // 从用户的应用程序区对"data flash / eeprom" 进行扇区删除 // ----------------------------------- // sfr ISP_CONTR = 0xe7; // ISP/IAP 控制寄存器 // WT0: # define set_ISP_CONTR_WT0 (ISP_CONTR|Bit0) # define cle_ISP_CONTR_WT0 (ISP_CONTR|(~Bit0)) // WT1: # define set_ISP_CONTR_WT1 (ISP_CONTR|Bit1) # define cle_ISP_CONTR_WT1 (ISP_CONTR&(~Bit1)) // WI2: # define set_ISP_CONTR_WT2 (ISP_CONTR|Bit2) # define cle_ISP_CONTR_WT2 (ISP_CONTR&(~Bit2)) // 设置ISP/IAP操作的等待时间 # define ISP_CONTR_Time_mode0 cle_ISP_CONTR_WT2;cle_ISP_CONTR_WT1;cle_ISP_CONTR_WT0 // 默认 0 # define ISP_CONTR_Time_mode1 cle_ISP_CONTR_WT2;cle_ISP_CONTR_WT1;set_ISP_CONTR_WT0 # define ISP_CONTR_Time_mode2 cle_ISP_CONTR_WT2;set_ISP_CONTR_WT1;cle_ISP_CONTR_WT0 # define ISP_CONTR_Time_mode3 cle_ISP_CONTR_WT2;set_ISP_CONTR_WT1;set_ISP_CONTR_WT0 // SWRST:产生软件复位 # define set_ISP_CONTR_SWRST (ISP_CONTR|Bit5) // 产生软件系统复位,硬件自动复位。 # define cle_ISP_CONTR_SWRST (ISP_CONTR&(~Bit5)) // 不操作 // SWBS:SWRST产生软件复位后启动位置 # define set_ISP_CONTR_SWBS (ISP_CONTR|Bit6) // SWRST产生软件复位后启动位置(从系统ISP监控程序) # define cle_ISP_CONTR_SWRS (ISP_CONTR&(~Bit6)) // SWRST产生软件复位后启动位置(从应用程序区启动) // ISPEN:ISP/IAP 功能允许位 # define set_ISP_CONTR_ISPEN (ISP_CONTR|Bit7) // 允许 ISP/IAP 读写擦除 data flash/eeprm # define cle_ISP_CONTR_ISPEN (ISP_CONTR&(~Bit7)) // 禁止 ISP/IAP 读写擦除 data flash/eeprm // ----------------------------------- // sfr P4 = 0xe8; // Port 4 sbit P40 = P4^0; // P40 # define set_P40 P40=1 # define cle_P40 P40=0 # define git_P40 P40 sbit P41 = P4^1; // P41 # define set_P41 P41=1 # define cle_P41 P41=0 # define git_P41 P41 sbit P42 = P4^2; // P42 # define set_P42 P42=1 # define cle_P42 P42=0 # define git_P42 P42 sbit INT3 = P4^2; // (~INT3)外部中断3,下降沿中断或低电平中断 # define set_INT3 INT3=1 # define cle_INT3 INT3=0 # define git_INT3 INT3 sbit P43 = P4^3; // P43 # define set_P43 P43=1 # define cle_P43 P43=0 # define git_P43 P43 sbit INT2 = P4^3; // (~INT2)外部中断3,下降沿中断或低电平中断 # define set_INT2 INT2=1 # define cle_INT2 INT2=0 # define git_INT2 INT2 sbit P44 = P4^4; // P44 # define set_P44 P44=1 # define cle_P44 P44=0 # define git_P44 P44 sbit PSEN = P4^4; // 外部程序储存器选通信号输入引脚 # define set_PSEN PSEN=1 # define cle_PSEN PSEN=0 # define git_PSEN PSEN sbit P45 = P4^5; // ISP下载需勾选"ALE脚用作P4.5口" # define set_P45 P45=1 # define cle_P45 P45=0 # define git_P45 P45 sbit ALE = P4^5; // ALE # define set_ALE ALE=1 # define cle_ALE ALE=0 # define git_ALE ALE sbit P46 = P4^6; // P46 # define set_P46 P46=1 # define cle_P46 P46=0 # define git_P46 P46 sbit EEA= P4^6; // 外部存储器选择引脚 External storage # define set_EEA EEA=1 # define cle_EEA EEA=0 # define git_EEA EEA #endif |
分类:
单片机
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决