用单片机测速
基于单片机的测速仪的设计与实现

基于单片机的测速仪的设计与实现在现代科技飞速发展的时代,测速仪在各个领域都有着广泛的应用,比如交通管理、工业生产、运动竞技等。
而基于单片机的测速仪因其成本低、性能稳定、易于实现等优点,成为了测速领域的重要研究方向。
一、测速仪的工作原理要理解基于单片机的测速仪的设计,首先需要了解其工作原理。
常见的测速方法有多种,如激光测速、雷达测速、编码器测速等。
在本次设计中,我们采用了编码器测速的方法。
编码器是一种能够将机械运动转换为电信号的装置。
当被测物体运动时,带动编码器旋转,编码器会输出一系列的脉冲信号。
通过测量这些脉冲信号的频率,就可以计算出被测物体的速度。
二、单片机的选择单片机是整个测速仪的核心控制单元,其性能直接影响到测速仪的准确性和稳定性。
在众多的单片机型号中,我们选择了 STM32 系列单片机。
STM32 单片机具有高性能、低功耗、丰富的外设资源等优点,能够满足测速仪的设计需求。
三、硬件电路设计硬件电路设计是测速仪实现的基础。
主要包括以下几个部分:1、传感器接口电路用于连接编码器,将编码器输出的脉冲信号传输给单片机。
2、单片机最小系统包括单片机芯片、时钟电路、复位电路等,为单片机的正常工作提供必要的条件。
3、显示电路用于显示测量到的速度值,可以选择液晶显示屏(LCD)或者数码管。
4、电源电路为整个系统提供稳定的电源。
四、软件设计软件设计是测速仪实现功能的关键。
主要包括以下几个步骤:1、初始化设置对单片机的各个外设进行初始化,如定时器、中断等。
2、脉冲信号采集通过定时器捕获编码器输出的脉冲信号,并计算脉冲的频率。
3、速度计算根据脉冲频率和编码器的参数,计算出被测物体的速度。
4、显示输出将计算得到的速度值通过显示电路进行显示。
五、系统调试在完成硬件和软件设计后,需要对整个系统进行调试。
调试过程中,可能会遇到各种问题,如脉冲信号丢失、速度计算不准确、显示异常等。
针对这些问题,需要仔细分析,逐步排查,找出问题的根源,并进行相应的修改和优化。
单片机实验-单片机速度测量及控制实验

