以kl25z 为主控,dv12864g显示器显示速度和距离,霍尔传感器测速和距离的自行车码表
时间: 2024-02-06 07:04:00 浏览: 148
下面是基于KL25Z主控、DV12864G显示器和霍尔传感器的自行车码表程序示例代码:
```c
#include "MKL25Z4.h"
#include "dv12864g.h"
#define TMR_FREQ 48000000 // 定时器频率
#define WHEEL_CIRCUMFERENCE_CM 210 // 车轮周长(单位:厘米)
volatile uint32_t timer_cnt = 0; // 计时器计数器
volatile uint32_t wheel_cnt = 0; // 车轮转动计数器
void delay(uint32_t count) {
volatile uint32_t i;
for (i = 0; i < count; i++);
}
void init_timer() {
SIM->SCGC6 |= SIM_SCGC6_PIT_MASK; // 使能PIT时钟
PIT->MCR = 0; // 启用PIT计时器
PIT->CHANNEL[0].LDVAL = TMR_FREQ / 2; // 设置计时器周期为500ms
PIT->CHANNEL[0].TCTRL = PIT_TCTRL_TIE_MASK | PIT_TCTRL_TEN_MASK; // 启用计时器中断和计时器
NVIC_EnableIRQ(PIT_IRQn); // 使能PIT中断
}
void init_gpio() {
SIM->SCGC5 |= SIM_SCGC5_PORTB_MASK; // 使能PORTB时钟
PORTB->PCR[2] = PORT_PCR_MUX(1) | PORT_PCR_IRQC(10); // 设置PTB2引脚为GPIO功能,设置中断类型为上升沿触发
GPIOB->PDDR &= ~(1 << 2); // 设置PTB2引脚为输入模式
NVIC_EnableIRQ(PORTB_IRQn); // 使能PORTB中断
}
void init_hall_sensor() {
SIM->SCGC5 |= SIM_SCGC5_PORTC_MASK; // 使能PORTC时钟
PORTC->PCR[4] = PORT_PCR_MUX(1) | PORT_PCR_IRQC(10); // 设置PTC4引脚为GPIO功能,设置中断类型为上升沿触发
GPIOC->PDDR &= ~(1 << 4); // 设置PTC4引脚为输入模式
NVIC_EnableIRQ(PORTC_IRQn); // 使能PORTC中断
}
void init_display() {
dv12864g_init(); // 初始化DV12864G显示器
}
void update_display(uint32_t speed, uint32_t distance) {
char str[20];
// 清屏
dv12864g_clear();
// 显示车速
sprintf(str, "Speed: %d km/h", speed);
dv12864g_display_string(0, 0, str);
// 显示里程
sprintf(str, "Distance: %d km", distance);
dv12864g_display_string(0, 2, str);
}
void update_speed(uint32_t wheel_cnt) {
uint32_t speed = wheel_cnt * WHEEL_CIRCUMFERENCE_CM / 1000; // 计算车速(单位:千米/小时)
uint32_t distance = wheel_cnt * WHEEL_CIRCUMFERENCE_CM / 100000; // 计算里程(单位:千米)
update_display(speed, distance); // 更新显示器
wheel_cnt = 0; // 重置车轮转动计数器
}
int main(void) {
init_timer();
init_gpio();
init_hall_sensor();
init_display();
while (1) {
// 程序主循环
}
}
void PIT_IRQHandler() {
PIT->CHANNEL[0].TFLG = PIT_TFLG_TIF_MASK; // 清除计时器中断标志位
timer_cnt++;
if (timer_cnt == 2) { // 每隔1秒更新一次车速和里程
update_speed(wheel_cnt);
timer_cnt = 0;
}
}
void PORTB_IRQHandler() {
if (PORTB->ISFR & (1 << 2)) { // 检查是否是PTB2引脚的中断
wheel_cnt++;
PORTB->PCR[2] |= PORT_PCR_ISF_MASK; // 清除中断标志位
}
}
void PORTC_IRQHandler() {
if (PORTC->ISFR & (1 << 4)) { // 检查是否是PTC4引脚的中断
wheel_cnt++;
PORTC->PCR[4] |= PORT_PCR_ISF_MASK; // 清除中断标志位
}
}
```
该程序中,我们使用PIT计时器、GPIO中断和DV12864G显示器来实现自行车码表的功能。PIT计时器定时500毫秒,并在每次计时器中断中更新车速和里程信息;GPIO中断检测车轮和霍尔传感器的转动并计数;DV12864G显示器用于显示车速和里程信息。在程序主循环中,我们可以添加其他需要执行的任务。需要注意的是,代码中的`update_display()`函数用于更新显示器上的信息,实际应用中需要根据具体的显示器设计进行修改。
阅读全文