51单片机——基于单片机的智能电子里程表

网上转载:用光电式转速传感器检测转速的脉冲信息,在脉冲状态下,将转速的变化转换成光通量的变化,再通过光电转换元件将光通量的变化转换成电量的变化,接着通过频率测量电路将脉冲信号输入到单片机中,然后依据电量与转速的函数关系实现转速测量,再通过计算,从而得出里程、车速的信息,并由LED显示器显示出来。并且该电子式里程表累积的里程数字存储在非易失性的EEPROM存储器内,在无电状态下数据也能保存。

这个主要是传感器的使用,不算复杂,但是注意调通,可以找一个自行车或者共享单车的车轮做实验。

本带马工会竭尽所能解决小白入坑的问题(手动笑哭)。评论会推送至邮箱,我看见了就会回复。可接私活。
也欢迎各位大佬详细交流。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
#include<reg51.h> #include <absacc.h> //----------------------------------------------------- //*定义25045端口--------- sbit CS = P1^1; //*片选 sbit SO = P1^0; //*串行输出 sbit SI = P1^3; //*串行输入 sbit SCK = P1^2; //*串行时钟输入 char command; //*指令字 //------------------------------------- sbit K1 = P3^0; //计程开关 int pulsdate; //*计数脉冲变量 int lengthsdate1; //*保存本次里程数的整数 int lengthsdate2; //*保存本次里程数的小数 int totallength; //*总里程数 //------------------------------------------- int timer0date1; //*定时器0记数变量变1 int timer0date2; //*定时器0记数变量变2 //*初始化2051工作寄存器--------- void init(void) { TMOD = 0x11; //0001 0001B T0:16位定时中断;T1:6位定时中断,方式1 TL0 = 0xfe; //时钟 0.00108506944444444444ms TH0 = 0xdb; //10ms=0x2400,0xffff-0x2400=0xdbff PT0 = 0; //定时器0中断优先级 PT1 = 0; PX0 = 0; PX1 = 1; //外部中断1中断优先级 ET0 = 1; //扫描开始时开T0中断 IE1 = 1; //开外部中断1 IT1 = 1; //边沿触发 TR0 = 1; //开T0 中断 EA = 1; //开总中断 command= 0x00; pulsdate=0x00; lengthsdate1=0x00; lengthsdate2=0x00; timer0date1=0x00; timer0date2=0x00; } //*把状态值State写入25045状态寄存器函数 void Write25045State(char State) { int i; SCK=0; CS=0; for(i=0;i<8;i++) { State<<1; SCK=1; SCK=0; SI=CY; } CS=1; } //*读25045状态寄存器函数,返回值为状态寄存器的值 char Read25045State(void) { int i; char State0; CS = 0; Write25045State(0x06); Write25045State(0x05); SCK=0; for(i=0;i<8;i++) { SCK=1; SCK=0; CY =SO; State0>>1; } CS=1; return State0; } //*从25045的data1存储器中读取数据 char Read25045MEM(char data1) { int i; char out1; CS = 1; CS = 0; command = 0x03; for(i=0;i<8;i++) { command<<1; SCK=0; SI=CY; SCK=1; } command= data1; for(i=0;i<8;i++) { command<<1; SCK=0; SI=CY; SCK=1; } SCK=0; for(i=0;i<8;i++) { SCK=1; SCK=0; CY =SO; out1>>1; } CS=1; return out1; } //*把date2写出25045MEM void Write25045MEM(char data2,char Memory1) { int i; CS = 1; CS = 0; command = 0x02; for(i=0;i<8;i++) { command<<1; SCK=0; SI=CY; SCK=1; } command= Memory1; for(i=0;i<8;i++) { command<<1; SCK=0; SI=CY; SCK=1; } for(i=0;i<8;i++) { data2<<1; SCK=0; SI=CY; SCK=1; } CS=1; } //*X25045芯片复位函数 void reset25045(void) { CS=0; CS=1; } // void init25045(void) { int i; char data5; CS=0; Write25045State(0x06); Write25045State(0x01); data5=0x04; for(i=0;i<8;i++) { data5<<1; SCK=0; SI=CY; SCK=1; } CS=1; } //*写LCM1010函数 void Writelcm1010(char data3 , char data6) { ; } //*定义外部中断1函数 void Int1(void) interrupt 2 { char totall; char totalh; pulsdate++; lengthsdate2+=16; if(lengthsdate2>10000) lengthsdate2-=10000; if(pulsdate>=624) { lengthsdate2=0; lengthsdate1++; pulsdate-=624; } if(pulsdate==0) { totallength++; totall=totallength; Write25045MEM(totall,0x00); totalh=(totallength>>8); Write25045MEM(totalh,0x01); } } //*定义定时器0中断函数 void Timer0(void) interrupt 1 { char i; bit j; bit k; char a; timer0date1++; timer0date2++; if(timer0date1>=4) { timer0date1-=4; } if (k==K1) { a++; } else { k=K1; a=0; } if(i>=20) { j=k; a=20; } if(!j) { switch(timer0date1) { case 0: i=lengthsdate2/100; Writelcm1010(i,timer0date1); break; case 1: i=lengthsdate1; Writelcm1010(i,timer0date1); break; case 2: i=(lengthsdate1/10); Writelcm1010(i,timer0date1); break; case 3: i=(lengthsdate1/100); Writelcm1010(i,timer0date1); break; default: break; } } else { switch(timer0date1) { case 0: i=totallength; Writelcm1010(i,timer0date1); break; case 1: i=(totallength/10); Writelcm1010(i,timer0date1); break; case 2: i=(totallength/100); Writelcm1010(i,timer0date1); break; case 3: i=(totallength/1000); Writelcm1010(i,timer0date1); break; default: break; } } } //*主函数 void main(void) { char totall; char totalh; init(); init25045(); totall=Read25045MEM(0x00); totalh=Read25045MEM(0x01); totallength=totalh; totallength<<8; totallength=totall; while(1) { if(timer0date2>=30) { timer0date2=0; init25045(); } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值