单片机速度测量及控制实验姓名:徐晨学号:5130208383 班级:F1302014 小组成员:王林涛赵路杰一、实验目的综合应用,进一步掌握定时器计数器的使用,完成转速测量;全面掌握闭环控制原理,用PWM调制方式控制电机转速。
二、实验分工小组成员共同完成单片机的编程与调试工作。
三、实验设备清单、接线图、原理图1、实验器材:51单片机控制板,BCD拨码盘,电机驱动及转侧测量电路2、51单片机电路3、转速控制电路4、BCD拨码盘电路四、实验内容及过程1、实时转速测量及显示。
(每秒的转速)2、用2位拨码盘设定目标转速(每秒转速),实现PWM的电机调速控制。
数码管分别显示转速设定值和实时测量值(每秒转速)。
五、编程说明1、四位数码管采用静态显示方式。
数码管为共阳极2、转速传感器采用光电式传感器,输出为脉冲信号,已接到定时计数器T0。
建议T1定时,T0计数,计算1秒钟的脉冲个数,就可以简单的测量出转速值。
3、PWM脉宽调制方式,通过编程改变高低电平的占空比,从而调整电机的平均电压,以达到调速的目的。
由P1.5输出控制。
序号电路名称器件名称地址号备注1 LED显示U16(74LS273)7FF8H 写输出2 U17(74LS273)7FF9H3 U18(74LS273)7FFAH4 U19(74LS273)7FFBH5 继电器与指示灯U30、U31(74LS175)7FFCH6 A/D转换电路U12(ADC0809)DFF8H 通道0,读写7 DFF9H 通道1,读写8 DFFAH 通道2,读写9 DFFBH 通道3,读写10 DFFCH 通道4,读写11 DFFDH 通道5,读写12 DFFEH 通道6,读写13 DFFFH 通道7,读写14 D/A转换电路U10(DAC0832)EFFFH 写输出15 BCD拨码盘U4(74LS244)BFFFH 读输入5、程序框图6、控制程序LED1 EQU 30HLED2 EQU 31HLED3 EQU 32HLED4 EQU 33H电机驱动直流电机转速测量单片机PWM输出PC机SETL EQU 34HSETH EQU 35HREALL EQU 36HREALH EQU 37HAIM EQU 38H ;目标目标速度REAL EQU 39H ;真实速度ONEMSECOND EQU 3AHPWMH EQU 3BHPWML EQU 3CHTEMP EQU 3DHSUBC EQU 3EHORG 0000HLJMP BEGINORG 001BHLJMP INTERT1ORG 0060HBEGIN:SETB EASETB ET1SETB TR1MOV TMOD,#15H; 设置计数器0方式2,计时器1方式1 MOV TH0,#00H;MOV TL0,#00H;MOV TH1,#4CHMOV TL1,#00H;MOV R7,#20MOV PWMH,#15MOV PWML,#15MAIN:LCALL READ_BCD;LCALL RUNPWM;LCALL DISPLAY;LCALL ADJUSTPWM;AJMP MAINRUNPWM:MOV TEMP,PWMHPWMON:SETB P1.5LCALL DELAY1MSDJNZ PWMH,PWMONMOV PWMH,TEMPPWMOFF:MOV TEMP,PWMLCLR P1.5LCALL DELAY1MSDJNZ PWML,PWMOFFMOV PWML,TEMPRETADJUSTPWM:MOV A,AIMCLR CYSUBB A,REALJC OVERSPEED BELOWSPEED:CLR CYMOV A,PWMHSUBB A,#1MOV PWMH,AMOV A,PWMLADD A,#1MOV PWML,ARETERROR1:MOV A,TEMPMOV B,#2DIV ABMOV TEMP,AMOV A,PWMHADD A,TEMPMOV PWMH,AMOV A,PWMLSUBB A,TEMPMOV PWML,ARETOVERSPEED:MOV A,PWMLCLR CYSUBB A,#1MOV PWML,AMOV A,PWMHADD A,#1MOV PWMH,ARETERROR2:MOV A,TEMPMOV B,#2DIV ABMOV TEMP,AMOV A,PWMHSUBB A,TEMPMOV PWMH,AMOV A,PWMLADD A,TEMPMOV PWML,ARETINTERT1:MOV TH1,#4CHMOV TL1,#00HDJNZ R7,NEXTCLR TR1CLR TR0MOV REAL,TL0MOV TH0,#00HMOV TL0,#00HSETB TR0MOV R7,#20NEXT:SETB TR1RETIREAD_BCD:SETB P1.7 ;选择BCD相关数码MOV DPTR,#0BFFFHMOVX A,@DPTRCPL AMOV R0,AANL A,#0FHMOV SETL,AMOV A,R0SWAP AANL A,#0FHMOV SETH,AMOV LED2,SETLMOV LED1,SETH ;设定速度的十位在SETH,个位在LEDH MOV B,#10MOV A,SETHMUL ABADD A,SETL ;MOV AIM,A ;设定温度值存在AIM中RETDISPLAY: ;显示程序MOV A,LED1ANL A,#0FHMOV DPTR,#DSEG1MOVC A,@A+DPTRMOV DPTR,#7FFBHMOVX @DPTR,AMOV A,LED2ANL A,#0FHMOV DPTR,#DSEG1MOVC A,@A+DPTRMOV DPTR,#7FFAHMOVX @DPTR,AMOV A,REALMOV B,#10DIV ABMOV REALH,AMOV REALL,BMOV A,REALHANL A,#0FHMOV DPTR,#DSEG1MOVC A,@A+DPTRMOV DPTR,#7FF9HMOVX @DPTR,AMOV A,REALLANL A,#0FHMOV DPTR,#DSEG1MOVC A,@A+DPTRMOV DPTR,#7FF8HMOVX @DPTR,ARETDSEG1:DB 0C0H,0F9H,0A4H,0B0HDB 99H,92H,82H,0F8HDB 80H,90H,88H,83HDB 0C6H,0A1H,86H,8EHDELAY1MS:MOV ONEMSECOND,#0FFH ;DJNZ ONEMSECOND,$RETEND六、实验结果与分析通过设计合适的程序,完成了转速读取与控制的要求,每秒转速控制波动范围在2转左右,实现了较好的控制效果。
单片机测速_毕业设计1111

