
因此S=L*3600*1000000/time=L*3600000000/time
如果是km/h的话则为:L*3600000/time
速度为0时路程还在跳,我一时看不出什么原因,也可能是干扰吧 .但我看你的程序存在问题,主程序循环一次可不是1S,但计算路程时要求1S内必须执行且只能执行一次S=S+V,估计你的程序会执行5次以上
建议中断程序里只装初值并且变量加1
void timer1()interrupt 3
{
a++
TH1=0x4c//11.0592Mhz
TL1=0//11.0592Mhz
}
主程序里循环执行
while(1)
{
TR0=1
while(a<10)//等待500ms
TR0=0
a=0
处理并显示(只要不大于500ms即可);
while(a<10)//又一个500ms
a=0
}
刚好一个循环是1S
前半秒和后半秒脉冲个数可能会不一样,但总的来说,不会突变,按*2算速度和路程误差不大
象TR0=1 a=0等语句执行时间很短,可以忽略不计
数据处理并且送LCD显示不加延时的话就花几十ms,500ms 足够
1S更新一次,稍有点慢,也可让其1S内更新2-3次,原理是一样的
#include<reg52.h>#include<Star1602.h>
#define CIRCLE 1.8 //宏定义 车轮的周长(这个要根据实际的车轮进行设置)
sbit Signal = P1^0 //这里的Signal表示的是霍尔传感器的信号引脚
int m_second=0; //定义变量m_second,用来记录时间(以毫秒为单位)
float speed=0.0 //定义速度变量
float length=0.0 ;//定义路程变量
void main()
{
lcd_init()//初始化液晶函数
TMOD = 0x01//打开定时器0,并设定其工作方式为16位定时模式。
TH0=(65536-10000)/ 256
TL0=(65536-10000)% 256 //设定定时器的初值,使得没10ms中断一次
EA = 1 //允许总中断
ET0 = 1 //允许定时器0终端
TR0 = 1; //启动定时器0
while(1) //大循环
{
while(Signal); //等待霍尔传感器信号线拉低;
speed = CIRCLE *1000 / m_second //计算速度。
m_second = 0 //计时清零
length += CIRCLE //路程加一个车轮周期
//第一行,显示速度
lcd_pos(0x0) //设定液晶的写入位置为第一行第一格
lcd_wdat(‘S’)
lcd_wdat(‘p’)
lcd_wdat(‘e’)
lcd_wdat(‘e’)
lcd_wdat(‘d’)
lcd_wdat(‘:’)
lcd_wdat( (int)speed%10 ) //显示速度的整数部分
lcd_wdat( (int)(speed*10)%10 ) //显示速度的小数第一位
lcd_wdat( (int)(speed*100)%10 ) //显示速度的小数第二位
lcd_wdat(‘m’)
lcd_wdat(‘/’)
lcd_wdat(‘s’)
//第二行,显示里程
lcd_pos(0x80) //设定液晶的写入位置为第二行第一格
lcd_wdat(‘L’)
lcd_wdat(‘e’)
lcd_wdat(‘n’)
lcd_wdat(‘g’)
lcd_wdat(‘t’)
lcd_wdat(‘h’)
lcd_wdat(‘:’)
lcd_wdat(length /10000+0x30) //显示里程的万位;
lcd_wdat(length %10000/1000+0x30) //显示里程的千位;
lcd_wdat(length %1000/100+0x30) //显示里程的百位;
lcd_wdat(length %100/10+0x30) //显示里程的十位;
lcd_wdat(length %10+0x30) //显示里程的个位;
lcd_wdat(‘m’)
}
}
void timer0_intt() interrupt 1 //
{
TH0=(65536-10000)/ 256
TL0=(65536-10000)% 256 //设定定时器的初值,使得没10ms中断一次
m_second += 10 //因为中断每10毫秒一次,所以这里每次加10;
}
附件1 Star1602.h
#ifndef __STAR1602_H__
#define __STAR1602_H__
sbit rs= P2^0 //
sbit rw = P2^1 //
sbit ep = P2^2 //
void lcd_init() //液晶初始化函数
void lcd_pos(unsigned char pos) //设定液晶的显示位置函数
void lcd_wdat(unsigned char dat) //液晶写入字符
void lcd_write_int(unsigned int x)//液晶显示一个整形变量
#endif
附件2 Star1602.c
#include <reg52.h>
#include "1602.h"
/*****************************************************************************
函数功能:LCD延时子程序
入口参数:ms
出口参数:
*****************************************************************************/
static void delay(unsigned char ms)
{
unsigned char i
while(ms--)
{
for(i = 0i<5i++)
}
}
/*****************************************************************************
函数功能:测试LCD忙碌状态
入口参数:
出口参数:result
*****************************************************************************/
static bit lcd_bz()
{
bit result
rs = 0
rw = 1
ep = 1
delay(5)
result = (bit)(P0 &0x80)
ep = 0
return result
}
/*****************************************************************************
函数功能:写指令数据到LCD子程序
入口参数:cmd
出口参数:
*****************************************************************************/
static void lcd_wcmd(unsigned char cmd)
{
while(lcd_bz())//判断LCD是否忙碌
rs = 0
rw = 0
ep = 0
delay(5)
P0 = cmd
delay(5)
ep = 1
delay(5)
ep = 0
}
/*****************************************************************************
函数功能:设定显示位置子程序
入口参数:pos
出口参数:
*****************************************************************************/
void lcd_pos(unsigned char pos)
{
lcd_wcmd(pos | 0x80)
}
/*****************************************************************************
函数功能:写入显示数据到LCD子程序
入口参数:dat
出口参数:
*****************************************************************************/
void lcd_wdat(unsigned char dat)
{
while(lcd_bz())//判断LCD是否忙碌
rs = 1
rw = 0
ep = 0
P0 = dat
delay(5)
ep = 1
delay(5)
ep = 0
}
/*****************************************************************************
函数功能:LCD初始化子程序
入口参数:
出口参数:
*****************************************************************************/
void lcd_init()
{
lcd_wcmd(0x38)
delay(100)
lcd_wcmd(0x0c)
delay(100)
lcd_wcmd(0x06)
delay(100)
lcd_wcmd(0x01)
delay(100)
}
/*****************************************************************************
函数功能:LCD写入一个整形数据
入口参数:int x
*****************************************************************************/
void lcd_write_int(unsigned int x)
{
unsigned char x1,x2,x3,x4,x5;
x1 = x/10000
x2=x%10000/1000
x3=x%1000/100
x4=x%100/10
x5=x%10
lcd_wdat(x1+0x30)
lcd_wdat(x2+0x30)
lcd_wdat(x3+0x30)
lcd_wdat(x4+0x30)
lcd_wdat(x5+0x30)
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)