数码之家

 找回密码
 立即注册
搜索
查看: 4104|回复: 35

[C51] 不会单片机求个简单程序,求教各位前辈达人

[复制链接]
发表于 2020-6-25 16:26:58 | 显示全部楼层 |阅读模式
500家元
不会写单片机程序 ,求一个检测电平输出延迟输出高低电平程序。
程序基本要求简单不知道单片机难不难实现。求教各位前辈达人
要求:
1检测到高电平延迟5秒输出高电平一直到高电平消失
2检测到低电平延时10秒左右输出高电平然后输出电平


现有单片机 STC 16w104  各位前辈如果不能实现 也可以推荐比体积小的单片机IC


最佳答案

查看完整内容

延时时,如果状态改变,则重新计时
发表于 2020-6-25 16:26:59 | 显示全部楼层

延时时,如果状态改变,则重新计时
  1. #include "STC_NEW_8051.H"
  2. #include "intrins.h"

  3. typedef unsigned char uint8;
  4. typedef unsigned int uint;

  5. sbit Input = P3^2;                //电平检测脚
  6. sbit Out1  = P3^0;                //输出1
  7. sbit Out2  = P3^1;                //输出2

  8. bit KeyStaNow,KeyStaPre,KeyStaChg,timerOut;
  9. uint ms5,needTime;

  10. void int0_init(void)
  11. {
  12.         IT0 = 0; //上升沿和下降沿
  13.         EX0 = 1;
  14.         EA = 1;
  15. }

  16. void Timer2Init(void)                //5毫秒@11.0592MHz
  17. {
  18.         AUXR |= 0x04;                //定时器时钟1T模式
  19.         T2L = 0x00;                //设置定时初值
  20.         T2H = 0x28;                //设置定时初值
  21.         AUXR |= 0x10;                //定时器2开始计时
  22. }

  23. void int0_isr() interrupt 0
  24. {
  25.         KeyStaPre = KeyStaNow;
  26.         KeyStaChg = 1;
  27.         KeyStaNow = Input;
  28. }


  29. void t2_isr() interrupt 12 using 1
  30. {
  31.         ms5++;
  32.         if(needTime<=ms5)
  33.         {
  34.                 timerOut = 1;
  35.         }
  36. }

  37. void needTime5ms(uint i){
  38.         ms5=0;
  39.         needTime = i;
  40. }

  41. main()
  42. {
  43.         int0_init();
  44.         Timer2Init(); IE2 |= 0x04;

  45.         while (1){
  46.                 if(KeyStaChg){           //按键发生改变
  47.                         KeyStaChg=0;
  48.                         if(KeyStaNow){
  49.                                 needTime5ms(2*1000/5);
  50.                         }
  51.                         else
  52.                         {
  53.                                 needTime5ms(5*1000/5);    //
  54.                         }
  55.                 }
  56.                 Out2 = KeyStaNow;
  57.                 if(timerOut)
  58.                 {
  59.                         Out1 = KeyStaNow;
  60.                         timerOut=0;
  61.                 }
  62.         }
  63. }
复制代码


回复

使用道具 举报

发表于 2020-6-25 21:56:16 | 显示全部楼层
STC15W104吧,没有16的。
描述不够明确,
2、“”检测到低电平延时10秒左右输出高电平然后输出电平“”---那么输出什么电平呢?
回复

使用道具 举报

 楼主| 发表于 2020-6-25 23:20:44 来自手机浏览器 | 显示全部楼层
路过羊圈的狼 发表于 2020-6-25 21:56
STC15W104吧,没有16的。
描述不够明确,
2、“”检测到低电平延时10秒左右输出高电平然后输出电平“”--- ...

我补充下吧就是监测到一个连续的高电平3V左右,延时10秒单片机连续输出一个3V左右的高电平控制NMOS管开启。当检测变为低电平后输出一个10秒左右的高电平,然后转变成低电平一直保持下去,知道再次检测到高电平信号,如此循环
回复

使用道具 举报

 楼主| 发表于 2020-6-25 23:21:19 来自手机浏览器 | 显示全部楼层
单片机打错字啦确实是15
回复

使用道具 举报

发表于 2020-6-26 00:41:10 来自手机浏览器 | 显示全部楼层
挺简单。。
就是有点不好理解,1,直到高电平消失跟第2点延时输出高电平冲突了,高电平消失是立马输出低电平?还是第二点的延时?2,检测到低电平延时,意思是之前是高电平,也就是输出端的是高电平,还怎么延迟输出高电平?这个延时高电平多久?
所以描述是很不清晰的。

1,检测到高电平,延迟输出高电平
2,检测到低电平,延迟输出低电平
就是输出滞后输入?

打赏

参与人数 1家元 +10 收起 理由
zl11054 + 10

查看全部打赏

回复

使用道具 举报

 楼主| 发表于 2020-6-26 06:59:24 | 显示全部楼层
补充下 谢谢各位解答 。就是当单片机检测到一个连续高电平信号 延时几秒后输出连续的高电平 ,然后当检测到高电平消失后 ,不是立马输出低电平, 延时输出10秒左右的高电平后 输出低电平。如此循环
回复