摘要随着科技的迅速发展,单片机的应用也越来越广泛,并带动传统控制检测技术不断更新。
现在的车速表大多是电子式的,用LED数码管或LCD即时显示,显示更加直观。
电子式车速表采用接触车速传感器代替软轴传动,可使车速表的安装位置不受距离限制,进一步有效地克服了机械式车速表中的诸多不足。
本次设计给出了以AT89S51为核心,利用单片机的运算和控制功能,并采用系统化LCD显示模块实时显示所测速度的设计方案以及系统软件。
该方案由于使用了LCD显示模块,以及高效快速算法,因而可在节约系统资源和简化程序设计的基础上保证测量精度和系统实时性。
速度显示部分采用LCD显示, 因而节省了所需单片机的口线和外围器件, 同时也简化了显示部分的软件编程。
案实现了电动车速度即时显示。
关键词:单片机;霍尔传感器;LCD显示AbstractAlong with the quick development of science and technology, the application of SCM and more extensive, drive traditional control test technology constantly updated. Now the speed table is mostly electronic, use LED digital tube or LCD instantly shows, show more intuitive. Electronic speed table by using the contact speed sensor instead of soft shaft transmission speed table, can make the installation position of not affected by distance limit, further effectively overcome the speed to the table of mechanical some shortcomings.This design is given based on AT89S51 as the core, of the microcontroller calculation and control function, and by using the systematic LCD display module real-time display measured the speed of design program and system software.The scheme by using LCD display module, and quick and efficient algorithm, thus in saving system resources and simplify programming based on guarantee measuring precision and real-time system. Speed shows part adopts LCD display, thereby saving the required microcontroller mouth lines and peripheral equipments, simultaneously also simplifies shows part of the software programming. Case realized the electric car speed instantly shows.Keywords: SCM, Hall sensors; LCD display目录摘要 (I)Abstract ..................... 错误!未定义书签。
单片机测速仪的设计.

单片机测速仪的设计.《单片机测速仪的设计》一、测速仪的工作原理单片机测速仪的工作原理通常基于对运动物体所产生的脉冲信号的计数和时间测量。
常见的测速方法有光电测速、霍尔效应测速等。
以光电测速为例,在被测物体上安装一个遮光板,当遮光板随物体转动时,会周期性地遮挡光电传感器。
光电传感器将光信号转换为电信号,产生一系列脉冲。
单片机通过对这些脉冲的计数,并结合测量的时间间隔,就可以计算出物体的转速。
二、硬件设计1、传感器选择光电传感器:具有响应速度快、精度高的特点,但容易受到环境光的干扰。
霍尔传感器:对磁场变化敏感,适用于测量磁性物体的速度,抗干扰能力较强。
2、单片机选型考虑因素包括处理速度、存储容量、引脚数量等。
常见的单片机如STM32、Arduino 等都可以满足测速仪的需求。
3、信号调理电路由于传感器输出的信号可能比较微弱或存在干扰,需要通过放大、滤波等电路进行处理,以获得清晰、稳定的脉冲信号。
4、显示模块可以选择液晶显示屏(LCD)或数码管来显示测量结果。
LCD 显示内容丰富,但成本较高;数码管简单直观,成本较低。
5、电源模块为整个系统提供稳定的电源,通常采用直流稳压电源或电池供电。
三、软件设计1、初始化设置包括单片机的时钟设置、引脚配置、中断设置等。
2、脉冲计数与时间测量使用单片机的计数器功能对脉冲进行计数,并通过定时器测量时间间隔。
3、速度计算算法根据脉冲计数和时间间隔,按照预定的公式计算出速度值。
4、显示驱动程序将计算得到的速度值发送到显示模块进行显示。
四、系统调试1、硬件调试检查电路连接是否正确,电源是否稳定,传感器输出信号是否正常。
2、软件调试使用调试工具,如串口调试助手,查看单片机内部变量的值,检查程序逻辑是否正确。
3、综合调试将硬件和软件结合起来,对整个测速仪系统进行测试,不断优化和改进。
五、误差分析与改进1、误差来源传感器精度误差、信号干扰、时间测量误差等。
2、改进措施采用高精度传感器、优化信号调理电路、提高时间测量精度等。
基于51单片机和霍尔传感器的测速

