转速测量,在仿真中等价于测量外部脉冲频率
修改输入脉冲的频率,在数码管上可实时显示当前频率!
单片机计数测速仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- /*********************************************************************
- 功能:霍尔传感器测速,霍尔传感器的信号输出脚接T1(P3.5)引脚
- 测量范围;假设转盘只有一个磁钢,转速低于10r/S则显示0,高于655360r/s则计数溢出(一般应用不会超出此限)
- *******************************************************************/
- #include <reg51.h>
- #define N 1//转盘上所安装的磁钢个数
- sbit DLed1=P2^0;//定义第一位数码管"位选"控制线的别名
- sbit DLed2=P2^1;//定义第二位数码管"位选"控制线的别名
- sbit DLed3=P2^2;
- sbit DLed4=P2^3;
- unsigned int speed=0;//最后的转速值
- unsigned int count=0;//在指定时间内记到的外部脉冲数
- unsigned char k=0;
- unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- void disp(unsigned char x1,unsigned char x2,unsigned char x3,unsigned char x4);//子函数前向声明
- /*********************************
- 函数名称:void delay1ms(unsigned int k)
- 功能:延时子函数
- 入口参数:延时时长
- 返回值:无
- **********************************/
- void delay1ms(unsigned int k)
- {
- unsigned char n,m;
- for(m=0;m<k;m++)
- {for(n=0;n<115;n++);}
- }
- //===================主函数
- void main()
- {
- unsigned char n;
- //EA=0;
- TMOD=0x51;//0101 0001,T1纯软件启动,计数模式,工作方式1;T0纯软件启动,定时模式,工作方式1
- TH0=0x3c;//12M晶振,定时50ms
- TL0=0xb0;
- ET0=1;//开启定时0中断
- EA=1;//开启总中断
- TR0=1;//同时启动定时与计数
- TR1=1;
- while(1)
- {
- speed=count/N;//结果为:x转/s,注意防止其越界
- for(n=20;n>0;n--)//稳定显示一阵
- {
- disp(speed/1000,speed%1000/100,speed%100/10,speed%10);
-
-
- }
- TR0=1;//再次启动定时和计数功能,为下一次的测量作准备
- TR1=1;
- }
-
- }
- /*********************************
- 函数名称:
- 功能:T0中断处理函数
- 说明:定时时间到,则关闭定时器,取出计数值
- 入口参数:
- 返回值:
- **********************************/
- void int0_fun() interrupt 1
- {
- k++;
- TH0=0x3c;//重载定时器T0初值
- TL0=0xb0;
- if(k>=20)//100ms的定时时间到
- {
- TR0=0;
- TR1=0;
- count=TH1*256+TL1;
- TH1=0x00;//清除计数值
- TL1=0x00;
- k=0; //清除标志变量
- }
- }
- /********************************
- 功能:显示函数
- 四位数码管的显示函数
- 段选:P1
- 位选:P20-P23
- 注意:采用的共阳数码管
- ***************************/
- void disp(unsigned char x1,unsigned char x2,unsigned char x3,unsigned char x4)
- {
- DLed1=1;DLed2=0;DLed3=0;DLed4=0;//送位码,只让第一位数码管显示
- P1=tab[x1];//送段码
- delay1ms(10);//延时
- P1=0xff;//关闭
-
- //----扫描显示第二位数码管------
- DLed1=0;DLed2=1;DLed3=0;DLed4=0;
- P1=tab[x2];
- delay1ms(10);
- P1=0xff;
- //----扫描显示第三位数码管------
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
计数测速.rar
(57.92 KB, 下载次数: 397)
|