⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 constant.h

📁 DIY一个属于你的超声波测距传感器程序的构思和设计
💻 H
字号:
/***************************************************/
/*					  超声波测距传感器	    							 */
/*          		—— 常量定义												 */
/*					    20080222                           */
/*              By DingQi                          */
/***************************************************/
// 注:以下文档的 TAB 为 2 个字符!

/* —————— 工作模式控制 ———————— */
#define				STOP_MEASURE		0x00				// 停止测量,待命

#define				AUTO_MEASURE		0x10				// 自动测量模式
#define				READ_BACK_DATA	0x00				// 自动测量模式下,被动数据返回
#define				AUTO_BACK_DATA	0x01				// 自动测量模式下,主动数据返回

#define				SINGLE_MEASURE	0x20				// 单次测量模式
#define				NOPROC_BACK			0x00				// 测量数据不作处理,直接返回,测量几次返回几个
#define				MID_BACK				0x01				// 剔除测量数据中的最大最小值后剩余数据返回
#define				MEAN_BACK				0x02				// 将测量数据取平均后返回平均值
#define				MID_MEAN_BACK		0x03				// 剔除测量数据中的最大最小值后平均值返回

#define				GET_MAIN_MODE		0xF0
#define				GET_SUB_MODE		0x0F

/* ————— 通讯 ————————*/

#define				MaxRcvByte_C		32					// 接收缓冲区大小
#define				MaxTxdByte_C		32					// 发送缓冲区大小,设置单独的发送缓冲区是为了能全双工通讯

// 波特率定义
#define				B_57600					4
#define				B_38400					3
#define 			B_19200					2
#define 			B_9600					1
#define 			B_4800					0

// 在 22.1184Hz 下用 T1 作波特率发生器, 1 分频, T1 自动重加载值
#define				B57600_C  			244
#define   		B38400_C  			238
#define 			B19200_C				220		
#define 			B9600_C					184		
#define 			B4800_C					144		

// SMOD
#define				UART_MODE1_C 		0x40			// SM0,SM1= 01
#define				EN_RCV_C				0x10			// REN=1

// 允许串口中断
#define				EnUART_C				0x10

// 串口中断优先级 
#define				UART_HIGH				0x10

// 帧命令字
#define 			READ_MEMORY  		0x01		// 读内存命令字
#define				WRITE_MEMORY  	0x02		// 写内存命令字
#define				SET_WORKMODE 		0x03		// 设置工作模式
#define				READ_DATA				0x04		// 自动模式下读测量数据

// 自己的设备地址
#define				MY_ADDR 				0x01

/* ——— 工作状态 ————*/
#define				WAIT_START			0x00
#define				ULTRASONIC_T		0x01
#define				ULTRASONIC_R		0x02
#define				CAL_RESULT			0x03
#define				DATA_BACK				0x04
#define				WAIT_FINISH			0x05
#define				WAIT_NEXT				0x06		// 等待单次测量模式下多次数据采集的间隔时间

/*—————— 测量 ——————*/
#define				DATA_SAVE_NUM		8				// 暂时保存 8 个数据,因为要环形处理,所以此数必须为2的幂!!

#define				ULTRASONIC_T_NUM 20			// 发送10个脉冲,但需要处理 20 个时间间隔

#define				SEND_VALID			1				// 超声波发射有效, 对应变压器驱动导通,此时Cut_Off端应无效!
#define				SEND_INVALID		0				// 超声波发射无效,变压器驱动无效

#define				CUT_OFF_VALID		0				// 超声波余波抑制控制端有效,对应变压器初级短路,此时 Send 端应无效!
#define				CUT_OFF_INVALID	1				// 超声波余波抑制控制端无效,变压器正常工作

#define				EN852OUT				1				// 控制 852 的输出,0 —— 禁止, 1 - 允许,利用OC输出方式短路积分电容。
#define				DIS852OUT				0			

#define				INHIBIT_TIME		11000		// 屏蔽计时约 1ms 
#define				CUT_OFF_DELAY		300			// 启动回波抑制延时时间

#define				MEA_GAPTIME			10			// 单次模式下两次数据采集间隔时间,ms