基于51单片机和霍尔传感器的测速1. 小项目简介主要采用stc89c51/52单片机作为主控,由霍尔传感器作为测速的基本模块,采用按键控制速度快慢,数码管显示当前速度。
最后成品图如下:2.电源部分1.电源供电的功率尽可能的稍微大一些,我是采用罗马仕充电宝供电(5V,2.1A输出口)。
因为电源功率过小,将造成电机无法带动,或者数码管闪烁等硬件上的bug。
2.如果电源的电压高于5V,需要在电源输入端使用一个稳压电路,将输入电压稳压到5V给单片机,和其他外设供电。
防止电压过高造成器件损坏。
3.硬件部分1. stc89c51/52的最小系统注意:如果使用一般的USB接口供电,当电机转动时候,可能照成单片机的管脚供电不稳定,所以需要在单片机的IO的外接上拉排阻。
P3口不需要。
9针排阻如下:有小点的一端是公共端,需要和电源5V连接,其余口和单片机管脚一一对应焊接就行。
2. 霍尔传感器注意引脚,窄的一面来看引脚顺序:这里的VOUT口可以直接连接单片机的外部中断1口,可以经过一个电压比较器lm393之类的在给单片机。
3. 直流电机马达驱动51单片机的IO口输出的电流过小,驱动直流电机马达效果不明显,达不到后期变速,需要使用一个三极管(9015\9013这类都可以)放大电路去驱动马达:示范电路如下:(电阻根据自己需要修改)4. 共阴数码管//数码管位选sbit S1=P2^4;sbit S2=P2^5;sbit S3=P2^6;sbit S4=P2^7;//数码管段选:P1的八个IO口。
连线的时候一定根据下列图示的段选(注意注意注意:容易连错)4.软件部分1.软件工程整体图:2.main.c文件代码:自己创建一个51单片机的keil工程文件,将下面代码拷贝到自己工程文件下的main.c文件替换即可/************************************************************** ************************* 基于51单片机测速* 实现现象:按下按键K1减速按下按键K2加速外部中断1对应IO口P3^3注意事项:电机速度不能过快,否则会造成数码管显示不稳定*************************************************************** ************************/#include 'reg52.h' //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16; //对数据类型进行声明定义typedef unsigned char u8;//测试端口(根据自己需要决定)sbit led=P0^0; //将单片机的P0.0端口定义为led/************************************************************** ****************************************************核心部分**************************************************************************************************************** ************************///占空比u16 time = 0; // 定义占空比的变量u16 count=30; //定义占空比上限sbit PWM=P0^1;// P0.1输出pwm//速度u16 zhuansu=0; //转速初值为0u16 jishu = 0; //jishu的变量初值为0u8 flag = 0; //定时器1计数变量//按键sbit k1=P2^0;sbit k2=P2^1;sbit k3=P2^2;sbit k4=P2^3;//数码管位选sbit S1=P2^4;sbit S2=P2^5;sbit S3=P2^6;sbit S4=P2^7;//数码管位选:P1的八个IO口//共阴数码管段选u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值//数码管存储中间变量unsigned char Display_data[4];/************************************************************** ****************** 函数名 : delay* 函数功能 : 延时函数,i=1时,大约延时10us*************************************************************** ****************/void delay(u16 i){while(i--);}//定时器和外部中断1的初始化函数void InitSyetem(){//配置外部中断1:采集霍尔传感器触发下降沿IT1 = 1; //选择下降沿触发EX1 = 1; //打开外部中断1//定时器0,1工作方式1TMOD=0x11; //定时或者计数模式控制寄存器//定时器0配置:产生PWM波TH0=(65536-10)/256;//赋初值定时10usTL0=(65536-10)%256;//sET0=1;//开定时器0中断TR0=1;//启动定时器0//定时1:测速TH1=(65536-10000)/256;//赋初值定时10msTL1=(65536-10000)%256;ET1=1;//开定时器0中断TR1=1;//启动定时器0PX1=1;//设置优先级PT1=1;//设定定时器1为最高优先级EA=1;//开总中断}//外部1中断服务函数void Service_Int1() interrupt 2{jishu++; //霍尔下降沿一次就记一次数if(jishu == 100) //累加计数有100次,总时间为100 * 10ms = 1s{led^=led; //led闪烁}}//定时0处理函数产生PWM 调速原理———在PWM高电平时候驱动电机转动在PWM低电平时候让电机停止转动void Service_Timer0() interrupt 1{TR0=0;//赋初值时,关闭定时器TH0=(65536-10)/256;//赋初值定时TL0=(65536-10)%256;//0.01msTR0=1;time++; //计数变量if(time>=100) time= 0; //清零标志变量if(time<=count) //小于设定值,输出高电平{PWM = 1;}elsePWM = 0;}//定时器1中断处理显示转速void Service_Timer1() interrupt 3{TR1=0;//赋初值时,关闭定时器TH1=(65536 - 10000) / 256;TL1=(65536 - 10000) % 256;//定时10msTR1=1;flag++; //计数变量加if(flag==100) //计时到达1s 测量此时的转速{// led=~led; //led状态取反zhuansu = jishu; //监测霍尔传感器总共计数次数jishu=0; //转速置0flag=0; //清除计数变量}}//数码管处理函数void Deal_data(){Display_data[3]=smgduan[zhuansu/1000]; //数码管高位Display_data[2]=smgduan[zhuansu/100%10];//去第二位Display_data[1]=smgduan[zhuansu/10%10];Display_data[0]=smgduan[zhuansu%10]; //数码管低位}/************************************************************** ****************** 函数名 : DigDisplay* 函数功能 : 数码管动态扫描函数,循环扫描4个数码管显示*******************************************************************************/void DigDisplay(){u8 i;for(i=0;i<4;i++){switch(i) //位选,选择点亮的数码管,{case 0 : S1 = 0; S2 = 1; S3 = 1; S4 = 1;break; //点亮第一位数码管case 1 : S2 = 0; S1 = 1; S3 = 1; S4 = 1;break;case 2 : S3 = 0; S1 = 1; S2 = 1; S4 = 1;break;case 3 : S4 = 0; S1 = 1; S2 = 1; S3 = 1;break;}P1=Display_data[i];//发送段码delay(5); //间隔一段时间扫描时间越少,一起亮且显示越稳定;时间越多,是流水点亮P1=0x00;//消隐时间过快时,每个数码管将会有重影}}/************************************************************** ****************** 函数名 : keypros* 函数功能 : 按键处理函数,判断按键K1是否按下*************************************************************** ****************/void keypros(){if(k1==0) //检测按键K1是否按下{delay(100); //消除抖动一般大约10ms 时间的估算100*n=1(s) if(k1==0) //再次判断按键是否按下{led=~led; //led状态取反count+=10;if(count >= 90) //设置一个上限count+=90;}while(!k1); //检测按键是否松开为假时候说明按键没有释放}if(k2==0) //检测按键K1是否按下{delay(100); //消除抖动一般大约10msif(k2==0) //再次判断按键是否按下{led=~led; //led状态取反count-=10;if(count <= 10){count = 10;}}while(!k2); //检测按键是否松开}}/************************************************************** ****************** 函数名 : main* 函数功能 : 主函数* 输入 : 无* 输出 : 无*************************************************************** ****************/void main(){led = 0; //上电熄灭小灯P1 = 0x00; //上电初始化熄灭数码管InitSyetem();//定时器和外部中断1的初始化函数while(1){keypros(); //按键处理函数Deal_data(); //数据处理函数DigDisplay(); //数码管显示函数}}。
基于单片机软件实现直流电机PWM以及电机测速

