单片机成长之路(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

  

 

posted @   极客先锋  阅读(693)  评论(0编辑  收藏  举报
编辑推荐:
· 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 重磅开源!
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示