找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC15单片机测量位移 电路原理图 PCB 程序源代码

  [复制链接]
跳转到指定楼层
楼主
         


       本系统,主要用于测量实验台移动的位移。单片机通过步进电机驱动器控制步进电机转动,从而驱动实验台在导轨上的水平位移,再通过位移传感器实时检测位移值,并可以通过LCD1602或串口屏显示位移值和其他一些参数。
        本系统采用STC15W4KS32单片机为控制核心,其上的44个引脚全部引出,该控制器既可以实现驱动电机和显示位移功能,还可以充当51学习开发板的功能。



电路原理图:


二、接口资源分配
1 单片机最小系统
MCU:STC15W4KS32,这里选用LQFP44封装。
资源简介:42I/O,4KB RAM,32KB FLASH,810ADC通道,SPI接口,4路串口。价格:6元左右。
晶振电路(可选)
复位电路(可选)
下载电路:串口下载或USB下载(可选)
2 步进电机驱动器
PUL-P1.0
DIR-P1.1
其余四个引脚接5V电源。
3 LCD1602显示模块
需要11GPIO
4 LED灯指示
电源指示灯1个,上电即亮;
运行指示灯2个,正转和反转各1个,不同颜色;
报警指示灯1个。
5 蜂鸣器指示
需要1GPIO
6传感器接口电路
电阻式位移传感器,输出0~5V,需要接到单片机的AD接口上,进行AD转换。
方案1:使用单片机内部的10AD转换器,理论上讲,刚好能够满足要求,电路按照芯片手册设计;
方案2:使用AD7705模块,该模块拥有16位转换精度,SPI接口,能够保证系统对精度的要求。
控制板上预留模块接口,如果内部ADC无法满足要求,直接用更高精度ADC模块。
7 按键接口
启动1个,停止1个,正反转1个,预留1个。
8 电源部分
全部采用5V供电。
9 串口通信电路
预留了2路串行通信接口,一路为下载,另一路可用作通信,进行串口调试。
一、本系统的创新之处
1、原理图的绘制,采用九宫格形式,清晰容易理解。
2、双电源供电,既可以使用5V电源适配器,也可以使用USB电源,USB可来自电脑,也可以来自随手可得的手机充电器;使用一个拨动开关进行切换,既方便又提高了产品的灵活性;
3、双下载方式,既可以使用RS-232串口进行下载,也可以使用USB下载方式,这里,用到了STC15W4KS32的独特下载方式,其他51系列单片机暂不具备此功能;
4、双路选择ADC转换,一路为片内自带ADC模块,预留了基准参考电路,一般情况下,可以选择不焊接;另一路为高精度的AD7705模块接口,当片内自带的ADC模块难以满足高精度要求时,采用成熟可靠的ADC模块;
5、双路显示接口,正常情况下,选择LCD1602液晶屏,可以显示字母、数字和字符,满足系统要求,如果想要现实汉字,可以选用OLED显示模块,LCD1602接口同时兼容OLED模块,所以一个接口满足了2个需求;
6、双路LED灯显示,一路为贴片式,减少了体积,同时,还增加了直插式LED灯,满足将来做外壳时,为了方便观察,需要把LED灯露在外壳表面,没做外壳前,可不焊接直插式;
7、步进电机驱动器接口为6线插座,与接口一一对应,即插即用;释放功能可用。
8、双串口通信,这款单片机本身拥有4个串口,这里使用了2个,满足要求;
9、双路按键,既有4个独立按键,又预留了矩阵键盘接口,将来做外壳时,按键可以有多种选择,总共有8个接口,非常灵活;
10、         预留了一个IIC传感器接口,既可以接常用的18B20温度传感器,又可以接AM2320温湿度传感器;
11、         最小系统非常简单,晶振电路和复位电路都可以省去,但是预留了相应电路,觉得有必要可以焊上。
系统简介
       本系统,主要用于测量实验台移动的位移。单片机通过步进电机驱动器控制步进电机转动,从而驱动实验台在导轨上的水平位移,再通过位移传感器实时检测位移值,并可以通过LCD1602或串口屏显示位移值和其他一些参数。
       本系统采用STC15W4KS32单片机为控制核心,其上的44个引脚全部引出,该控制器既可以实现驱动电机和显示位移功能,还可以充当51学习开发板的功能。