// 计算距离用常数
// 因为按照最大距离 20 m, 计时数据不超过 50ms, 和速度的乘积不会造成长整数据溢出。
#define				ULTRA_SPEED			3403				// 放大了 10 倍,和下面系数配合,得到单位为 mm 的距离值
#define				TIME_RATIO			110592			// 作为分母,缩小了 100 倍。

/*———————— 工作指示 ———————— */
#define				NORMAL					0
#define				NORMAL_DISP			500			// 正常工作指示,1秒亮一次
#define				NORMAL_NUM			0				// 正常工作指示连续

#define				UART_OK					1				
#define				UART_DISP				100			// 通讯工作指示,1秒亮 5 次
#define				UART_NUM				10			// 显示 10 次

#define				MEA_OK					2	
#define				MEA_OK_DISP			10			// 测量工作指示, 1秒亮 50 次
#define				MEA_OK_NUM			10			// 显示 10 次

/*-----  WDT 参数定义 ---------- */

#define 			Watchdog_C	0x3D				// 0011 1101, 设置 WDT 分频选择: 101, 约 1s ( 22.1184MHz)
#define 			CLRWDT_C    0x3D

#define				WDTTIME_C		1000				// 对 1 ms 计数,1秒清一次 WDT。


/*———————— MCU硬件初始化常数 ———————— */

/* CPU时钟参数定义 */

#define		CLKDIV1_C	0x0		/* 设置CPU 主时钟分频 */
#define		CLKDIV2_C	1
#define		CLKDIV4_C	2
#define		CLKDIV8_C	3
#define		CLKDIV16_C	4
#define		CLKDIV32_C	5
#define		CLKDIV64_C	6
#define		CLKDIV128_C	7

#define		FOSC		22118400l				// 振荡器频率 22.1184Mhz

/* 输入输出口定义 */

#define		P1M0_C	0x0f		/* 0000 1111,P1口低 4 位OC输出(因为852增益控制有内置上拉电阻),高 4位 标准 51 口 */ 
#define		P1M1_C	0x0f		/* 0000 1111 */

#define		P3M0_C	0xAC		/* 1010 1100,P3.0 P3.1 标准51口,P3.3 输入, P3.4 推挽输出, P3.2 P3.5 P3.7 OC输出*/
#define		P3M1_C	0xB4		/* 1011 0100 */


/* 定时器参数定义 */

#define		T0MODE0 0x00		// 0000 0000,Timer0工作在模式0 ,13位定时;
#define		T0MODE1 0x01		// 0000 0001,Timer0工作在模式1 ,16位定时;
#define		T0MODE2 0x02		// 0000 0010,Timer0工作在模式2 ,8 位自动重加载定时;
#define		T0MODE3 0x03		// 0000 0011,Timer0工作在模式3 

#define		T0_TIMER 0x00		// Timer0 工作在定时器模式
#define		T0_COUNTER 0x04	// Timer0 工作在计数器模式
#define		T0_DISGATE 0x00	// Timer0 禁止INT0引脚控制
#define		T0_ENGATE 0x08	// Timer0 允许INT0引脚控制

#define		T1MODE0 0x00		// 0000 0000,Timer0工作在模式0 ,13位定时;
#define		T1MODE1 0x10		// 0000 0001,Timer0工作在模式1 ,16位定时;
#define		T1MODE2 0x20		// 0000 0010,Timer0工作在模式2 ,8 位自动重加载定时;
#define		T1MODE3 0x30		// 0000 0011,Timer0工作在模式3 

#define		T1_TIMER 0x00		// Timer1 工作在定时器模式
#define		T1_COUNTER 0x40	// Timer1 工作在计数器模式
#define		T1_DISGATE 0x00	// Timer1 禁止INT1引脚控制
#define		T1_ENGATE 0x80	// Timer1 允许INT1引脚控制

#define		SET_T0X12_C 0x80		// or AUXR
#define		CLR_T0X12_C 0x7F		// and AUXR

#define		SET_T1X12_C 0x40		// or AUXR
#define		CLR_T1X12_C 0xBF		// and AUXR

#define		TIME1ms_C		0xF8D0	/* 1ms 定时的加载值字节,对应 22.1184MHz 定时器12分频 */		
#define		TIME1msH_C	0xF8		/* 1ms 定时的加载值高字节 */
#define		TIME1msL_C	0xD0		/* 1ms 定时的加载值低字节 */