使用道具 举报

发表于 2020-6-26 11:34:54 | 显示全部楼层
这个似乎用一片555来完成更简单方便:lol:
回复

使用道具 举报

 楼主| 发表于 2020-6-26 15:07:02 来自手机浏览器 | 显示全部楼层
bg4uvr 发表于 2020-6-26 11:34
这个似乎用一片555来完成更简单方便

555只能延时开或关吧,不能一个芯片同时实现2个延时吧
回复

使用道具 举报

发表于 2020-6-26 16:58:54 | 显示全部楼层
听起来是不难
回复

使用道具 举报

发表于 2020-6-26 18:45:45 | 显示全部楼层
还是没听明白楼主说的意思。。。。
回复

使用道具 举报

发表于 2020-6-26 19:01:16 | 显示全部楼层
lxa0 发表于 2020-6-26 18:45
还是没听明白楼主说的意思。。。。

P3^4 检测
如果电平为高
延时3秒
如果P3^4电平为高
P3^3输出高电平
如果P3^4电平为低
延时10秒
P3^3输出电平为低

循环执行上边的步骤,应该是这样的。

打赏

参与人数 1家元 +10 收起 理由
zl11054 + 10 精彩回帖

查看全部打赏

回复

使用道具 举报

发表于 2020-6-26 21:08:03 | 显示全部楼层
如果不考虑高低电平跳变是否在这等待的5秒和10秒内,参考:
sbit IN_PIN = P3^4;
sbit OUT_PIN = P3^5;

void main(void)
{
        P3M0 = 0x20;
        P3M1 = 0x00;
       
        OUT_PIN = 0;
       
        while(1)
        {
                if(IN_PIN)
                {
                        Delay5S();
                       
                        OUT_PIN = 1;
                }
               
                if(!IN_PIN)
                {
                        Delay10S();
                       
                        OUT_PIN = 0;               
                }
        }
}

打赏

参与人数 1家元 +10 收起 理由
zl11054 + 10

查看全部打赏

回复

使用道具 举报

发表于 2020-6-27 03:15:09 来自手机浏览器 | 显示全部楼层
就这简单的功能还用什么单片机,虽然单片机更简单,用三极管或者4011门电路就可以实现,再简单,用rc积分电路就行
回复

使用道具 举报

 楼主| 发表于 2020-6-27 09:34:22 | 显示全部楼层
oreisme 发表于 2020-6-26 21:08
如果不考虑高低电平跳变是否在这等待的5秒和10秒内,参考:
sbit IN_PIN = P3^4;
sbit OUT_PIN = P3^5;

对哦 考虑到跳变是不是麻烦很多 比如 检测脚高电平转换成低电平后会一直输出低电平会不会一直触发延时10秒
回复

使用道具 举报

 楼主| 发表于 2020-6-27 09:35:19 | 显示全部楼层
mckk520 发表于 2020-6-27 03:15
就这简单的功能还用什么单片机,虽然单片机更简单,用三极管或者4011门电路就可以实现,再简单,用rc积分电 ...

能不能 给个图咯 酬谢
回复

使用道具 举报

发表于 2020-6-27 14:34:57 | 显示全部楼层
zl11054 发表于 2020-6-26 15:07
555只能延时开或关吧,不能一个芯片同时实现2个延时吧

既然延时是靠电容的充电和放电来完成的,那有什么不可以呢?(充放电回路用二极管分开)

要求的是1个输入端,两个状态,分别延时后控制1个输出端的两个状态,虽然没有仔细构思,但我想这应该是可以完成的。
回复

使用道具 举报

发表于 2020-6-27 14:53:01 来自手机浏览器 | 显示全部楼层
如果没有理解错你的要求,那么这个线路应该是可以的。
5F078F84-2AC8-4C00-9E08-21B970F13FFE.jpeg

打赏

参与人数 1家元 +10 收起 理由
zl11054 + 10

查看全部打赏

回复

使用道具 举报

发表于 2020-6-27 16:08:34 | 显示全部楼层
zl11054 发表于 2020-6-27 09:34
对哦 考虑到跳变是不是麻烦很多 比如 检测脚高电平转换成低电平后会一直输出低电平会不会一直触发延时10 ...

是的。比如5秒要变成5000ms,每个毫秒检查一遍。
回复

使用道具 举报

发表于 2020-6-27 17:51:59 | 显示全部楼层
来个仿真,利用电容的充放电,实现延迟5秒输出高电平,延迟10秒输出低电平。
1、这个是边沿触发的。楼主要求的是电平触发,楼主应该是说错了。
2、要求输入的高、低电平能持续足够的时间,使得电容有足够的时间充满电或者放干电。
3、延迟精度较差,电路电压和器件参数都会影响,需要根据实际结果调整参数。如果要求高精度的需要用MCU

simulate.png

打赏

参与人数 1家元 +10 收起 理由
zl11054 + 10

查看全部打赏

回复

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-5-17 22:29 , Processed in 0.218400 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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