标题: 自己做的51单片机测长度,oled显示 [打印本页]

作者: wkings    时间: 2018-8-16 10:03
标题: 自己做的51单片机测长度,oled显示
制作出来实物图如下:



单片机源程序如下:
  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)



作者: admin    时间: 2018-8-16 17:58
好东东,楼主能简单的介绍一下吗?
作者: wkings    时间: 2018-8-17 16:00
admin 发表于 2018-8-16 17:58
好东东,楼主能简单的介绍一下吗?

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

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

作者: fud    时间: 2018-8-18 17:40
wkings 发表于 2018-8-18 15:46
最终实物图

这个很好耶
作者: 羊羽子    时间: 2018-8-20 15:30
这个好玩。是不是推着走一圈,就跟画白线似的?
作者: 维超    时间: 2018-8-20 19:31
编译报错.C(53): warning C209: '_OLED_ShowChar': too few actual parameters
作者: 乐点点    时间: 2019-2-23 22:54
刷新的可快,用51单片机控制OLED显示字它总是一闪一闪的
作者: libei    时间: 2019-11-28 10:40
显示的数据很准确吗?
作者: 楼上小白317    时间: 2019-12-24 20:09
请问一下有proteus的仿真吗




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1