【51单片机】汽车里程表之测速功能
文章目录
- 设计说明
- 流程图
- 主要代码
设计说明
以通用MCS-51单片机为处理核心,用传感器将车轮的转数转换为电脉冲,进行处理后送入单片机。里程及速度的测量,是经过MCS-51的定时/计数器测出总的脉冲数和每转一圈的时间,再经过单片机的计算得出,其结果通过LED显示器显示出来。
里程表可以在淘宝上买到成品,我的思路是在成品的基础上,把电机的电流引到里程表上;除了测速功能外,还可以再加上控速功能,在速度超过某一个固定值后,蜂鸣器响,提示需要减速,同时通过串口发送标志位给汽车模块,汽车模块根据标志位,控制汽车的PWM占空比,进行减速。
流程图
计算速度和里程模块:
报警和测速模块:
主要代码
/***********计算速度函数**************/
void menu_dis() //计算速度函数
{static uchar value;if(menu_1 == 0){ if(flag_1s == 1) { flag_1s = 0; if(flag_en == 0){value ++;if(value >= 3) //2秒{ speed_km = 0; //速度为0shudu = (uint)speed_km; value = 0; }}if((flag_en == 1)){ value = 0; flag_en = 0; //1s = 1 / 1000000us; // 1m/s=0.001km除以1/3600h=3.6km/h f_hz = 1/(t2_num * 65536.0 + TH11 * 256 + TL11) / 1000000 ; //算出来就是秒t2_num = 0; //把变量清零TH11 = 0;TL11 = 0; speed_m = f_hz * zhijing * 3.14 ; //算出来的是m/sjuli_z = (juli_z + (uint)speed_m) ; //总路程m speed_km = speed_m * 3.6 ; //(带个小数点) km/s shudu = (uint)speed_km;zong_lc += speed_m;} write_sfm2(1,3,shudu); write_sfm4(2,3,juli_z); }}
}/********************独立按键程序*****************/
uchar key_can; //按键值void key() //独立按键程序
{static uchar key_new;key_can = 20; //按键值还原P3 |= 0x78; //对应的按键IO口输出为1if((P3 & 0x78) != 0x78) //按键按下{delay_1ms(1); //按键消抖动if(((P3 & 0x78) != 0x78) && (key_new == 1)){ //确认是按键按下key_new = 0;switch(P3 & 0x78){case 0x70: key_can = 4; break; //得到按键值case 0x68: key_can = 3; break; //得到按键值case 0x58: key_can = 2; break; //得到按键值case 0x38: key_can = 1; break; //得到按键值}} }else key_new = 1;
}/**********************设置函数************************/
void key_with()
{if(key_can == 1) //设置键{menu_1++;if(menu_1 == 1) //设置时间{menu_2 = 1;write_string(1,0," : : W: "); write_string(2,0," 20 - - "); }if(menu_1 == 2) //设置报警速度{menu_2 = 1;write_string(1,0,"set-sd:00km/h "); write_string(2,0,"zlc: "); }if(menu_1 == 3) //设置直径{menu_2 = 1;write_string(1,0," Set Zhijing "); write_string(2,0," "); }menu_2 = 1;if(menu_1 > 3) //回到正常显示{menu_1 = 0;write_guanbiao(1,2,0); //关闭光标init_1602(); //1602初始化 //初始化液晶显示 }}if(key_can == 2) //选择键{if(menu_1 == 1) //设置时间{menu_2 ++;if(menu_2 > 7)menu_2 = 1;}if(menu_1 == 2) //设置{menu_2 ++;if(menu_2 > 2)menu_2 = 1; }}if(menu_1 == 1){if(menu_2 == 1) //设置时{if(key_can == 3) //加{shi+=0x01;if((shi & 0x0f) >= 0x0a)shi = (shi & 0xf0) + 0x10;if(shi >= 0x24)shi = 0;} if(key_can == 4) //减{if(shi == 0x00)shi = 0x24;if((shi & 0x0f) == 0x00)shi = (shi | 0x0a) - 0x10;shi -- ; } }if(menu_2 == 2) //设置分{if(key_can == 3) //加{fen+=0x01;if((fen & 0x0f) >= 0x0a)fen = (fen & 0xf0) + 0x10;if(fen >= 0x60)fen = 0;} if(key_can == 4) //减 {if(fen == 0x00)fen = 0x5a;if((fen & 0x0f) == 0x00)fen = (fen | 0x0a) - 0x10;fen -- ;} }if(menu_2 == 3) //设置秒{if(key_can == 3) //加{miao+=0x01;if((miao & 0x0f) >= 0x0a)miao = (miao & 0xf0) + 0x10;if(miao >= 0x60)miao = 0;} if(key_can == 4) //减 {if(miao == 0x00)miao = 0x5a;if((miao & 0x0f) == 0x00)miao = (miao | 0x0a) - 0x10;miao -- ; }}if(menu_2 == 4) //设置星期{if(key_can == 3) //加{week+=0x01;if((week & 0x0f) >= 0x0a)week = (week & 0xf0) + 0x10;if(week >= 0x08)week = 1;} if(key_can == 4) //减 {if(week == 0x01)week = 0x08;if((week & 0x0f) == 0x00)week = (week | 0x0a) - 0x10;week -- ;} }if(menu_2 == 5) //设置年{if(key_can == 3) //加{nian+=0x01;if((nian & 0x0f) >= 0x0a)nian = (nian & 0xf0) + 0x10;if(nian >= 0x9a)nian = 1;} if(key_can == 4) //减 {if(nian == 0x01)nian = 0x9a;if((nian & 0x0f) == 0x00)nian = (nian | 0x0a) - 0x10;nian -- ; } }if(menu_2 == 6) //设置月{if(key_can == 3) //加{yue+=0x01;if((yue & 0x0f) >= 0x0a)yue = (yue & 0xf0) + 0x10;if(yue >= 0x13)yue = 1;} if(key_can == 4) //减 {if(yue == 0x01)yue = 0x13;if((yue & 0x0f) == 0x00)yue = (yue | 0x0a) - 0x10;yue -- ; } }if(menu_2 == 7) //设置日{if(key_can == 3) //加{ri+=0x01;if((ri & 0x0f) >= 0x0a)ri = (ri & 0xf0) + 0x10;if(ri >= 0x32)ri = 0; } if(key_can == 4) //减 {if(ri == 0x01)ri = 0x32;if((ri & 0x0f) == 0x00)ri = (ri | 0x0a) - 0x10;ri -- ; } }write_sfm2_ds1302(1,2,shi); //显示时write_sfm2_ds1302(1,5,fen); //显示分write_sfm2_ds1302(1,8,miao); //显示秒write_sfm1(1,14,week); //显示星期 write_sfm2_ds1302(2,3,nian); //显示年write_sfm2_ds1302(2,6,yue); //显示月write_sfm2_ds1302(2,9,ri); //显示日switch(menu_2) // 光标显示{case 1: write_guanbiao(1,2,1); break;case 2: write_guanbiao(1,5,1); break;case 3: write_guanbiao(1,8,1); break;case 4: write_guanbiao(1,14,1); break;case 5: write_guanbiao(2,3,1); break;case 6: write_guanbiao(2,6,1); break;case 7: write_guanbiao(2,9,1); break;}write_time(); //把时间写进去} if(menu_1 == 2){ if(menu_2 == 1) //设置速度{if(key_can == 3) //加{bj_shudu++;if(bj_shudu >= 99)bj_shudu = 99;} if(key_can == 4) //减 {if(bj_shudu != 0)bj_shudu -- ; }} if(menu_2 == 2) //把总量程清零{if(key_can == 3) {zong_lc= 0;} if(key_can == 4) {zong_lc= 0; }} write_sfm2(1,7,bj_shudu); //显示报警速度write_sfm7(2,4,zong_lc); //显示switch(menu_2) // 光标显示{case 1: write_guanbiao(1,6,1); break;case 2: write_guanbiao(2,3,1); break;}}if(menu_1 == 3){ if(key_can == 3) //加{s_zhijing++;if(s_zhijing >= 999)s_zhijing = 999;} if(key_can == 4) //减 {if(s_zhijing != 0)s_zhijing -- ; }zhijing = s_zhijing ;write_sfm2(2,5,s_zhijing); //显示}
}/****************报警函数***************/
void clock_h_l()
{static uchar value; if((shudu >= bj_shudu)){value ++; //消除实际距离在设定距离左右变化时的干扰{beep = ~beep; //蜂鸣器报警 } }else{beep = 1; }
}/******************主程序**********************/
void main()
{init_1602(); //1602初始化init_int0();time_init(); //定时器0初始化程序 while(1){ // shudu = 11;key(); //按键程序if(key_can < 10){key_with(); }if(flag_200ms == 1){flag_200ms = 0;read_time(); //读时间init_1602_ds1302(); //显示时钟menu_dis(); //计算速度函数clock_h_l(); //报警函数}}
}/*********************外部中断0中断服务程序************************/
void int0() interrupt 0
{static uchar value=1;switch(value){case 0: t1_num = 0; //第一次就把变量清零TH1 = 0;TL1 = 0;break;case 1: t2_num = t1_num; //保存TH11 = TH1;TL11 = TL1;flag_en = 1;break;}
}/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{ static uchar value=1;TH0 = 0x3c;TL0 = 0xb0; // 50msvalue++;if(value % 4 == 0)flag_200ms = 1;if(value >= 20) //1秒 才是一秒钟的速度{value = 0;flag_1s = 1;}
}/*************定时器1中断服务程序***************/
void time1_int() interrupt 3
{t1_num++;
}
【51单片机】汽车里程表之测速功能相关推荐
- 单片机c语言计数器测速,基于51单片机的光电编码器测速.doc
课程设计报告 课程名称: 微机原理课程设计 题 目: 基于51单片机的光电编码器测速 摘要 光电编码器是高精度位置控制系统常用的一种位移检测传感器.在位置控制系统中,由于电机既可能正转,也可能反转,所 ...
- 基于51单片机的跑步机霍尔测速脉搏心率检方案原理图设计
系统的功能分析及体系结构设计 (下方附文件) 3.1.1系统功能分析 本设计由STC89C52单片机电路+脉搏/心率传感器电路+LM393比较器电路+霍尔测速电路+电机控制电路+LCD1602显示电路 ...
- 【Proteus仿真】【51单片机】PWM电机调速系统设计
文章目录 一.主要功能 二.硬件资源 三.软件设计 1.主机程序 四.实验现象 联系作者 一.主要功能 本项目使用Proteus8仿真51单片机控制器,使用L298N电机模块.数码管模块.按键模块.L ...
- 基于51单片机的L298N直流电机调速系统Proteus仿真程序
基于51单片机的L298N直流电机调速系统Proteus仿真程序 本此设计选择STC89C52单片机作为主控芯片,选取带有光电编码器的直流电机作为被控对象,利用单片机的T0定时器产生PWM信号并送到直 ...
- 51单片机的直流电机PWM调速控制系统(附Proteus仿真+C程序等全套资料)
设计思路 直流电机PWM控制系统的主要功能包括:很实现对直流电机的加速.减速以及电机的正转.反转和急停,并且可以调整电机的转速,能够方便的实现电机的智能控制. 主体电路:即直流电机PWM控制模块.这部 ...
- 基于51单片机的室内温度可燃气体检测报警系统Proteus仿真(源码+仿真+全套资料)
资料编号:133 讲解视频: 133-基于51单片机的室内温度可燃气体检测报警系统Proteus仿真(源码+仿真+全套资料) 功能介绍: 采用51单片机作为主控,LCD1602显示当前温度和可燃气体浓 ...
- 用51单片机和ch375实现键鼠功能
用51单片机和ch375实现键鼠功能 说明: 为了参加比赛,我和我的队友设计了一款人机交互系统,我负责接收摄像头数据和模拟键鼠功能,由于当时只是学习了51故用51单片机和ch375模拟一套简单的键鼠功 ...
- S7-1200 PLC通过编码器实现高速计数器的测速功能
S7-1200 PLC通过编码器实现高速计数器的测速功能 PLC通过计算单位时间内编码器反馈回来的脉冲数量来测出电机的实时转速,这里编码器使用A/B相计数. 在CPU中的组态配置中"启用该高 ...
- 基于51单片机霍尔测速仪表测转速调速系统方案原理图设计
硬件分析 (文末附文件) 原理框图 原理图: 系统功能分析 本设计由STC89C52单片机电路+液晶LCD1602显示电路+霍尔测速电路+电源电路组成. 1.通过霍尔传感器测速,霍尔传感器检测轮盘上的 ...
最新文章
- Intel汇编语言程序设计学习-第三章 汇编语言基础-中
- Java 程序员必备的 Intellij IDEA 插件
- Apache RocketMQ 荣获 2021 中国开源云联盟优秀开源项目
- 带通 带阻滤波器 幅频响应_二阶有源带通滤波器设计
- NIOS II软核处理器
- 05 MapReduce应用案例01
- 有了报表FineReport,为什么还要上FineBI?
- 苹果WWDC 2020回顾:来看看这个安卓味的iOS 14!
- 【原】jQuery easyUI 快速搭建前端框架
- 力扣-204 计数质数
- 论文排版 | Texworks
- Linux 添加管理员用户
- tomcat 窗口中文乱码解决
- HTML打地鼠小游戏代码
- 我奋斗了18年还是不能和你坐在一起喝咖啡(转)
- 模板文件, ruby erb 与 python format
- datax(二)datax on azkaban架构设计之datax as a service
- 如何按照规格型号表挑选合适的快速接头
- python考证书-考证那些事儿:Python工程师认证的考试内容和大纲
- SQLSERVER2012 保存阿拉伯文字乱码的问题