简要说明:
一、长尺寸:32mm X宽11mm X高20mm
二、主要芯片:LM393、3144霍尔传感器
三、工作电压:直流5伏
四、特点:
1、具有信号输出指示。
2、单路信号输出。
3、输出有效信号为低电平。
4、灵敏度可调(精调)。
5、有磁场切割就有信号输出
6、电路板输出开关量!(可直接接单片机)
7、可用于电机测速/位置检测等场合
适用场合:单片机学习、电子竞赛、产品开发、毕业设计。。
【图片展示】
【与单片机连接测试程序】
/********************************************************************
汇诚科技
实现功能:此版配套测试程序
使用芯片:ATS52
晶振:11.0592MHZ
波特率:9600
编译环境:Keil
作者:zhangxinchun
淘宝店:汇诚科技
【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!
*********************************************************************/
/********************************************************************
说明:1、 当测量浓度大于设定浓度时,单片机IO口输出低电平
*********************************************************************/
#include #define uchar unsigned char//宏定义无符号字符型 #define uint unsigned int //宏定义无符号整型 /******************************************************************** I/O定义 *********************************************************************/ sbit LED=P1^0; //定义单片机P1口的第1位 (即P1.0)为指示端 sbit DOUT=P2^0; //定义单片机P2口的第1位 (即P2.0)为传感器的输入端 /******************************************************************** 延时函数 *********************************************************************/ void delay()//延时程序 { uchar m,n,s; for(m=20;m>0;m--) for(n=20;n>0;n--) for(s=248;s>0;s--); } /******************************************************************** 主函数 *********************************************************************/ void main() { while(1) //无限循环 { LED=1; //熄灭P1.0口灯 if(DOUT==0)//当浓度高于设定值时 ,执行条件函数 { delay();//延时抗干扰 if(DOUT==0)//确定 浓度高于设定值时 ,执行条件函数 { LED=0; //点亮P1.0口灯 } } } } /******************************************************************** 结束 *********************************************************************/ 【与单片机连接测速参考程序】 /******************************************************************** 汇诚科技 实现功能: 电机转速表设计 使用芯片:ATS52 晶振:11.0592MHZ 波特率:9600 编译环境:Keil 作者:zhangxinchun 【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! #include #include sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚 sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚 sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚 sbit BF=P0^7; //忙碌标志位,将BF位定义为P0.7引脚 unsigned char code digit[ ]={"01234567"}; //定义字符数组显示数字 unsigned int v; //储存电机转速 unsigned char count; //储存定时器T0中断次数 bit flag; //计满1秒钟标志位 /***************************************************** 函数功能:延时1ms (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒 ***************************************************/ void delay1ms() { unsigned char i,j; for(i=0;i<10;i++) for(j=0;j<33;j++) ; } /***************************************************** 函数功能:延时若干毫秒 入口参数:n ***************************************************/ void delay(unsigned char n) { unsigned char i; for(i=0;i } /***************************************************** 函数功能:判断液晶模块的忙碌状态 返回值:result。result=1,忙碌;result=0,不忙 ***************************************************/ unsigned char BusyTest(void) { bit result; RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1; //E=1,才允许读写 _nop_(); //空操作 _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 result=BF; //将忙碌标志电平赋给result E=0; //将E恢复低电平 return result; } /***************************************************** 函数功能:将模式设置指令或显示地址写入液晶模块 入口参数:dictate ***************************************************/ void WriteInstruction (unsigned char dictate) { while(BusyTest()==1); //如果忙就等待 RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令 RW=0; E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲, // 就是让E从0到1发生正跳变,所以应先置"0" _nop_(); _nop_(); //空操作两个机器周期,给硬件反应时间 P0=dictate; //将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=1; //E置高电平 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令 } /***************************************************** 函数功能:指定字符显示的实际地址 入口参数:x ***************************************************/ void WriteAddress(unsigned char x) { WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x" } /***************************************************** 函数功能:将数据(字符的标准ASCII码)写入液晶模块 入口参数:y(为字符常量) ***************************************************/ void WriteData(unsigned char y) { while(BusyTest()==1); RS=1; //RS为高电平,RW为低电平时,可以写入数据 RW=0; E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲, // 就是让E从0到1发生正跳变,所以应先置"0" P0=y; //将数据送入P0口,即将数据写入液晶模块 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=1; //E置高电平 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令 } /***************************************************** 函数功能:对LCD的显示模式进行初始化设置 ***************************************************/ void LcdInitiate(void) { delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间 WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口 delay(5); //延时5ms ,给硬件一点反应时间 WriteInstruction(0x38); delay(5); WriteInstruction(0x38); //连续三次,确保初始化成功 delay(5); WriteInstruction(0x0c); //显示模式设置:显示开,无光标,光标不闪烁 delay(5); WriteInstruction(0x06); //显示模式设置:光标右移,字符不移 delay(5); WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除 delay(5); } /****************************************************************************** 函数功能:显示速度提示符 ******************************************************************************/ void display_sym(void) { WriteAddress(0x00); //写显示地址,将在第1行第1列开始显示 WriteData('v'); //将字符常量v写入LCD WriteData('='); //将字符常量=写入LCD } /****************************************************************************** 函数功能:显示速度数值 ******************************************************************************/ void display_val(unsigned int x) { unsigned char i,j,k,l; //j,k,l分别储存温度的百位、十位和个位 i=x/1000; //取千位 j=(x%1000)/100; //取百位 k=(x%100)/10; //取十位 l=x%10; //取个位 WriteAddress(0x02); //写显示地址,将在第1行第3列开始显示 WriteData(digit[i]); //将千位数字的字符常量写入LCD WriteData(digit[j]); //将百位数字的字符常量写入LCD WriteData(digit[k]); //将十位数字的字符常量写入LCD WriteData(digit[l]); //将个位数字的字符常量写入LCD } /******************************************************* 函数功能:显示速度单位“r/min” ********************************************************/ void display_unit(void) { WriteAddress(0x06); //写显示地址,将在第2行第7列开始显示 WriteData('r'); //将字符常量r写入LCD WriteData('/'); //将字符常量/写入LCD WriteData('m'); //将字符常量m写入LCD WriteData('i'); //将字符常量i写入LCD WriteData('n'); //将字符常量n写入LCD } /******************************************************* 函数功能:主函数 ********************************************************/ void main(void) { LcdInitiate(); //调用LCD初始化函数 TMOD=0x51; //定时器T1工作于计数模式1,定时器T0工作于计时模式1; TH0=(65536-46083)/256; //定时器T0的高8位设置初值,每50ms产生一次中断 TL0=(65536-46083)%256; //定时器T0的低8位设置初值,每50ms产生一次中断 EA=1; //开总中断 ET0=1; //定时器T0中断允许 TR0=1; //启动定时器T0 count=0; //将T0中断次数初始化为0 display_sym(); //显示速度提示符 display_val(0000); //显示器工作正常标志 display_unit(); //显示速度单位 while(1) //无限循环 { TR1=1; //定时器T1启动 TH1=0; //定时器T1高8位赋初值0 TL1=0; //定时器T1低8位赋初值0 flag=0; //时间还未满1分钟 while(flag==0) //时间未满等待 ; v=(TH1*256+TL1)*60/16; //计算速度,每周产生16个脉冲 display_val(v); //显示速度 } } /******************************************************* 函数功能:定时器T0的中断服务函数 ********************************************************/ void Time0(void ) interrupt 1 using 1 //定时器T0的中断编号为1,使用第1组工作寄存器 { count++; //T0每中断1次,count加1 if(count==20) //若累计满20次,即计满1秒钟 { flag=1; //计满1秒钟标志位置1 count=0; //清0,重新统计中断次数 } TH0=(65536-46083)/256; //定时器T0高8位重新赋初值 TL0=(65536-46083)%256; //定时器T0低8位重新赋初值 } /******************************************************************** 结束 *********************************************************************/ /******************************************************************** 汇诚科技 实现功能:传感器判断程序 使用芯片:ATS52 晶振:11.0592MHZ 波特率:9600 编译环境:Keil 作者:zhangxinchun *********************************************************************/ /******************************************************************** *************************程序说明************************************ 1、VCC接电源正极 2、GND接电源负极 3、OUT接单片机P2.0口 功能简介:当传感器接收到信号时,传感器输出低电平,单片机IO口P2.0检测到信号后,单片机IO口P1.0输出低电平 *********************************************************************/ #include #define uchar unsigned char//宏定义无符号字符型 #define uint unsigned int //宏定义无符号整型 /******************************************************************** I/O定义 *********************************************************************/ sbit LED=P1^0; //定义单片机P1口的第1位 (即P1.0)为指示端 sbit OUT=P2^0; //定义单片机P2口的第1位 (即P2.0)为传感器输出信号的输入端 /******************************************************************** 主函数 *********************************************************************/ void main() { while(1) //无限循环 { LED=1; //熄灭P1.0口灯 if(OUT==0)//当传感器检测到磁场时 ,执行条件函数 { LED=0; //点亮P1.0口灯 while(!OUT); } } } /******************************************************************** 结束 *********************************************************************/ /******************************************************************** 实现功能:霍尔传感器计数应用仿真程序 使用芯片:ATS52 晶振:11.0592MHZ 波特率:9600 编译环境:Keil 作者: *********************************************************************/ /******************************************************************** *************************程序说明************************************ 1、VCC接电源正极 2、GND接电源负极 3、OUT接单片机P3.2口 4、共阳数码管 功能简介: 当传感器检测到磁场信号时,传感器输出信号由高电平跳变到低电平 输出,单片机IO口P3.2检测到信号后,数码管显示P3.2口输入的计数。 *********************************************************************/ #include #define uchar unsigned char//宏定义无符号字符型 #define uint unsigned int //宏定义无符号整型 /******************************************************************** 初始定义 *********************************************************************/ code uchar seg7code[10]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //显示段码 数码管字跟 uchar wei[4]={0XEf,0XDf,0XBf,0X7f}; //位的控制端 uint display_date; /******************************************************************** 延时函数 *********************************************************************/ void delay(uchar t) { uchar i,j; } /******************************************************************** 显示函数 void Led(int date) //显示函数 { /*****************数据转换*****************************/ uint z,x,c,v; z=date/1000; 求千位 x=date%1000/100; 求百位 c=date%100/10; 求十位 v=date%10; 求个位 } /************************************************************************* 中断函数外部中断0 **************************************************************************/ void ExtInt0() interrupt 0 //中断服务程序 { dispcount++; //每按一次中断按键,计数加一 if (dispcount==9999) //计数范围0-9999 {dispcount=0;} } /******************************************************************** 主函数 *********************************************************************/ void main() { { TCON=0x01; //中断设置 IE=0x81; while(1) { display_date=dispcount; //定义并赋值要显示的数据 Led(display_date);//调用显示函数显示数据display_date } } } /******************************************************************** 结束 *********************************************************************/ /******************************************************************** 实现功能:霍尔传感器测量电机每分钟转的圈数应用仿真程序 使用芯片:ATS52 晶振:11.0592MHZ 波特率:9600 编译环境:Keil 作者: *********************************************************************/ /******************************************************************** *************************程序说明************************************ 1、VCC接电源正极 2、GND接电源负极 3、OUT接单片机P3.5口 4、共阳数码管 功能简介: 当传感器检测到磁场信号时,传感器输出信号由高电平跳变到低电平 输出,单片机记录电机每秒转的圈数,然后乘以60计数出每分钟的圈数。 *********************************************************************/ #include #define uchar unsigned char//宏定义无符号字符型 #define uint unsigned int //宏定义无符号整型 /******************************************************************** 初始定义 *********************************************************************/ code uchar seg7code[10]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //显示段码 数码管字跟 uchar wei[4]={0XEf,0XDf,0XBf,0X7f}; //位的控制端 uint display_date; uint dispcount; b计满1秒钟标志位 u储存电机每分钟的圈数 unsigned char count; //储存定时器T0中断次数 /******************************************************************** 延时函数 *********************************************************************/ void delay(uchar t) { uchar i,j; } /******************************************************************** 显示函数 void Led(int date) //显示函数 { /*****************数据转换*****************************/ uint z,x,c,v; z=date/1000; 求千位 x=date%1000/100; 求百位 c=date%100/10; 求十位 v=date%10; 求个位 } /******************************************************* 函数功能:主函数 ********************************************************/ void main(void) { TMOD=0x51; //定时器T1工作于计数模式1,定时器T0工作于计时模式1; 定时器T0的高8位设置初值,每50ms产生一次中断 定时器T0的低8位设置初值,每50ms产生一次中断 开总中断 定时器T0中断允许 启动定时器T0 将T0中断次数初始化为0 定时器T1启动 定时器T1高8位赋初值0 定时器T1低8位赋初值0 无限循环 定义并赋值要显示的数据 调用显示函数显示数据display_date } } /******************************************************* 函数功能:定时器T0的中断服务函数 ********************************************************/ void Time0(void ) interrupt 1 using 1 //定时器T0的中断编号为1,使用第1组工作寄存器 { count++; //T0每中断1次,count加1 若累计满20次,即计满1秒钟 计算每分钟圈数,每周产生8个脉冲 (记录1秒钟的信号数,乘以60秒即,每分钟的脉冲数,由于电机转一周输入八个信号,除以8即测出每分钟的圈数) /*********注意上一行的8,是电机转盘一周的磁铁数量,如果只有一个磁铁就改成1,如果16个就改成16,磁铁越多精度越高。********/ 清0,重新统计中断次数 将圈数值赋予显示函数 定时器T1高8位赋初值0 TL1=0; //定时器T1低8位赋初值0 TH0=(65536-46083)/256; //定时器T0高8位重新赋初值 定时器T0低8位重新赋初值 } /******************************************************************** 结束 *********************************************************************/ /******************************************************************** 实现功能:霍尔传感器测量电机每分钟转的圈数应用仿真程序 使用芯片:ATS52 晶振:11.0592MHZ 波特率:9600 编译环境:Keil 作者: *********************************************************************/ /******************************************************************** *************************程序说明************************************ 1、VCC接电源正极 2、GND接电源负极 3、OUT接单片机P3.5口 4、共阳数码管 功能简介: 当传感器检测到磁场信号时,传感器输出信号由高电平跳变到低电平 输出,单片机记录电机每秒转的圈数,然后乘以60计数出每分钟的圈数。 *********************************************************************/ #包含单片机寄存器的头文件 #include s寄存器选择位,将RS位定义为P2.0引脚 s读写选择位,将RW位定义为P2.1引脚 s使能信号位,将E位定义为P2.2引脚 s忙碌标志位,将BF位定义为P0.7引脚 unsigned char code digit[ ]={"01234567"}; //定义字符数组显示数字 u储存电机转速 unsigned char count; //储存定时器T0中断次数 b计满1秒钟标志位 /***************************************************** 函数功能:延时1ms (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒 ***************************************************/ void delay1ms() { } /***************************************************** 函数功能:延时若干毫秒 入口参数:n ***************************************************/ void delay(unsigned char n) { } /***************************************************** 函数功能:判断液晶模块的忙碌状态 返回值:result。result=1,忙碌;result=0,不忙 ***************************************************/ unsigned char BusyTest(void) { 根据规定,RS为低电平,RW为高电平时,可以读状态 E=1; //E=1,才允许读写 _nop_(); //空操作 _nop_(); //空操作四个机器周期,给硬件反应时间 将忙碌标志电平赋给result E=0; //将E恢复低电平 } /***************************************************** 函数功能:将模式设置指令或显示地址写入液晶模块 入口参数:dictate ***************************************************/ void WriteInstruction (unsigned char dictate) 如果忙就等待 根据规定,RS和R/W同时为低电平时,可以写入指令 置低电平(根据表8-6,写指令时,E为高脉冲, 就是让E从0到1发生正跳变,所以应先置"0" 空操作两个机器周期,给硬件反应时间 将数据送入P0口,即写入指令或地址 空操作四个机器周期,给硬件反应时间 置高电平 空操作四个机器周期,给硬件反应时间 当E由高电平跳变成低电平时,液晶模块开始执行命令 } /***************************************************** 函数功能:指定字符显示的实际地址 入口参数:x ***************************************************/ void WriteAddress(unsigned char x) { 显示位置的确定方法规定为"80H+地址码x" } /***************************************************** 函数功能:将数据(字符的标准ASCII码)写入液晶模块 入口参数:y(为字符常量) ***************************************************/ void WriteData(unsigned char y) { 为高电平,RW为低电平时,可以写入数据 置低电平(根据表8-6,写指令时,E为高脉冲, 就是让E从0到1发生正跳变,所以应先置"0" 将数据送入P0口,即将数据写入液晶模块 _nop_(); //空操作四个机器周期,给硬件反应时间 置高电平 空操作四个机器周期,给硬件反应时间 当E由高电平跳变成低电平时,液晶模块开始执行命令 } /***************************************************** 函数功能:对LCD的显示模式进行初始化设置 ***************************************************/ void LcdInitiate(void) { delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间 显示模式设置:16×2显示,5×7点阵,8位数据接口 延时5ms ,给硬件一点反应时间 连续三次,确保初始化成功 显示模式设置:显示开,无光标,光标不闪烁 显示模式设置:光标右移,字符不移 清屏幕指令,将以前的显示内容清除 } /****************************************************************************** 函数功能:显示速度提示符 ******************************************************************************/ void display_sym(void) { 写显示地址,将在第1行第1列开始显示 将字符常量v写入LCD 将字符常量=写入LCD } /****************************************************************************** 函数功能:显示速度数值 ******************************************************************************/ void display_val(unsigned int x) { 分别储存温度的百位、十位和个位 取千位 取百位 k=(x%100)/10; //取十位 l=x%10; //取个位 写显示地址,将在第1行第3列开始显示 将千位数字的字符常量写入LCD 将百位数字的字符常量写入LCD 将十位数字的字符常量写入LCD 将个位数字的字符常量写入LCD } /******************************************************* 函数功能:显示速度单位“r/min” ********************************************************/ void display_unit(void) { WriteAddress(0x06); //写显示地址,将在第2行第7列开始显示 将字符常量r写入LCD 将字符常量/写入LCD 将字符常量m写入LCD 将字符常量i写入LCD 将字符常量n写入LCD } /******************************************************* 函数功能:主函数 ********************************************************/ void main(void) { LcdInitiate(); //调用LCD初始化函数 TMOD=0x51; //定时器T1工作于计数模式1,定时器T0工作于计时模式1; 定时器T0的高8位设置初值,每50ms产生一次中断 定时器T0的低8位设置初值,每50ms产生一次中断 开总中断 定时器T0中断允许 启动定时器T0 将T0中断次数初始化为0 显示速度提示符 显示器工作正常标志 显示速度单位 无限循环 定时器T1启动 定时器T1高8位赋初值0 定时器T1低8位赋初值0 时间还未满1分钟 时间未满等待 计算速度,每周产生16个脉冲 显示速度 } /******************************************************* 函数功能:定时器T0的中断服务函数 ********************************************************/ void Time0(void ) interrupt 1 using 1 //定时器T0的中断编号为1,使用第1组工作寄存器 { count++; //T0每中断1次,count加1 若累计满20次,即计满1秒钟 flag=1; //计满1秒钟标志位置1 清0,重新统计中断次数 TH0=(65536-46083)/256; //定时器T0高8位重新赋初值 定时器T0低8位重新赋初值 } /******************************************************************** 结束 *********************************************************************/