找回密码
 注册
关于网站域名变更的通知
查看: 628|回复: 2
打印 上一主题 下一主题

简易自行车里程计仿真图及单片机源程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-11-29 08:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
简易自行车里程计仿真图及单片机源程序2 g4 J* B6 S1 h- V, C" x" B

' T* U% K- S, N3 K8 d: D. J

7 p& V* S- W5 w+ z- E* [, T2 u* J' W3 E* x4 d! h/ n" F
由于仿真中没有霍尔传感器,实际呢霍尔就是感应磁信号,输出高低电平的脉冲信号,这样用脉冲就可以了,不同的频率代表电机转速的快慢
2 g, S" f1 {, O1 r( d  h
单片机源程序:
#include<reg52.h>& _9 N" U& f# A5 B7 F
. m% f  U1 D; u: v" y
#define uchar unsigned char6 P1 P6 Q* G7 O+ n+ @
#define uint unsigned int- G- g# ?% P/ @) O$ ^: {
5 n0 h; G. n) s; J" x$ k
sbit COUNT_IN=P3^2;
/ g0 p$ m" T7 s0 Y2 {7 K5 j5 n7 D# o7 ^' t) i0 o6 r' y8 d! a4 u
//定义1602相关管脚% H2 A  f3 K, A. U6 y# i3 A3 D
sbit rs=P2^7;5 l& C& v8 {0 t0 k1 E8 ^8 t
sbit en=P2^6;+ C: P5 w; f5 Z" {! B6 T: P7 e0 }

1 b6 l0 d9 R; f3 X7 M8 g" A& f, }( ?uint count;5 `! q, C8 v! c+ F. z6 k2 j- n/ W
unsigned long Velocity,Mileage;, D! F  ~8 B8 p
bit flag;% Z  Q* a  P+ P) l' U" }" q
uchar code tab1[]={"  Speed:      km/h"};         8 i5 {; Y$ |# z& P, X
uchar code tab2[]={"Mileage:  .   km"};        
* N' ~6 u$ b/ h, S1 {  D5 S) O# N" c2 i; k
void delay(uint x)
9 Y4 o  }1 q5 J5 A  h{9 I: [/ e0 [( `6 m0 z
        uint i,j;
) C+ m$ T) q) u3 s; F        for(i=0;i<x;i++)0 y, Y# f2 Y, H5 P0 w
        for(j=0;j<110;j++);
- d. s+ f1 v, x6 T7 H" _6 J}
' g, R2 D8 |3 W1 R! y8 R- w+ g, \void init()' s( S: d$ o7 o2 R: {
{* _$ ?/ o5 T% f6 t$ k8 }2 h
        IT0=1;        //INT0负跳变触发        5 U7 L) |  Z0 N8 R
    TMOD=0x01;//定时器工作于方式1
5 `) H( O3 o5 e1 h+ b  ?6 G% n        TH0=0x3c;          //50ms
; O( k" Z* a( J- {        TL0=0xb0;5 `/ \+ e8 z5 T3 K, G
        EA=1; //CPU开中断总允许0 J8 u2 V- z/ D$ s- N7 |( m6 Z
        ET0=1;//开定时中断
- U: [3 V7 T* G        EX0=1;//开外部INTO中断& ^5 O/ J! o: z% Q, h: Z8 L7 n
    TR0=1;//启动定时. ^) `# R6 e, a8 g6 f$ V4 L
}
+ A6 ?5 N) |) [; \% \3 i* x/********液晶写入指令函数与写入数据函数,以后可调用**************/
3 Z8 Z% @7 G+ m4 x- G: R6 y1 P  b9 m, e$ i; ]' d. u! g) {9 X' e
void write_1602com(uchar com)//****液晶写入指令函数****) a2 p" I$ B( {! {3 @! Q& o1 _# E
{8 p1 p) c0 M7 k( A7 H
        rs=0;//数据/指令选择置为指令; ~5 w1 x+ {- Y. n6 X' N0 k  O
        P0=com;//送入数据3 R! U. s& ~! d/ z& i# g% S4 P4 \
        delay(1);
) S( A# ]+ F; k        en=1;//拉高使能端,为制造有效的下降沿做准备% S7 ^4 p- E5 q! `7 w! c
        delay(1);
2 \. M% N- z7 b8 M0 |        en=0;//en由高变低,产生下降沿,液晶执行命令
  f, S; b; H3 _# w9 L0 K4 a6 H  v: ]$ L$ c' \1 y  W2 e
}% l& a# l6 H9 p) a: l& V

2 e4 f9 x: L6 a( q1 F% d  h% G* }" E0 B9 m
void write_1602dat(uchar dat)//***液晶写入数据函数****
# @5 i7 ]' A/ P. L3 Q6 c{7 n1 r- n9 O: K
        rs=1;//数据/指令选择置为数据
$ t! R2 M1 a+ K, }9 @        P0=dat;//送入数据5 e# G) Z5 m* j1 O2 H
        delay(1);
, k6 ^. D# N+ C2 T        en=1; //en置高电平,为制造下降沿做准备
' ?$ g! `& f9 ?        delay(1);& u) w; h; l: @0 _) n; G. w+ `. r
        en=0; //en由高变低,产生下降沿,液晶执行命令. P9 X" }& q& x+ f; e8 }! ^) d. A4 ~+ l
}
' D- V) r- N+ v5 j! |+ Z0 Z/ Q
1 B, ^) F- Y, P" R! U  o# k9 L9 O+ C; }
void lcd_init()//***液晶初始化函数****
! F$ A0 @" ?1 \. z6 c{
' d+ ^3 \6 k6 S1 t7 Y- o        uchar a;
5 S* ]% Q1 a0 W" ]3 B        write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
0 T5 u0 W0 m- R2 @0 H. O: j        write_1602com(0x0c);//开显示不显示光标
( E6 B$ I$ g5 L3 X+ x2 V- ?2 d7 b        write_1602com(0x06);//整屏不移动,光标自动右移
" m+ n; ?, _0 d9 i        write_1602com(0x01);//清显示
9 Y# _3 A! M* x0 U+ m- y( G4 i4 u# r
        write_1602com(0x80);//显示固定符号从第一行第1个位置之后开始显示! r! [1 E; h: f
        for(a=0;a<16;a++)( w& Y0 D; a8 }" R( g( ]+ p
        {$ E% b& H1 _5 S; a6 q8 e
                write_1602dat(tab1[a]);//向液晶屏写固定符号部分
: X# F% C0 S3 p# S; V/ `        }
, i9 q& ~0 v* H; V# V3 _5 z0 M        write_1602com(0x80+0x40);//显示固定符号写入位置,从第2个位置后开始显示
/ L( h6 B' f: s" }! z; p        for(a=0;a<16;a++)" b! Y' t+ T! E# `, J  K
        {3 ~. n) ~" i8 }3 R5 K
                write_1602dat(tab2[a]);//写显示固定符号
' u' |. z. w' R4 o) q* i0 q- i        }
( a# _7 P+ ~) T4 `. R}
; \; b  ^) u* {: r) D! e4 F* |% D! t: @- X: e. Q+ Z  ]
void display()8 ?  e- j, P* g1 k. P0 Y: ?! Y
{, P  q% d5 z8 [( R7 q( Q/ U
                //                        1km/h=100m/0.1h                   360s
9 Q5 _! l) i; g3 Z: z  r- z                //                        10km/h=100m/0.01h          36s
1 x$ p# G% B: ~' k: t; ?9 k5 K: F9 g: q                //                        100km/h=100m/0.001h  3.6s
  D, |, W) r  [  }3 j( q# [! p
5 R; W" W3 N# X, T. F4 p                write_1602com(0x80+9);1 v1 R- S$ y2 H# ]! q" P
                if(Velocity/100==0)
- \8 u8 D! ~; h! ]8 I9 b+ l                write_1602dat(' ');
# O* S. \8 w( |5 I                else7 U. Q- D" n6 ~( h- R
                write_1602dat(0x30+Velocity/100);
7 D8 B+ R9 U6 J  O" F% s9 F+ h                if((Velocity/100+Velocity%100/10)==0)
2 b  ?8 }( l* I# H# G                write_1602dat(' ');
8 y. H3 c7 b4 e                else+ k7 [1 v0 u' A5 P! Q6 f. B
                write_1602dat(0x30+Velocity%100/10);
+ m3 W0 L9 k+ R2 S4 Z0 |. B                write_1602dat(0x30+Velocity%10);//数字+30得到该数字的LCD1602显示码
4 g5 p' f) U5 S9 d+ l6 w5 ^! _7 A/ x) w( l
                write_1602com(0x80+0x40+8);5 j2 j8 @% }" d+ ~5 b  l
                write_1602dat(0x30+Mileage/1000000);//数字+30得到该数字的LCD1602显示码) ]% J! @% s  Q: R8 i" |- t
                write_1602dat(0x30+Mileage%1000000/100000);//数字+30得到该数字的LCD1602显示码   s5 b' R. D/ \5 A4 t
                write_1602com(0x80+0x40+11);
, i. @- d) f) ]                write_1602dat(0x30+Mileage%100000/10000);//数字+30得到该数字的LCD1602显示码3 F9 `2 x5 l3 B* W( [+ i7 o9 a  z  X
                write_1602dat(0x30+Mileage%10000/1000);//数字+30得到该数字的LCD1602显示码- L# z. i% L$ m

9 r7 S5 R" z# o! _1 ~4 N2 c                write_1602dat(0x30+Mileage%1000/100);//数字+30得到该数字的LCD1602显示码9 f1 H3 Z( h( T$ [
}4 ]) ^2 d  `9 F
" S4 n; {' P( p) k/ E9 @
void main()
( J! ?, g5 M6 v/ Q4 S" m{
8 i" I% S% Z+ A7 m        init();
  j( G2 k; c. r. j7 G/ H        lcd_init();& D; ^- c+ S$ c
        while(1)
9 f$ }6 t+ X* h3 Y7 e( o7 \7 ?        {8 {  t8 z0 ?2 q4 O" _1 G
                display();
: j4 _% S/ }9 Z7 n: z! P) x/ `        }
8 s* Y8 l4 o, j( t4 G( B0 o3 i}
9 c+ b5 |1 Z$ T2 H, z$ t% ]* ^4 T" ]1 O& f
void EXINT0() interrupt 0
  r) P6 _( Z) v% o{
- W; f- e! g* d- `6 ]  ]! j( k! ~* @        count++;1 e  Z+ b( x& X
}
, o9 Z- k  a* a2 [$ B6 @6 h( _1 |/ I* u4 F0 ~8 s8 I5 q1 U
void time0() interrupt 1
- ~" x3 h# _& k8 y$ ^{+ L% X- A+ @* \  ~8 E' F
        uchar m;& f$ N, I4 G; _1 a
        TH0=0x3c;
% P9 y$ ^  f$ G8 ~4 H$ `        TL0=0xb0;         //50ms' K" ~0 K& R! K+ `4 h
        m++;
& \, K2 o! i( [4 h& ^/ D' J        if(m>=10)
7 w2 g8 c, C1 i1 I5 n' h        {1 H7 i8 ?3 A' m# I6 G/ J  d& p
                m=0;
! O& |: s+ A) @! @* ^                Mileage=Mileage+Velocity*500/36;                 //里程m=速度km/h*1000*5/3.6
; {6 G- b# l) ?8 B                Velocity=count/5;//将100ms内的脉冲数
$ |, u% ?7 x& N: M. N$ W  \                count=0;                " g3 c" w& X7 C# @1 {/ d) u

! L2 l8 \: t4 B2 y) [
% J  L! p% t7 @* Y2 s+ k…………限于本文篇幅 余下代码请从论坛下载附件…………
+ D  b7 e- k9 c3 x" P% |/ s

2 O, F8 M! b( u
游客,如果您要查看本帖隐藏内容请回复

+ O0 {' d/ z% O) c: g

该用户从未签到

2#
发表于 2018-11-29 09:36 | 只看该作者
这个程序精度能做到多少。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-8 08:17 , Processed in 0.078125 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表