基于单片机软件实现直流电机PWM以及电机测速叶祥祥温州大学物理与电子信息学院一、摘要利用AT89C51设计一个直流电机的软件模拟PWM驱动及测速系统。
单片机读取键盘值来设定转速和正反转,并且通过红外对管来测量转速。
本系统具有精度高,成本低,使用方便等优点。
关键词:AT89C51;PWM;测速。
引言随着社会的发展,各种智能化的产品日益走入寻常百姓家。
为了实现产品的便携性、低成品以及对电源的限制,小型直流电机应用相当广泛。
对直流电机的速度调节,我们可以采用多种办法,本文给出一种用单片机软件实现PWM调速的方法及红外对管测转速。
二、直流电机调速知道通过调节直流电机的电压可以改变电机的转速,但是一般我们设计的电源大都是固定的电压,而且模拟可调电源不易于单片机控制,数字可调电源设计麻烦。
所以这里用脉宽调制(PWM)来实现调速。
方波的有效电压跟电压幅值和占空比有关,我们可以通过站空比实现改变有效电压。
一般用软件模拟PWM可以有延时和定时两种方法,延时方法占用大量的CPU,所以这里采用定时方法。
三、直流电机旋转方向一般利用H桥电路来实现调速。
H桥驱动电路:图4.12中所示为一个典型的直流电机控制电路。
电路得名于“H桥驱动电路”是因为它的形状酷似字母H。
4个三极管组成H的4条垂直腿,而电机就是H中的横杠(注意:图4.12及随后的两个图都只是示意图,而不是完整的电路图,其中三极管的驱动电路没有画出来)。
如图所示,H桥式电机驱动电路包括4个三极管和一个电机。
要使电机运转,必须导通对角线上的一对三极管。
根据不同三极管对的导通情况,电流可能会从左至右或从右至左流过电机,从而控制电机的转向。
图4.12 H桥驱动电路要使电机运转,必须使对角线上的一对三极管导通。
例如,如图4.13所示,当Q1管和Q4管导通时,电流就从电源正极经Q1从左至右穿过电机,然后再经Q4回到电源负极。
按图中电流箭头所示,该流向的电流将驱动电机顺时针转动。
单片机51测速程序

