基于单片机的车轮测速系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【实例68】基于单片机的车轮测速系统
具体程序如下:
/*---------------
文件名称: speed.C
功能:脉冲方式车轮测速
说明:系统主时钟为6MHz,定时间隔为512um
----------------*/
#include
unsigned char K=100; //相邻两个红外线探测器之间的圆弧长度,这里预设为100mm
unsigned int t0_num=0; //t0定时器中断次数计数
unsigned int speed; //用来存储计算出的速度,单位为km/h
unsigned char int0_flag=0; //int0的中断标志位
unsigned char t0_max=65000; //定时器0的最大中断次数,防止当车轮不转时,数据溢出。
//主函数
void main()
{
//初始化中断,下降沿有效
EA=0;
IT0=1;
EX0=1;
//初始化定时器T0,方式2,8位自动重载方式。在6MHz主频时,定时间隔为512us
TMOD=0x02;
TL0=0xff;
TH0=0xff;
//开启中断
EA=1;
while(1)
{
if(int0_flag==2) // 连续中断两次,则进行速度计算
{
speed=(K*3600)/(t0_num*512); //计算速度
disp(speed,0); //显示速度,详见第四章4.6 七段数码管显示实例
t0_num=0;
int0_flag=0;
EA=1;
}
}
}
/********************************
函数名称: void int0_fun() interrupt 0
功能:int0中断处理函数
说明:设置int0_flag的值,并根据int0_flag 启动或关闭定时器T0
入口参数:无
返回值:无
********************************/
void int0_fun() interrupt 0
{
if(int0_flag==0)
{
TR0=1;
}
int0_flag++;
if(int0_flag==2)
{
TR0=0;
EA=0;
}
}
/********************************
函数名称: void t0_fun() interrupt 1
功能:定时器/计数器0溢出中断的中断服务程序
说明:对t0_num进行递增,并判断是否到达最大值入口参数:无
返回值:无
********************************/
void t0_fun() interrupt 1
{
t0_num++;
if(T0==t0_max)
{
int0_flag=2;
TR0=0;
EA=0;
}
}