找回密码
 立即注册

QQ登录

只需一步,快速开始

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

萌新求教和师兄想做风压自动窗帘系统,单片机接了传感器后,电机一直转,停不下来

[复制链接]
跳转到指定楼层
楼主
大一,和师兄做了一个风压自动控制系统,当风压达到一定程度,电机自转,带动窗帘的关闭,但是程序不管怎么改,电机一直转,根本停不下来,没风的时候本来该停下来,但是还是在转,大佬们,救救孩子们吧!

单片机源程序如下:
  1. #include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器
  2. #include"XPT2046.h"   

  3. typedef unsigned int u16;      //对数据类型进行声明定义
  4. typedef unsigned char u8;

  5. sbit LSA=P2^2;
  6. sbit LSB=P2^3;
  7. sbit LSC=P2^4;
  8. sbit IN1=P2^0;
  9. sbit IN2=P2^1;



  10. u8 disp[4];
  11. u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  12. u8 text=0,flag=0;
  13. u8 text1=0,flag1=0;

  14. /*******************************************************************************
  15. * 函 数 名         : delay
  16. * 函数功能           : 延时函数,i=1时,大约延时10us
  17. *******************************************************************************/

  18. void delay(u16 i)
  19. {
  20.     while(i--);   
  21. }
  22. void run()
  23. {
  24.     u8 i;
  25.     IN1=IN2=0;
  26.     for(i=0;i<100;i++)      //循环100次,也就是大约5S
  27.     {
  28.         IN1=1;
  29.         IN2=0;             //开启电机
  30.         delay(5000);    //大约延时50ms
  31.     }
  32.     IN1=IN2=0;


  33. }
  34. void frun()
  35. {
  36.     u8 i;
  37.     IN1=IN2=0;
  38.     for(i=0;i<100;i++)      //循环100次,也就是大约5S
  39.     {
  40.         IN1=0;
  41.         IN2=1;             //开启电机
  42.         delay(5000);    //大约延时50ms
  43.     }
  44.     IN1=IN2=0;

  45.    
  46. }
  47. /*******************************************************************************
  48. * 函数名         :datapros()
  49. * 函数功能         :数据处理函数
  50. * 输入           : 无
  51. * 输出              : 无
  52. *******************************************************************************/
  53. void datapros()
  54. {
  55.     u16 temp;
  56.     static u8 i;
  57.     i++;
  58.     if(i==50)
  59.     {
  60.         i=0;
  61.         temp = Read_AD_Data(0xE4);        //   AIN3 外部输入
  62.     }
  63.    
  64. //    disp[0]=smgduan[temp/1000];//千位
  65.     disp[0]=1;//千位
  66.     disp[1]=smgduan[temp%1000/100];//百位
  67.     disp[2]=smgduan[temp%1000%100/10];//个位
  68.     disp[3]=smgduan[temp%1000%100%10];        
  69. }


  70. /*******************************************************************************
  71. * 函数名         :DigDisplay()
  72. * 函数功能         :数码管显示函数
  73. * 输入           : 无
  74. * 输出              : 无
  75. *******************************************************************************/
  76. void DigDisplay()
  77. {
  78.     u8 i;
  79.     for(i=0;i<4;i++)
  80.     {
  81.         switch(i)     //位选,选择点亮的数码管,
  82.         {
  83.             case(0):
  84.                 LSA=1;LSB=1;LSC=1; break;//显示第0位
  85.             case(1):
  86.                 LSA=0;LSB=1;LSC=1; break;//显示第1位
  87.             case(2):
  88.                 LSA=1;LSB=0;LSC=1; break;//显示第2位
  89.             case(3):
  90.                 LSA=0;LSB=0;LSC=1; break;//显示第3位   
  91.         }
  92.         P0=disp[i];//发送数据
  93.         delay(100); //间隔一段时间扫描   
  94.         P0=0x00;//消隐
  95.     }        
  96. }
  97. void Text_Init()
  98. {
  99.     if (disp[0]>=3 && disp[0] != text)
  100.     {
  101.           text = disp[0];
  102.           flag = 1;
  103.     }
  104. }
  105. void Text_Init1()
  106. {
  107.     if (disp[0]<3 && disp[0] != text)
  108.     {
  109.           text = disp[0];
  110.           flag1 = 1;
  111.     }
  112. }
  113. /*******************************************************************************
  114. * 函 数 名       : main
  115. * 函数功能         : 主函数
  116. * 输    入       : 无
  117. * 输    出         : 无
  118. *******************************************************************************/
  119. void main()
  120. {   
  121.     while(1)
  122.     {
  123.         run();
  124.         datapros();     //数据处理函数
  125.         DigDisplay();
  126.         Text_Init();
  127.         Text_Init1();
  128.         if(disp[0]>=3)
  129.         {
  130.             if(disp[0]>=3)
  131.             {
  132.                        if(flag=1)
  133.                 {
  134.                     run();
  135.                     flag = 0;
  136.                 }
  137.              }
  138.          }
  139.          if(disp[0]<3)
  140.         {
  141.             if(disp[0]<3)
  142.             {
  143.                        if(flag1=1)
  144.                 {
  145.                     run();
  146.                     flag1= 0;
  147.                 }
  148.              }
  149.          }   
  150.         
  151.     }        
  152. }