测量位移的源程序:


  1. #include "key.h"
  2. uint num1=900;
  3. uchar dir_flag;                                //定义全局变量
  4. uchar key_flag=0;                        //点动或连动标志,指示某个键被按下,点动 1,连动 2


  5. /*********************按键扫描函数*********
  6. 功能介绍:
  7. key1:左方向,点动;
  8. key2:左方向,连动;
  9. key3:右方向,连动;
  10. key1:右方向,点动;
  11. ********************************************/
  12. /*
  13. void keyscan()
  14. {
  15.            
  16.                 if((key1==0)&&(left_dir_key==1))
  17.                    {
  18.                          delay_ms(5);                 
  19.                         if(key1==0)
  20.                            TR0=1;
  21. //                            TR0=~TR0;
  22.                            EN_DRIVER=1;                        //启动电机
  23.                            DIR_DRIVER=1;                //方向控制
  24.                            dir_flag=1;                                   //向左前进
  25.                                 key_flag=1;  
  26.                                 delay_ms(5);
  27. //                                adc++;
  28.                          while(!key1);
  29.                            TR0=0;
  30.                     }

  31.                 else if((key2==0)&&(left_dir_key==1))
  32.                    {
  33.                          delay_ms(5);
  34.                         if(key2==0)
  35.                           TR0=~TR0;
  36.                           EN_DRIVER=1;                        //启动电机
  37.                           DIR_DRIVER=1;                        //方向控制
  38.                           dir_flag=1;                                   //向左前进
  39.                                   key_flag=2;        
  40.                          while(!key2);
  41.                     }

  42.                 else if((key3==0)&&(right_dir_key==1))
  43.                    {
  44.                          delay_ms(5);         
  45.                         if(key3==0)
  46.                            TR0=~TR0;
  47.                            EN_DRIVER=1;                        //启动电机
  48.                            DIR_DRIVER=0;                //方向控制
  49.                            dir_flag=2;                                   //向左前进
  50.                            key_flag=2;        
  51.                          while(!key3);
  52.                     }

  53.                 else if((key4==0)&&(right_dir_key==1))
  54.                    {
  55.                          delay_ms(5);         
  56.                         if(key4==0)
  57. //                           TR0=~TR0;
  58.                            TR0=1;
  59.                            EN_DRIVER=1;                        //启动电机
  60.                            DIR_DRIVER=0;                //方向控制
  61.                            dir_flag=2;                                   //向左前进
  62.                            key_flag=1;        
  63.                            delay_ms(5);
  64.                          while(!key4);
  65.                            TR0=0;
  66.                     }
  67.                 else
  68. //                         TR0=0;                //关闭定时器0
  69.                
  70.                 ;
  71. //                        EN_DRIVER=0;                //电机释放,保护电机        

  72. }

  73. */
  74. /*********************电机控制,
  75.                                         先进行距离状态的判定,
  76.                                         当 100>adc,左边方向按键失效;
  77.                                         当 100=<adc=<900,四个方向按键均有效;
  78.                                         当 900<adc,右边方向按键失效。

  79. *************************/
  80. void Motor_Control(void)
  81. {
  82.         if(adc_dis<100)
  83.         {
  84.                  EN_DRIVER=0;                        //关闭电机
  85.                  if(key3==0)
  86.                            {
  87.                          delay_ms(5);                 
  88.                         if(key3==0)
  89.                            TR0=1;                                 //点动模式
  90.                            EN_DRIVER=1;                        //启动电机
  91.                            DIR_DRIVER=1;                //方向控制
  92.                            key_flag=1;
  93.                            dir_flag=2;                           //向右前进
  94.                                 delay_ms(5);
  95.                          while(!key3);
  96.                            TR0=0;
  97.                     }

  98.                  if(key4==0)
  99.                    {
  100.                          delay_ms(5);
  101.                         if(key4==0)
  102.                           TR0=~TR0;                                //连动模式
  103.                           EN_DRIVER=1;                        //启动电机
  104.                           DIR_DRIVER=1;                        //方向控制
  105.                           key_flag=2;
  106.                           dir_flag=2;                           //向右前进
  107.                          while(!key4);
  108.                     }        
  109.         }

  110.         else if((100<=adc_dis)&&(adc_dis<=900))
  111.         {        
  112.                 if(key1==0)
  113.                            {
  114.                          delay_ms(5);                 
  115.                         if(key1==0)
  116.                            TR0=1;                                //点动模式
  117.                            EN_DRIVER=1;                        //启动电机
  118.                            DIR_DRIVER=0;                //方向控制
  119.                            key_flag=1;
  120.                            dir_flag=1;                           //向左前进
  121.                                 delay_ms(5);
  122.                          while(!key1);
  123.                            TR0=0;
  124.                     }

  125.                 else if(key2==0)
  126.                    {
  127.                          delay_ms(5);
  128.                         if(key2==0)
  129.                           TR0=~TR0;                                 //连动模式
  130.                           EN_DRIVER=1;                        //启动电机
  131.                           DIR_DRIVER=0;                        //方向控制
  132.                           key_flag=2;
  133.                           dir_flag=1;                           //向左前进        
  134.                          while(!key2);
  135.                     }

  136.                 else if(key3==0)
  137.                    {
  138.                          delay_ms(5);         
  139.                         if(key3==0)
  140.                            TR0=~TR0;                        //连动模式
  141.                            EN_DRIVER=1;                        //启动电机
  142.                            DIR_DRIVER=1;                //方向控制
  143.                            key_flag=2;
  144.                            dir_flag=2;                           //向右前进        
  145.                          while(!key3);
  146.                     }

  147.                 else if(key4==0)
  148.                    {
  149.                          delay_ms(5);         
  150.                         if(key4==0)
  151.                            TR0=1;                                //点动模式
  152.                            EN_DRIVER=1;                        //启动电机
  153.                            DIR_DRIVER=1;                //方向控制
  154.                            key_flag=1;
  155.                            dir_flag=2;                           //向右前进
  156.                            delay_ms(5);
  157.                          while(!key4);
  158.                            TR0=0;
  159.                     }
  160.                   else
  161.                   ;
  162.         
  163.         }
  164.         else if(adc_dis>900)
  165.         {
  166.           EN_DRIVER=0;                        //关闭电机
  167.                     if(key1==0)
  168.                    {
  169.                          delay_ms(5);         
  170.                         if(key1==0)
  171.                            TR0=1;                                //点动模式
  172.                            EN_DRIVER=1;                        //启动电机
  173.                            DIR_DRIVER=0;                //方向控制
  174.                            key_flag=1;
  175.                            dir_flag=1;                           //向左前进        
  176.                            delay_ms(5);
  177.                          while(!key1);
  178.                            TR0=0;
  179.                     }
  180.                     if(key2==0)
  181.                    {
  182.                         delay_ms(5);         
  183.                         if(key2==0)
  184.                            TR0=~TR0;                        //连动模式
  185.                            EN_DRIVER=1;                        //启动电机
  186.                            DIR_DRIVER=0;                //方向控制
  187.                            key_flag=2;
  188.                            dir_flag=1;                           //向左前进        
  189.                          while(!key2);
  190.                     }

  191.         }                                                                                                                                             
  192.         else
  193.         ;

  194. }

  195.         
