标题: 51单片机控制继电器通断多模式切换,求思路 [打印本页]

作者: 许许许    时间: 2020-2-25 17:01
标题: 51单片机控制继电器通断多模式切换,求思路
第一个模式设置单片机控制继电器通断时间50ms,确定执行,50ms后继电器断开。按键可以切换下一个模式通断时间为100ms,以此类推可以到1000ms。请问各位大神这程序要怎么弄啊感觉要很长。
作者: wulin    时间: 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. }
复制代码

作者: banalsheep    时间: 2020-2-25 21:03
100行以内吧?
作者: jmkl128    时间: 2020-2-26 08:07
设置一个变量mode,存储于单片机内,作为默认的继电器通电时间,通过按钮改变mode的数值(50,60,70,,1000ms),




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