复制代码

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

使用道具 举报

沙发
ID:805016 发表于 2020-8-25 11:01 | 只看该作者
这是我那块板子的原理图


A2开发板原理图.pdf

227.86 KB, 下载次数: 13

回复

使用道具 举报

板凳
ID:805016 发表于 2020-8-25 11:02 | 只看该作者
这是我们用到的传感器

1598324106874.jpg (2.79 MB, 下载次数: 75)

1598324106874.jpg
回复

使用道具 举报

地板
ID:332444 发表于 2020-8-25 12:48 | 只看该作者
主函数内不受限制地运行run();当然电机一直转动
回复

使用道具 举报

5#
ID:805016 发表于 2020-8-26 10:59 | 只看该作者
xianfajushi 发表于 2020-8-25 12:48
主函数内不受限制地运行run();当然电机一直转动

如果我去掉的话,也是这样,我设置if语句没什么用

回复

使用道具 举报

6#
ID:517429 发表于 2020-8-26 13:26 | 只看该作者
本帖最后由 666的付同学 于 2020-8-26 16:01 编辑

你这程序我瞄了一下,写的很不规范啊,疯狂调用死循环延时,数码管显示处理的也很不好,白白占用了许多ROM,更关键的是if语句都有问题,这里需要的是逻辑等==,而不是=,所以你主函数里的if语句出了问题。
回复

使用道具 举报

7#
ID:805016 发表于 2020-8-26 15:35 | 只看该作者
666的付同学 发表于 2020-8-26 13:26
你这程序我瞄了一下,写的很不规范啊,疯狂调用死循环延时,数码管显示处理的也很不好,白白占用了许多ROM ...

新手,刚开始学习
回复

使用道具 举报

8#
ID:805016 发表于 2020-8-26 15:39 | 只看该作者
666的付同学 发表于 2020-8-26 13:26
你这程序我瞄了一下,写的很不规范啊,疯狂调用死循环延时,数码管显示处理的也很不好,白白占用了许多ROM ...

大佬,我请教一下,我不知道用什么样的C语言结构,比如当输入信号为3-4v时,我们想让电机run,信号1-2frun时,但只转一次,除非信号范围变换,电机不转,什么样的结构可以达成这个效果
回复

使用道具 举报

9#
ID:517429 发表于 2020-8-26 16:57 | 只看该作者
932585241 发表于 2020-8-26 15:39
大佬,我请教一下,我不知道用什么样的C语言结构,比如当输入信号为3-4v时,我们想让电机run,信号1-2fru ...

这跟结构没什么关系,我只是说你写的程序有些地方不是很合理,至于输入信号为3到4V时电机转动,这就用到AD转换了,因为单片机只能识别数字量,还有给你一个忠告,尽量别用delay,多用定时器。
回复

使用道具 举报

10#
ID:230118 发表于 2020-8-26 18:26 | 只看该作者
编码的风格还可以,逻辑有些混乱,问题较明显,是不是没仔细检查自己代码
1  //    disp[0]=smgduan[temp/1000];//千位
    disp[0]=1;//千位
    disp[1]=smgduan[temp%1000/100];//百位
    disp[2]=smgduan[temp%1000%100/10];//个位
    disp[3]=smgduan[temp%1000%100%10];  
这个下标需要这样计算吗
temp%1000%100  和 temp%100 的结果相等
2 main函数中开始的run()是多余的
3 datapros()函数中disp[0]=1;//千位 每次都把disp[0]赋值为1了,后面的if(disp[0]>=3)有可能为真吗,编译时候难道没有警告说有不可能进入的分支?
4 text、text1做什么用的你知道吗,应该是用来保存上一次切换的时候的AD值,只有在状态有变化时候才操作风扇开关,而你根本没用到
5 电机开关是一个开关量,不理解为什么要循环操作100次,只要你的电路设计没问题,不要怀疑IO操作会失效。

综上,推测你这是参考别人程序改的,但没真正看懂别人程序,所以改的乱七八糟
回复

使用道具 举报

11#
ID:582903 发表于 2020-9-16 15:28 | 只看该作者
风压的量应该成为电机是否运转的条件
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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