找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7294|回复: 6
打印 上一主题 下一主题
收起左侧

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

  [复制链接]
跳转到指定楼层
楼主
简易自行车里程计仿真图


由于仿真中没有霍尔传感器,实际呢霍尔就是感应磁信号,输出高低电平的脉冲信号,这样用脉冲就可以了,不同的频率代表电机转速的快慢

单片机源程序:
  1. #include<reg52.h>

  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit COUNT_IN=P3^2;

  5. //定义1602相关管脚
  6. sbit rs=P2^7;
  7. sbit en=P2^6;

  8. uint count;
  9. unsigned long Velocity,Mileage;
  10. bit flag;
  11. uchar code tab1[]={"  Speed:      km/h"};        
  12. uchar code tab2[]={"Mileage:  .   km"};       

  13. void delay(uint x)
  14. {
  15.         uint i,j;
  16.         for(i=0;i<x;i++)
  17.         for(j=0;j<110;j++);
  18. }
  19. void init()
  20. {
  21.         IT0=1;        //INT0负跳变触发       
  22.     TMOD=0x01;//定时器工作于方式1
  23.         TH0=0x3c;          //50ms
  24.         TL0=0xb0;
  25.         EA=1; //CPU开中断总允许
  26.         ET0=1;//开定时中断
  27.         EX0=1;//开外部INTO中断
  28.     TR0=1;//启动定时
  29. }
  30. /********液晶写入指令函数与写入数据函数,以后可调用**************/

  31. void write_1602com(uchar com)//****液晶写入指令函数****
  32. {
  33.         rs=0;//数据/指令选择置为指令
  34.         P0=com;//送入数据
  35.         delay(1);
  36.         en=1;//拉高使能端,为制造有效的下降沿做准备
  37.         delay(1);
  38.         en=0;//en由高变低,产生下降沿,液晶执行命令

  39. }


  40. void write_1602dat(uchar dat)//***液晶写入数据函数****
  41. {
  42.         rs=1;//数据/指令选择置为数据
  43.         P0=dat;//送入数据
  44.         delay(1);
  45.         en=1; //en置高电平,为制造下降沿做准备
  46.         delay(1);
  47.         en=0; //en由高变低,产生下降沿,液晶执行命令
  48. }


  49. void lcd_init()//***液晶初始化函数****
  50. {
  51.         uchar a;
  52.         write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
  53.         write_1602com(0x0c);//开显示不显示光标
  54.         write_1602com(0x06);//整屏不移动,光标自动右移
  55.         write_1602com(0x01);//清显示

  56.         write_1602com(0x80);//显示固定符号从第一行第1个位置之后开始显示
  57.         for(a=0;a<16;a++)
  58.         {
  59.                 write_1602dat(tab1[a]);//向液晶屏写固定符号部分
  60.         }
  61.         write_1602com(0x80+0x40);//显示固定符号写入位置,从第2个位置后开始显示
  62.         for(a=0;a<16;a++)
  63.         {
  64.                 write_1602dat(tab2[a]);//写显示固定符号
  65.         }
  66. }

  67. void display()
  68. {
  69.                 //                        1km/h=100m/0.1h                   360s
  70.                 //                        10km/h=100m/0.01h          36s
  71.                 //                        100km/h=100m/0.001h  3.6s

  72.                 write_1602com(0x80+9);
  73.                 if(Velocity/100==0)
  74.                 write_1602dat(' ');
  75.                 else
  76.                 write_1602dat(0x30+Velocity/100);
  77.                 if((Velocity/100+Velocity%100/10)==0)
  78.                 write_1602dat(' ');
  79.                 else
  80.                 write_1602dat(0x30+Velocity%100/10);
  81.                 write_1602dat(0x30+Velocity%10);//数字+30得到该数字的LCD1602显示码

  82.                 write_1602com(0x80+0x40+8);
  83.                 write_1602dat(0x30+Mileage/1000000);//数字+30得到该数字的LCD1602显示码
  84.                 write_1602dat(0x30+Mileage%1000000/100000);//数字+30得到该数字的LCD1602显示码
  85.                 write_1602com(0x80+0x40+11);
  86.                 write_1602dat(0x30+Mileage%100000/10000);//数字+30得到该数字的LCD1602显示码
  87.                 write_1602dat(0x30+Mileage%10000/1000);//数字+30得到该数字的LCD1602显示码
  88.                
  89.                 write_1602dat(0x30+Mileage%1000/100);//数字+30得到该数字的LCD1602显示码
  90. }

  91. void main()
  92. {
  93.         init();
  94.         lcd_init();
  95.         while(1)
  96.         {
  97.                 display();
  98.         }
  99. }

  100. void EXINT0() interrupt 0
  101. {
  102.         count++;
  103. }

  104. void time0() interrupt 1
  105. {
  106.         uchar m;
  107.         TH0=0x3c;
  108.         TL0=0xb0;         //50ms
  109.         m++;
  110.         if(m>=10)
  111.         {
  112.                 m=0;
  113.                 Mileage=Mileage+Velocity*500/36;                 //里程m=速度km/h*1000*5/3.6
  114.                 Velocity=count/5;//将100ms内的脉冲数
  115.                 count=0;               


  116. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

下载:
仿真图.zip (3.65 MB, 下载次数: 118)



评分

参与人数 1黑币 +5 收起 理由
我的天1 + 5 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶4 踩
回复

使用道具 举报

沙发
ID:311504 发表于 2018-5-9 17:02 | 只看该作者
请问测速程序怎么理解
回复

使用道具 举报

板凳
ID:324958 发表于 2018-5-14 11:56 | 只看该作者
为什么我在proteus上运行出错,就是down下来直接运行的
回复

使用道具 举报

地板
ID:360292 发表于 2018-6-28 17:21 | 只看该作者
很好的程序!!!
回复

使用道具 举报

5#
ID:197418 发表于 2018-7-18 10:19 | 只看该作者
ATKL 发表于 2018-5-9 17:02
请问测速程序怎么理解

思路:定时器定时1S ,外部中断检测脉冲,定时器中断,计算脉冲量。
回复

使用道具 举报

6#
ID:578499 发表于 2019-7-26 16:12 | 只看该作者
有没有原理图、
回复

使用道具 举报

7#
ID:731979 发表于 2020-4-18 22:43 | 只看该作者
学姐太棒了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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