找回密码
 立即注册

QQ登录

只需一步,快速开始

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

自己做的51单片机测长度,oled显示

  [复制链接]
跳转到指定楼层
楼主
ID:291220 发表于 2018-8-16 10:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
制作出来实物图如下:



单片机源程序如下:
  1. #include "REG51.h"
  2. #include "oled.h"
  3. #include "bmp.h"
  4. # define  uchar unsigned char
  5. # define uint unsigned int
  6. sbit D0=P3^2;


  7. int motor=0,t=0,S=0,juli=0;
  8. u8 shu,bai,shi,ge,distance;
  9. u8 code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','.','M'};
  10. u8 disbuff[5]           ={ 0,0,0,0,0};
  11. u8 buff[5] ={0,0,0,0,0}         ;
  12. u8 sbuff[5]                  ={0,0,0,0,0};
  13. void delay (uint z)
  14. { uint x,y;
  15.   for (x=600;x>0;x--)
  16.           for (y=z;y>0;y--);
  17. }

  18. void INT_init (void)
  19. {  EA=1;

  20.   EX0=1;
  21. IT0=1;      
  22. }
  23. void main(void )

  24. {        OLED_Init();                        //初始化OLED  
  25.         OLED_Clear();
  26.         INT_init();
  27.       
  28.         while (1)
  29.         {
  30.                            OLED_ShowCHinese(0,0,0);
  31.                                             OLED_ShowCHinese(18,0,1);
  32.                                             OLED_ShowCHinese(36,0,2);
  33.                                             OLED_ShowCHinese(54,0,3);
  34.                                                 distance=(motor/20)*22;
  35.                                                         if(motor==256)
  36.                                                           {        motor=0;
  37.                                                                   t++;
  38.                                                              }
  39.                                                 disbuff[0]=distance/1000;
  40.                                                 disbuff[1]=distance%1000/100;
  41.                                        disbuff[2]=distance%100/10;
  42.                                             disbuff[3]=distance%10;
  43.                                                 disbuff[4]=t;
  44.                                                   OLED_ShowChar(0, 3, ASCII[disbuff[0]]);
  45.                                                   OLED_ShowChar(15, 3, ASCII[disbuff[1]]);
  46.                                                 OLED_ShowChar(30, 3, ASCII[12]);      
  47.                                                    OLED_ShowChar(45, 3, ASCII[disbuff[2]]);
  48.                                                  OLED_ShowChar(60, 3, ASCII[disbuff[3]]);
  49.                                                  OLED_ShowChar(75, 3, ASCII[13]);
  50.                                                   OLED_ShowChar(120, 0, ASCII[disbuff[4]]);
  51.                                                   S=256*t;
  52.                                                 /*  buff[0]=S/1000;
  53.                                                 buff[1]=S/100;
  54.                                        buff[2]=S%100/10;
  55.                                             buff[3]=S%10;
  56.                                                
  57.                                                   OLED_ShowChar(0, 7, ASCII[buff[0]]);                 0
  58.                                                   OLED_ShowChar(15, 7, ASCII[buff[1]]);
  59.                                                 OLED_ShowChar(30, 7, ASCII[12]);      
  60.                                                    OLED_ShowChar(45, 7, ASCII[buff[2]]);
  61.                                                  OLED_ShowChar(60, 7, ASCII[buff[3]]);
  62.                                                  OLED_ShowChar(75, 7, ASCII[13]);*/
  63.                                        
  64.                                                 juli=S+distance;
  65.                                                           sbuff[0]=juli/1000;
  66.                                                 sbuff[1]=juli%1000/100;
  67.                                        sbuff[2]=juli%100/10;
  68.                                             sbuff[3]=juli%10;
  69.                                                
  70.                                                   OLED_ShowChar(0, 7, ASCII[sbuff[0]]);
  71.                                                   OLED_ShowChar(15, 7, ASCII[sbuff[1]]);
  72.                                                 OLED_ShowChar(30, 7, ASCII[12]);      
  73.                                                    OLED_ShowChar(45, 7, ASCII[sbuff[2]]);
  74.                                                  OLED_ShowChar(60, 7, ASCII[sbuff[3]]);
  75.                                                  OLED_ShowChar(75, 7, ASCII[13]);
  76.                 delay(50);               
  77.                
  78.                 OLED_Clear();
  79.                 }

  80. }
复制代码

所有资料51hei提供下载:
中景园电子0.96OLED显示屏_C51系列_IIC_例程推荐使用.zip (115.08 KB, 下载次数: 81)


评分

参与人数 2黑币 +55 收起 理由
青衿已去 + 5
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:1 发表于 2018-8-16 17:58 | 只看该作者
好东东,楼主能简单的介绍一下吗?
回复

使用道具 举报

板凳
ID:291220 发表于 2018-8-17 16:00 | 只看该作者
admin 发表于 2018-8-16 17:58
好东东,楼主能简单的介绍一下吗?

测速模块的 OUT 口链接 MCU 的外部中断口,每当有红外射线导通就是一个外部缓冲。
测距离:
测速传感器输出为脉冲信号,一个脉冲中断一次;红外射线导通的时候是低电平,所以我们设置中断为低
电平触法模式。一般码盘上有整数格子,无论是多少格其实原理一样,例如 20 格码盘,也就是有 20 个空
格子,电机转一圈后便是射线导通 20 次,外部低电平触法 20 次;
安装上面的思路,我们的测速传感器就可以发挥出效果了,我们知道一圈就有 20个中断,于是我们计算中
断次数,得到的总次数除于 20 也就是电机转动次数了,然后按照轮子的周长,计算轮子一圈是多长,就可
以推算出小车已经跑多远了。

当然也可以测速度:
按照测距离的思路,我们用一个 MCU 定时器计算,1 秒内接收多少个外部中断,例如一秒内接收了 20 个
外部中断,我们就可以判断小车速度为 1 秒小车轮子转两圈,然后再计算出小车轮子的周长,就可得知小
车 1 秒行驶的速度
大家不妨可以试试

评分

参与人数 1黑币 +100 收起 理由
admin + 100 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:291220 发表于 2018-8-18 15:46 | 只看该作者
最终实物图

psb.jpg (73.24 KB, 下载次数: 64)

最终实物图

最终实物图

psb.jpg (72.12 KB, 下载次数: 62)

psb.jpg

psb.jpg (173.78 KB, 下载次数: 74)

psb.jpg

评分

参与人数 1黑币 +60 收起 理由
admin + 60 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:387638 发表于 2018-8-18 17:40 | 只看该作者

这个很好耶
回复

使用道具 举报

6#
ID:332956 发表于 2018-8-20 15:30 | 只看该作者
这个好玩。是不是推着走一圈,就跟画白线似的?
回复

使用道具 举报

7#
ID:46999 发表于 2018-8-20 19:31 | 只看该作者
编译报错.C(53): warning C209: '_OLED_ShowChar': too few actual parameters
回复

使用道具 举报

8#
ID:369368 发表于 2019-2-23 22:54 | 只看该作者
刷新的可快,用51单片机控制OLED显示字它总是一闪一闪的
回复

使用道具 举报

9#
ID:648535 发表于 2019-11-28 10:40 | 只看该作者
显示的数据很准确吗?
回复

使用道具 举报

10#
ID:445025 发表于 2019-12-24 20:09 | 只看该作者
请问一下有proteus的仿真吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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