14.测速小车(测速模块)

1. 测速模块

用途:广泛用于电机转速检测,脉冲计数 , 位置限位等。
有遮挡,输出高电平;无遮挡,输出低电平
接线
VCC 接电源正极 3.3-5V
GND 接电源负极
DO TTL 开关信号输出
AO 此模块不起作用
2. 测试原理和单位换算
轮子走一圈,经过一个周长, C = 2x3.14x 半径 = 3.14 x 直径( 6.5cm )
对应的码盘也转了一圈,码盘有 20 个格子,每经过一个格子,会遮挡(高电平)和不遮挡(低电平), 那么一个脉冲就是走了 3.14 * 6.5 cm /20 = 1.0205CM
定时器可以设计成一秒,统计脉冲数,一个脉冲就是 1cm
假设一秒有 80 脉冲,那么就是 80cm/s
3. 定时器和中断实现测速
编程实现
main.c
#include "system.h"

//sbit D1 = P3^5;
//sbit D2 = P3^6;
//sbit D3 = P3^7;

sbit speed_do = P3^2; /* 外部中断0引脚 */
u16 speed_cnt;
extern u8 send_signal;
extern u16 speed;
char real_speed24; /* 建立一个数组来存储速度 */

void Ex0_init(void)
{
EX0 = 1;
EA = 1; /* 串口那已经开启 */
IT0 = 1; /* 下降沿触发 */

}

void main(void)
{

Timer0_Init();
Uart1_Init();
Ex0_init(); /* 外部中断的下降沿触发 */

while(1)
{
if(send_signal)
{
sprintf(real_speed,"speed:%d cm/s",speed); /* 整型数(97)变成字符的(97) */
Send_String(real_speed);
send_signal = 0; /* 清0send_signal,下次由定时器1s后的中断处理中再置一 */
}
}
}

void Speed_Handle(void) interrupt 0
{
speed_cnt++; /* 码盘转动了一个格子 */
}

timer0.c

#include "system.h"

sfr AUXR = 0x8E;

u8 cnt = 0;

extern u16 speed_cnt;

u16 speed;

u8 send_signal = 0;

void Timer0_Init(void) //500微秒@11.0592MHz

{

AUXR &= 0x7F; //定时器时钟12T模式

TMOD &= 0xF0; //设置定时器模式

TMOD |= 0x01;

TL0 = 0x33; //设置定时初始值

TH0 = 0xFE; //设置定时初始值

TF0 = 0; //清除TF0标志

TR0 = 1; //定时器0开始计时

ET0 = 1; //使能定时器0中断

EA = 1;

}

void Timer0_Isr(void) interrupt 1

{

cnt++;

TL0 = 0x33;

TH0 = 0xFE;

if(cnt == 2000) /*爆表2000次,经过了1s */

{

send_signal = 1; /* 发送信号 */

speed = speed_cnt;

speed_cnt = 0; /* 1秒后拿到speedCnt个格子,就能算出这1s的速度,格子清零 */

cnt = 0;/* 当100次表示1s,重新让cnt从0开始,计算下一次的1s

计算小车的速度,也就是拿到speedCnt的值 */

}

}

uart.c

#include "system.h"

#define SIZE 12

sfr AUXR = 0x8E;

u8 bufferSIZE;

/* 发送一个字符 */

void Send_Byte(s8 byte)

{

SBUF = byte;

while(!TI);

TI = 0;

}

/* 发送一串字符串 */

void Send_String(char* string)

{

while(*string != '\0')

{

Send_Byte(*string);

string++;

}

}

void Uart1_Init(void) //9600bps@11.0592MHz

{

PCON &= 0x7F; //波特率不倍速

SCON = 0x50; //8位数据,可变波特率

AUXR &= 0xBF; //定时器时钟12T模式

AUXR &= 0xFE; //串口1选择定时器1为波特率发生器

TMOD &= 0x0F; //设置定时器模式

TMOD |= 0x20; //设置定时器模式

TL1 = 0xFD; //设置定时初始值

TH1 = 0xFD; //设置定时重载值

ET1 = 0; //禁止定时器中断

TR1 = 1; //定时器1开始计时

ES = 1; //使能串口1中断

//EA = 1;

}

void Uart1_Isr(void) interrupt 4

{

static u8 i = 0;

u8 sbuf;

if (RI) //检测串口1接收中断

{

RI = 0; //清除串口1接收中断请求位

sbuf = SBUF;

if(sbuf == 'M')

{

i = 0;

}

bufferi++ = sbuf;

if(buffer0 == 'M')

{

switch(buffer1)

{

/* M0控制小车前进 */

case '0':

Goto_Forward();

break;

/* M1控制小车后退 */

case '1':

Goto_Back();

break;

/* M2控制小车左转 */

case '2':

Goto_TurnLeft();

break;

/* M3控制小车右转 */

case '3':

Goto_TurnRight();

break;

/* 其它为停止 */

default:

Goto_Stop();

break;

}

}

if(i == 12)

{

i = 0;

memset(buffer,'\0',SIZE);

}

}

}

相关推荐
尼喃5 小时前
OVP/OCP过压过流保护芯片选型表:2A、3A、5A与10A方案怎么选
嵌入式硬件
无敌贵点大王11 小时前
嵌入式软件面试经(自用)
c语言·stm32·单片机·学习·mongodb·面试·职场和发展
NYFEA11 小时前
NF532重磅上新:高集成度13.56MHz非接触式控制器
嵌入式硬件
我是海飞12 小时前
使用杰理 AC7925B 实现 Windows电脑 USB 副屏
windows·单片机·电脑·嵌入式·杰理
我是海飞12 小时前
杰理 JL703N SDK 实现 AI 自动化调试:自动进入下载模式、下载、重启与日志抓取
人工智能·单片机·自动化·音视频·杰理
Zwawa12 小时前
PID 的三个参数之外:位置式、增量式和反馈控制
c语言·单片机·嵌入式
创界工坊工作室13 小时前
29-基于单片机的万年历设计
stm32·单片机·嵌入式硬件·proteus
木由里予13 小时前
NAND 这门生意
运维·服务器·网络·单片机
国科安芯13 小时前
在轨服务与空间机器人任务中跨飞行器CANFD互连的共模与单粒子问题综述
嵌入式硬件·机器人·canfd·低轨卫星·商业航天·抗辐射
沐欣工作室_lvyiyi14 小时前
基于STM32的社区养老控制系统设计(论文+源码)
stm32·单片机·嵌入式硬件·社区养老控制系统·保定理工学院·华德学院·淮南师范学院