找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机控制继电器通断多模式切换,求思路

[复制链接]
跳转到指定楼层
楼主
ID:693676 发表于 2020-2-25 17:01 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
第一个模式设置单片机控制继电器通断时间50ms,确定执行,50ms后继电器断开。按键可以切换下一个模式通断时间为100ms,以此类推可以到1000ms。请问各位大神这程序要怎么弄啊感觉要很长。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2020-2-25 20:58 | 只看该作者
给你写一个50~1000ms递进延时继电器示例,按键与定时器互锁。继电器延时期间锁按键
  1. #include <reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. sbit key=P1^0;
  5. sbit OUT=P1^7;

  6. uchar num=0;//键值变量
  7. uchar flag=0;//中断标志

  8. /***********定时器初始化****************/
  9. void Timer0Init()                //50毫秒@12.000MHz
  10. {
  11.         TMOD |= 0x01;                //设置定时器模式
  12.         TH0 = 0x3C;                        //设置定时初值
  13.         TL0 = 0xB0;                        //设置定时初值
  14.         TF0 = 0;                                //清除TF0标志
  15. //        TR0 = 1;                                //定时器0开始计时
  16.         EA = 1;                                //开总中断
  17.         ET0 = 1;                                //开T0中断
  18. }
  19. /***********按键扫描程序****************/
  20. void keyscan()       
  21. {
  22.         static uchar count=0;                //消抖计数变量                       
  23.         static bit sign=0;                        //按键自锁标志
  24.         if(key==0)                                                //检测键按下
  25.         {                                       
  26.                 if(++count>=100 && sign==0 && TR0==0)//消抖/自锁/与定时器互锁
  27.                 {                       
  28.                         sign=1;
  29.                         num++;
  30.                         if(num>20)
  31.                                 num=0;
  32.                         if(num!=0)
  33.                         {
  34.                                 TR0=1;//开定时器
  35.                                 OUT=0;//闭合继电器
  36.                         }
  37.                 }
  38.         }
  39.         else //松手
  40.         {
  41.                 count=0;                                        //消抖计数变量清0
  42.                 sign=0;                                        //按键自锁标志清0
  43.         }
  44. }
  45. /***********主函数****************/
  46. void main()
  47. {
  48.         Timer0Init();
  49.         while(1)
  50.         {
  51.                 keyscan();
  52.         }
  53. }
  54. /***********中断服务程序****************/
  55. void Timer0Interrupt() interrupt 1
  56. {
  57.         TH0 = 0x3C;
  58.         TL0 = 0xB0;
  59.         flag++;
  60.         if(flag>=num)//50~1000ms递进
  61.         {
  62.                 flag=0;
  63.                 OUT=1;//断开继电器
  64.                 TR0=0;//关定时器
  65.         }
  66. }
复制代码
回复

使用道具 举报

板凳
ID:168996 发表于 2020-2-25 21:03 | 只看该作者
100行以内吧?
回复

使用道具 举报

地板
ID:67356 发表于 2020-2-26 08:07 | 只看该作者
设置一个变量mode,存储于单片机内,作为默认的继电器通电时间,通过按钮改变mode的数值(50,60,70,,1000ms),
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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