51单片机码表c语言编程,用AT89S51单片机制作的多功能自行车速度里程表

三、程序设计

程序用C语言编写,由主程序、外部中断0服务程序、定时器110中断服务程序、延时子程序等模块组成。主程序由初始化、车轮直径判定和键盘处理三部分组成。车轮直径判定的依据是接在P1口低四位的跳线,跳线接地时表示低电平,不接时表示高电平。其取值与车轮直径、周长对应关系见附表。

7d47e6f2ac9108c0e93258f83128f976.png

外部中断0服务程序由测量、计算、读数等组成。从P3.2口输入的脉冲信号作为外部中断0的中断请求信号,外部中断采用边沿触发方式。在测量速度时,由于车轮转动脉冲信号的频率很低,不适宜用计数的方法测量,故采用测脉冲周期的方法进行测量,用脉冲信号系统来控制计时信号,通过计时数计算出脉冲周期。车轮的周长除以周期可得到自行车的行驶速度:在测量行驶里程时,通过对脉冲信号个数的计数,用计数值乘以车轮的周长即可获得行驶里程。需要说明的是:测量脉冲信号周期和个数是同时进行的,我们要做的只是用按钮开关切换显示不同的量。为了避免使用浮点数,程序中的运算结果长度是以十米为单位的。数据读出时在第二位数后加小数点就换算成干米了。

定时器T0中断服务程序由计时、动态扫描显示、自行车停车判断等组成。T0的中断定时时间为10ms.每中断一次计时变量n加1,因此n的单位为10ms。例如,自行车车轮转一周对应的n值为50。则对应的时间为0.5s,假如自行车的车轮直径为26英寸。可得自行车的速度为14.90km/h。如果n值达到500,即5秒钟,仍没有发生外部中断,即表示自行车没有前进,则n也被清零,速度显示为0。

读数采用四位显示,定时器T0每中断一次显示一位数,因此四次中断就可以刷新一次数据。即40ms刷新一次数据。

四、安装与调试

安装前用编程器或下载线将HEX文件写入AT89S51。DS1~DS4使用共阳数码管,SPK用工作电压为6V的有源蜂鸣器。电源使用4节5号充电电池。

使用前,根据车轮直径参照附表进行跳线,也可以不用跳线直接在电路板上用连线焊接。附图中对应的是26英寸的跳线设置。

传感器的安装与调试是一个关键,把传感器安装在前轮的位置,把一小块永久磁铁固定在车轮辐条上UGN3020作防潮密封后固定在前叉上。使得车轮转动时磁铁从它的前面经过,应使两者相遇时间隔尽量小。安装时,要使磁铁的S极面向UGN3020的正面,判定磁铁极性方法是把磁铁的两个极分别靠近UGN3020的正面,当其③脚电平由高变低时即为正确的安装位置。传感器安装完成后,转动车轮,UGN3020③脚应有脉冲信号输出,否则说明两者的间隔偏大。应缩小距离,直至有脉冲信号输出为止。间隔一般为5mm左右。如果小于5mm仍无脉冲信号输出。说明磁铁的磁场强度偏小,应更换。

调试结束后,把里程速度表安装在车把手上。打开电源开关S3,骑动自行车,这时数码管显示的是速度,按S1可调到需要的显示模式。

概述: 随着自行车运动的普及和发展,自行车越来越受到大众的欢迎。自行车码表作为一款测速装置,能合理的计算出速度和公里数,真实地反映骑行状况,使骑行者能够评估自己的运动量,以达到健康运动的最佳效果。本应用说明提供了一种基于瑞萨低功耗、内置LCD 驱动器的单片机R7F0C002 的自行车码表解决方案。 技术参数:  电源: 3.0 V (锂电池 CR2032 ╳ 1 个)  低功耗电流(MCU): 0.23uA (TYP.) STOP 模式  LCD 工作电压: 3.0 V  LCD 驱动电压生成方式: 内部升压方式,基准电压为1.00 V  LCD 驱动方式: 1/4 占空比,1/3 偏压 规格:  低功耗功能: 300 秒内没有运动讯号输入,系统工作在低功耗(STOP)模式。  时间显示功能: LCD 面板上实时显示当前的小时、分钟等时间信息。  总行车时长显示功能: LCD 面板上实时显示总行车时长。  当前行车速度显示功能: LCD 面板上实时显示当前行车速度(公里/小时)。  当次行车里程显示功能: LCD 面板上实时显示当次行车里程(公里)。  总行车里程显示功能: LCD 面板上实时显示总行车里程(公里)。  时间设定功能: 任意时刻,可以通过按键设定当前的时间信息。  车轮周长设定功能: 任意时刻,可以通过按键设定车轮的周长(毫米)。  工作温度: -10℃ ~ 40℃  工作湿度: 30% RH ~ 95% RH 自行车里程表程序源码软件框图:
以下是一个基于KL25Z主控的自行车码表程序的示例代码: ```c #include "MKL25Z4.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 update_speed(uint32_t wheel_cnt) { uint32_t speed = wheel_cnt * WHEEL_CIRCUMFERENCE_CM / 1000; // 计算车速(单位:千米/小时) // TODO: 将车速显示在码表上 } int main(void) { init_timer(); init_gpio(); while (1) { // 程序主循环 } } void PIT_IRQHandler() { PIT->CHANNEL[0].TFLG = PIT_TFLG_TIF_MASK; // 清除计时器中断标志位 timer_cnt++; if (timer_cnt == 2) { // 每隔1秒更新一次车速 update_speed(wheel_cnt); wheel_cnt = 0; timer_cnt = 0; } } void PORTB_IRQHandler() { if (PORTB->ISFR & (1 << 2)) { // 检查是否是PTB2引脚的中断 wheel_cnt++; PORTB->PCR[2] |= PORT_PCR_ISF_MASK; // 清除中断标志位 } } ``` 该程序使用了PIT计时器和GPIO中断来实现自行车码表的功能。PIT计时器定时500毫秒,并在每次计时器中断中更新车速信息;GPIO中断检测车轮转动并计数。在程序主循环中,我们可以添加其他需要执行的任务。需要注意的是,代码中的`update_speed()`函数仅给出了计算车速的示例代码,实际应用中需要根据具体的码表设计进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值