单片机成长之路(51基础篇) - 029 stc89c52_register.h
感觉stc89c51的库不好用,自己写了个:stc89c52_register.h
#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