复制代码



全部资料(压缩包)下载:



STC15.zip

129.36 KB, 下载次数: 103, 下载积分: 黑币 -5

原理图和PCB.zip

739.92 KB, 下载次数: 120, 下载积分: 黑币 -5

基于STC15单片机的测距系统.rar

54.88 KB, 下载次数: 107, 下载积分: 黑币 -5

评分

参与人数 2黑币 +57 收起 理由
wuke960422 + 30 很给力!
wqphdh + 27 很给力!

查看全部评分

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

使用道具 举报

沙发
ID:153199 发表于 2017-1-24 16:59 | 只看该作者
不错的帖子,很值得收藏。
回复

使用道具 举报

板凳
ID:64765 发表于 2017-4-25 10:34 | 只看该作者
不错的帖子,很值得收藏。
回复

使用道具 举报

地板
ID:193918 发表于 2017-4-27 17:33 | 只看该作者
不错的帖子,很值得收藏。
回复

使用道具 举报

5#
ID:16642 发表于 2017-6-2 22:48 | 只看该作者
好祥细。。。
回复

使用道具 举报

6#
ID:95360 发表于 2017-6-9 15:40 | 只看该作者
不错的帖子,很值得收藏
回复

使用道具 举报

7#
ID:433641 发表于 2018-11-26 18:57 | 只看该作者
不错的帖子,值得收藏
回复

使用道具 举报

8#
ID:153520 发表于 2018-12-25 20:11 | 只看该作者
需要该资源..
回复

使用道具 举报

9#
ID:153520 发表于 2018-12-25 20:12 | 只看该作者
这个状态图是怎么画的,用的什么软件...
回复

使用道具 举报

10#
ID:153520 发表于 2018-12-25 20:39 | 只看该作者
版主啊,帮忙收费低点啊,没钱啊
回复

使用道具 举报

11#
ID:454887 发表于 2018-12-25 21:17 | 只看该作者
不错的帖子,很值得收藏
回复

使用道具 举报

12#
ID:511458 发表于 2019-4-13 19:58 | 只看该作者
不错的帖子,很值得收藏
回复

使用道具 举报

13#
ID:494577 发表于 2019-9-20 16:24 | 只看该作者
最近正需要这方面的资料,关于电阻式位移传感器的应用。多谢
回复

使用道具 举报

14#
ID:494577 发表于 2019-9-20 16:43 | 只看该作者
想问下楼主买的电阻式位移传感器是什么型号的?能告诉具体的型号吗
回复

使用道具 举报

15#
ID:24486 发表于 2020-3-4 22:43 | 只看该作者
不错的帖子,很值得收藏。
回复

使用道具 举报

16#
ID:24486 发表于 2020-3-14 15:24 | 只看该作者
谢谢分享,下来看看。
回复

使用道具 举报

17#
ID:708014 发表于 2020-3-14 23:40 | 只看该作者
学习了谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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