• 单片机成长之路(51基础篇)


    感觉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
    

      

     

  • 相关阅读:
    Pwn-level0
    Pwn-level2
    【php】php从多个数组中取出最大的值
    【算法】php计算数字k在一段数字范围出现的次数
    【算法】php计算出丑数
    【php】php常用函数代码封装(一)数组篇
    【Golang】go语言设计模式
    什么是RPC
    【php】 php获取文件路径中的文件名和文件后缀方法
    【php】php目录路径函数系列
  • 原文地址:https://www.cnblogs.com/jikexianfeng/p/13795755.html
Copyright © 2020-2023  润新知