//实例 100:电机转速表设计#include<reg51.h> // 包含单片机寄存器的头文件#include<intrins.h> //包含 _nop_() 函数定义的头文件sbit RS=P2A0; sbit RW=P2A1; sbit E=P2A2; II寄存器选择位,将 RS位定义为P2.0引脚〃读写选择位,将 RW位定义为P2.1引脚II使能信号位,将E位定义为P2.2引脚sbit BF=P0A7; II忙碌标志位,,将BF位定义为P0.7引脚unsigned char code digit[ ]={"0123456789"}; // 定义字符数组显示数字 un sig ned in t v;II储存电机转速unsigned char count; 〃储存定时器TO中断次数bit flag; //计满1秒钟标志位***************************************************函数功能:延时 1ms (3j+2)*i=(3 X 33+2) X 10=1010(微秒),可以认为是 1 毫秒***************************************************/ void delay1ms(){unsigned char i,j; for(i=0;i<10;i++) for(j=0;j<33;j++)}I*****************************************************函数功能:延时若干毫秒入口参数: n***************************************************Ivoid delay(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}I*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。
51单片机-红外点滴测速程序

51单片机-红外点滴测速程序#include#define uint unsigned int#define uchar unsigned charsbit beep = P1^0;sbit dula = P3^6;sbit wela = P3^7;uchar qian,bai,shi,ge;uint speed = 0,speed_tmp = 0;uint num0,num1;uchar time_out = 0;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar code tablewe[]={0xfe,0xfd,0xfb,0xf7};void init();void delayms(uint);void display(uchar qian,uchar bai,uchar shi,uchar ge); void main(){init();while(1){display(qian,bai,shi,ge);if(time_out == 1){speed_tmp = speed * 12; //每分钟的点滴数目等于每5秒的数目乘以12speed = 0;qian = 0;bai = speed_tmp/100;shi = (speed_tmp%100)/10;ge = speed_tmp%10;// speed = 0; //点滴数目清?time_out = 0;}}}void init(){TMOD = 0x11; //设置定时器0和1为工作方式1(0001 0001)TH0 = (65536-45872)/256; //装初值TL0 = (65536-45872)%256;TH1 = (65536-45872)/256;TL1 = (65536-45872)%256;EA = 1; //开总中断ET0 = 1; //开定时器0中断ET1 = 1; //开定时器1中断EX0 = 1; //开外部中断0EX1 = 1; //开外部中断1TR0 = 1; //启动定时器0TR1 = 1; //启动定时器1IT0 = 1; //外部中断0低电平触发IT1 = 0; //外部中断1低电平触发beep = 1; //关闭蜂鸣器}/******************************外部中断0 P3^2 **********************************************/void Int0() interrupt 0 //点滴检测部分,能触发中断,说明有点滴滴下{EX0 = 0; //开外部中断0num1 = 0; //计数器1清零speed ++; //点滴数目加1EX0 = 1; //开外部中断0delayms(1);}/******************************外部中断 1 P3^3 **********************************************/void Int1() interrupt 2 //液面检测部分{EX1 = 0; //开外部中断0beep = 0; //如果触发外部中断,即检测脚为低电平,低于检测液面,蜂鸣器报警EX1 = 1; //开外部中断0}/******************************定时器中断0**********************************************/void T0_time() interrupt 1{TH0 = (65536-45872)/256; //装初值TL0 = (65536-45872)%256;num0 ++;if(num0 == 40) //每隔2s测一次点滴数{num0 = 0; //计数器0清零time_out = 1;}}/******************************定时器中断1**********************************************/void T1_time() interrupt 3{TH1 = (65536-45872)/256; //装初值TL1 = (65536-45872)%256;num1 ++;if(num1 == 60) //若3s时间到,还未检测到点滴滴下{beep = 0; //蜂鸣器报警}}void delayms(uint xms){uint i,j;for(i = xms;i > 0;i--)for(j = 110;j > 0;j--);}/******************************数码管显示函数**********************************************/void display(uchar qian,uchar bai,uchar shi,uchar ge){dula = 1;P0 = table[qian];dula = 0;wela = 1;P2 = tablewe[3];wela = 0;delayms(5); dula = 1;P0 = table[bai]; dula = 0;wela = 1;P2 = tablewe[2]; wela = 0; delayms(5); dula = 1;P0 = table[shi]; dula = 0;wela = 1;P2 = tablewe[1]; wela = 0; delayms(5); dula = 1;P0 = table[ge]; dula = 0;wela = 1;P2 = tablewe[0]; wela = 0; delayms(5);}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
测速是工农业生产中经常遇到的问题,学会使用单片机技术设计测速仪表具有很重要的意义。
要测速,首先要解决是采样的问题。
在使用模拟技术制作测速表时,常用测速发电机的方法,即将测速发电机的转轴与待测轴相连,测速发电机的电压高低反映了转速的高低。
使用单片机进行测速,可以使用简单的脉冲计数法。
只要转轴每旋转一周,产生一个或固定的多个脉冲,并将脉冲送入单片机中进行计数,即可获得转速的信息。
一、脉冲信号的获得可以有多种方式来获得脉冲信号,这些方法有各自的应用场合。
下面逐一进行分析。
1.霍尔传感器霍尔传感器是对磁敏感的传感元件,常用于开关信号采集的有CS3020、CS3040等,这种传感器是一个3端器件,外形与三极管相似,只要接上电源、地,即可工作,输出通常是集电极开路(OC)门输出,工作电压范围宽,使用非常方便。
如图1所示是CS3020的外形图,将有字面对准自己,三根引脚从左向右分别是Vcc,地,输出。
图1 CS3020外形图使用霍尔传感器获得脉冲信号,其机械结构也可以做得较为简单,只要在转轴的圆周上粘上一粒磁钢,让霍尔开关靠近磁钢,就有信号输出,转轴旋转时,就会不断地产生脉冲信号输出。
如果在圆周上粘上多粒磁钢,可以实现旋转一周,获得多个脉冲输出。
在粘磁钢时要注意,霍尔传感器对磁场方向敏感,粘之前可以先手动接近一下传感器,如果没有信号输出,可以换一个方向再试。
这种传感器不怕灰尘、油污,在工业现场应用广泛。
2.光电传感器光电传感器是应用非常广泛的一种器件,有各种各样的形式,如透射式、反射式等,基本的原理就是当发射管光照射到接收管时,接收管导通,反之关断。
以透射式为例,如图2所示,当不透光的物体挡住发射与接收之间的间隙时,开关管关断,否则打开。
为此,可以制作一个遮光叶片如图3所示,安装在转轴上,当扇叶经过时,产生脉冲信号。
当叶片数较多时,旋转一周可以获得多个脉冲信号。
图2光电传感器的原理图图3遮光叶片3.光电编码器光电编码器的工作原理与光电传感器一样,不过它已将光电传感器、电子电路、码盘等做成一个整体,只要用连轴器将光电传感器的轴与转轴相连,就能获得多种输出信号。
它广泛应用于数控机床、回转台、伺服传动、机器人、雷达、军事目标测定等需要检测角度的装置和设备中。
如图4所示,是某光电编码器的外形。
图4 成品光电编码器二、硬件连接测速的方法决定了测速信号的硬件连接,测速实际上就是测频,因此,频率测量的一些原则同样适用于测速。
通常,可以用计数法、测脉宽法和等精度法来进行测试。
所谓计数法,就是给定一个闸门时间,在闸门时间内计数输入的脉冲个数;测脉宽法是利用待测信号的脉宽来控制计数门,对一个高精度的高频计数信号进行计数。
由于闸门与被测信号不能同步,因此,这两种方法都存在±1误差的问题,第一种方法适用于信号频率高时使用,第二种方法则在信号频率低时使用。
等精度法则对高、低频信号都有很好的适应性。
这里为简化讨论,仅采用计数法来进行测试。
图5所示是测速器的电路图,由六位数码管和测速接口组成。
其中T0处接的只画了一只CS3020组成的霍尔传感器接线图,如果采用光电传感器接口也是一样的,读者可自行画出接线图。
图5测速计电路原理图三、软件编程测量转速,使用霍尔传感器,被测轴安装有12只磁钢,即转轴每转一周,产生12个脉冲,要求将转速值(转/分)显示在数码管上。
程序如下:DISPBUF EQU 5AH ;显示缓冲区从5AH开始[Page]SecCoun EQU 59HSpCoun EQU 57H ;速度计时器单元57H和58H,高位在前(57H单元中)Count EQU 56H ;显示时的计数器SpCalc bit 00h ;要求计算速度的标志Hidden EQU 16 ;消隐码ORG 0000HAJMP STARTORG 1BHJMP TIMER1 ;定时中断1入口ORG 30HSTART: MOV SP,#5FH ;设置堆栈MOV P1,#0FFHMOV P0,#0FFHMOV P2,#0FFH ;初始化,所有显示器、LED灭MOV TMOD,#00010101B ;定时器T1工作于方式1,定时器0工作方式 1 MOV TH1,#HIGH(65536-4000)MOV TL1,#LOW(65536-4000)SETB TR1SETB ET1 ;开定时器1中断SETB EALOOP: JNB SpCalc,LOOP ;如果未要求计算,转本身循环;标号:MULD功能:双字节二进制无符号数乘法;入口条件:被乘数在R2、R3中,乘数在R6、R7中。
;出口信息:乘积在R2、R3、R4、R5中。
;影响资源:PSW、A、B、R2~R7 堆栈需求:2字节MOV R2,SpCounMOV R3,SpCoun+1MOV R6,#0MOV R7,#5 ;测得的数值是每秒计数值,转为每分转速(每一转测12次,故乘5而非60)CALL MULD;标号:HB2功能:双字节十六进制整数转换成双字节BCD码整数;入口条件:待转换的双字节十六进制整数在R6、R7中。
;出口信息:转换后的三字节BCD码整数在R3、R4、R5中。
;影响资源:PSW、A、R2~R7 堆栈需求:2字节MOV A,R4MOV R6,AMOV A,R5MOV R7,A ;将乘得的结果送R6R准备转换,这里结果不可能超过2字节CALL HB2CBCD:MOV DISPBUF,R3 ;最高位MOV A,R4 ;ANL A,#0F0H ;去掉低4位SWAP A ;将高4位切换到低4位MOV DISPBUF+1,AMOV A,R4ANL A,#0FHMOV DISPBUF+2,AMOV A,R5ANL A,#0F0HSWAP AMOV DISPBUF+3,AMOV A,R5ANL A,#0FHMOV DISPBUF+4,ACLR SpCalc ;清计算标志JMP LOOP;主程序到此结束TIMER1: PUSH ACC;ACC入栈PUSH PSW ;PSW入栈SETB RS0 ;工作区1JNB TR0,SETTR0 ;如果T0未运行,则开启T0 JMP GO1SETTR0:SETB TR0GO1:INC SecCoun ;秒计数器加1MOV A,SecCounCJNE A,#251,Go2 ;如果未到1s则转CLR TR0 ;1s到了,则停止T0的运行MOV SpCoun,TH0MOV SpCoun+1,TL0 ;读取计数值CLR AMOV TH0,AMOV TL0,A ;清计数器SETB SpCalc ;要求主程序计算速度MOV SecCoun,#0 ;清秒计数器Go2:INC COUNT ;用于显示的计数器MOV A,COUNTCLR CSUBB A,#6JZ N1JMP N2N1: MOV COUNT,#0N2: MOV A,#DISPBUFADD A,COUNTMOV R0,A ;指向当前要显示的显示缓冲区MOV A,@R0 ;取第一个待显示数MOV DPTR,#DISPTAB ;字形表首地址MOVC A,@A+DPTR ;取字形码MOV P0,A ;将字形码送P0位(段口)MOV A,COUNTMOV DPTR,#BitTab ;字位表首地址MOVC A,@A+DPTRORL P2,#11111100BANL P2,AMOV TH1,#HIGH(65536-4000)MOV TL1,#LOW(65536-4000)POP PSWPOP ACCRETIBitTab: DB 7Fh,0BFH,0DFH,0EFH,0F7H,0FBHDISPTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86 H,8EH,0FFH……其他数学运算程序(略)四、程序分析主程序在对定时器、计数器、堆栈等进行初始化后即判断标志SpCalc是否为1,如果为1,说明要求对数据进行计算处理,首先将SpCalc标志清零,以保证下次能正常判断,然后进入数据处理程序,由于这里的闸门时间为1s,而显示要求为转/分,因此,要将测到的数据进行转换,转换的方法是将测得的数据乘以60,但由于转轴上安装有12只磁钢,每旋转一周可以得到12个脉冲,因此,要将测得的数据除以12,所以综合起来,将测得的数据乘以5即可得到每分钟的转速。
计算得到的结果是二进制的整数,要将数据送往显示缓冲区需要将该数转化为BCD码。
运算得到的是压缩BCD码,需要将其转换为非压缩BCD码,从标号CBCD开始的一段程序即作了这样的处理。
需要说明的是,这里多位二进制乘法和多位二进制到BCD码的转换都是用了现成的成熟子程序,因此,首先将二进制数转换为压结合实际BCD码,然后再转换成非压缩BCD码,看似多写了些程序,实际上这对于保证程序的质量很有好处。
[Page]定时器T1用作4ms定时发生器,在定时中断程序中进行数码管的动态扫描,同时产生1s 的闸门信号。
1s闸门信号的产生是通过一个计数器Count,每次中断时间为4ms,每计250次即为1s,到了1s后,即清除计数器Count,然后关闭作为计数器用的T0,读出TH0、TL0中的数值,分别送入SpCoun和SpCoun+1单元,将T0中的值清空,置SpCalc标志为1,要求主程序进行速度值的计算。
这里还有一个细节,用作1s闸门信号产生的Count每次中断都会加1,而T0却有一个周期是被关闭的,因此,计数值是251而不是250。
看完这一部份内容以后,请读者自行完成以下工作:1.试用测脉宽法测试速度(提示:80C51单片机内部有高精度信号源,而其计数器又具有门控特性),注意硬件设计要略作更改。
2.查找等精度测量原理,试设计等精度测量的硬件设计并编写相应软件。