/* 中断处理参数定义 */
#define		EnINT0_C 	0x01
#define		EnT0_C 		0x02
#define		EnINT1_C	0x04
#define		EnT1_C 		0x08
#define		EnUART_C	0x10
#define		EnADCSPI_C 	0x20
#define		EnPCALVD_C 	0x40

#define		INT0_DOWN	0x01		// TCON 中对INT0中断信号的控制,下降沿触发;
#define		INT0_LOW	0x00		// TCON 中对INT0中断信号的控制,低电平触发;

#define		INT1_DOWN	0x04		// TCON 中对INT1中断信号的控制,下降沿触发;
#define		INT1_LOW	0x00		// TCON 中对INT1中断信号的控制,低电平触发;

#define		NOIP_C		0x00		/* 无优先级 */

#define		INT0_HIGH 	0x01	// IP 寄存器中的优先级设置,IPH暂不处理。
#define		T0_HIGH			0x02
#define		INT1_HIGH		0x04
#define		T1_HIGH			0x08
#define		UART_HIGH		0x10
#define		ADCSPI_HIGH	0x20
#define		PCALVD_HIGH 0x40	

/* SPI 初始化常数 */

#define		SCLK_FDIV4		0x00			// SPI  时钟: CPU_CLK/4
#define		SCLK_FDIV16		0x01			// SPI  时钟: CPU_CLK/16
#define		SCLK_FDIV64		0x10			// SPI  时钟: CPU_CLK/64
#define		SCLK_FDIV128	0x11			// SPI  时钟: CPU_CLK/128

#define		SAMPLE_IN_FIRST 0x00		// 在时钟的前沿数据采样
#define		SAMPLE_IN_SECOND 0x04		// 在时钟的后沿数据采样

#define		SCLK_IS_HIGH	0x00			// 时钟为正脉冲,前沿为上升,后沿为下降
#define		SCLK_IS_LOW		0x08			// 时钟为负脉冲,前沿为下降,后沿为上升

#define		SPI_SLV				0x00			// 设置 SPI 为从模式
#define		SPI_MASTER		0x10			// 设置 SPI 为主模式

#define		MSB_FIRST_SEND 0x00			// 先发送数据的最高位
#define		LSB_FIRST_SEND 0x20			// 先发送数据的最低位

#define		DISABLE_SPI		0x00			// 禁止 SPI
#define		ENABLE_SPI		0x40			// 使能 SPI	

#define		IGNORER_SS		0x80			// 忽略 SS 引脚
#define		SLV_BY_SS			0x00			// 有 SS 引脚选择主、从模式

#define		CLEAR_SPISTAT 0xC0			// 清除SPI的 SPIF、WCOL 标志
#define		GET_SPIF			0x80			// 得到SPIF标志

/* PCA 初始化常数, */
#define		STARTPCA_C 	0x40;		// or CCON 中的CR位控制 启动 PCA
#define		STOPPCA_C 	0xBF;		// and CCON 中的CR位控制 停止 PCA

#define		FOSCdiv12_C 0x00
#define		FOSCdiv2_C 	0x02	
#define		T0Over_C 	0x04			// T0 溢出
#define		ECI_C 		0x06			// 外部脉冲输入

#define		EnCF_C		0x01			// 允许PCA溢出中断

#define		EnCMP_C		0x40			// 0100 0000, CCAPMn 中控制位6, 允许比较器
#define		EnCAPP_C	0x20			// 0010 0000, CCAPMn 中控制位5, 允许上升沿捕获
#define		EnCAPN_C	0x10			// 0001 0000, CCAPMn 中控制位4, 允许下降沿捕获
#define		EnMAT_C		0x08			// 0000 1000, CCAPMn 中控制位3, 允许匹配或捕获后置位 CCFn
#define		EnTOG_C		0x04			// 0000 0100, CCAPMn 中控制位2, 允许匹配或捕获后触发输出翻转
#define		EnPWM_C		0x02			// 0000 0010, CCAPMn 中控制位1, 允许对应的端子输出PWM信号
#define		EnCCFI_C	0x01			// 0000 0001, CCAPMn 中控制位0, 允许CCF产生中断

/* —————— 通用常数定义 —————— */

#define		TRUE				1
#define		FALSE				0

#define		LED_ON			0
#define		LED_OFF			1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -