找回密码
 立即注册

QQ登录

只需一步,快速开始

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

继电器延时直流电机正反转带4位数码管芯片程序如何编写?

[复制链接]
跳转到指定楼层
楼主
ID:821047 发表于 2020-10-6 05:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
接线端口说明
1、DC:输入电源直流12V
2、IN1:信号输入端1(负极触发)
3、IN2:信号输入端2(负极触发)
4、IN3:信号输入端3(负极触发)


要如下功能:
P-1:给信号1,继电器1吸合到A时间自动停止,在这延时期间再给信号1或信号2没有反应;   给信号2,继电器2吸合到B时间自动停止,在这期间再给信号1或信号2都没有反应;信号3是急停复位信号,在继电器1或2吸合期间都会停止。
P-2:  通电继电器1吸合到A时间自动停止,在这延时期间再给信号1或2没有反应,当继电器1停止后,再给信号1继电器1吸合到A时间自动停止;    给信号2,继电器2吸合到B时间自动停止,在这期间再给信号1或信号2都没有反应;  信号3是急停复位信号,在继电器1或2吸合期间都会停止。
      芯片脚位连接说明:STC15W408AS的1脚是信号3通过光耦使1脚低电平时急停;2脚是信号2通过光耦使2脚低电平时使12脚低电平时通过光耦使继电器2启动工作;3脚是信号1通过光耦使3脚低电平使11脚低电平时通过光耦使继电器1启动工作。也就是说1脚低电平是急停;2脚低电平是继电器2工作;3脚低电平是继电器1工作,(平时都是高电平),11、12脚低电平启动继电器1、2(平时高电平),13、14脚到数码管TM1650IC的2、3脚。

按键设置说明
通电显示
表示进入待机状态
按第一次K1屏幕显示:Pー1:  K2和K3调节模式,按第二次K1,屏幕显示:A001:K2和K3调节第一个时间A,K4调节小数点(时间单位)按第三次K1,屏幕显示:B001:K2和K3调节第二个时间B,按第四次K1,显示“-----”表示进入待机状态。

比如;需要设定模式为:P-2;时间为:A010,B005。
表示第二个工作方式;给信号1后;继电器1启动10秒之后关闭; 继电器2再给信号2之后延时5秒之后自动关闭。
计时范围:0.1秒~99秒。

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

使用道具 举报

沙发
ID:821047 发表于 2020-10-6 09:39 | 只看该作者

RE: 求继电器延时直流电机正反转带4位数码管芯片程序

STC8F1K08S2或STC8F2K08S2芯片也可以
回复

使用道具 举报

板凳
ID:821047 发表于 2020-10-6 20:10 | 只看该作者
求助继电器延时直流电机正反转带4位数码管芯片程序
回复

使用道具 举报

地板
ID:821047 发表于 2020-10-8 23:10 | 只看该作者
请教大师傅,200黑币
回复

使用道具 举报

5#
ID:213173 发表于 2020-10-9 11:43 | 只看该作者
给你一个演示程序,按实际电路配置端口即可满足你的需求。
  1. //按楼主意图优化编写
  2. //双路0.1~99.9秒倒计时演示程序
  3. //此程序适合51单片机和STC1T单片机
  4. //也适合共阳/共阴数码管
  5. #include<reg51.h>
  6. #include<intrins.h>
  7. #define key_S 10                                        //宏定义短按(约10ms)
  8. #define key_L key_S*50                        //宏定义长按(约500ms)
  9. #define key_I key_S*38                        //宏定义长按连+/-间隔(约120ms)
  10. #define uchar unsigned char
  11. #define uint unsigned int
  12. //端口根据实际电路重新定义
  13. sbit K1 =P1^0;
  14. sbit K2 =P1^1;
  15. sbit K3 =P1^2;
  16. sbit IN1=P1^3;
  17. sbit IN2=P1^4;
  18. sbit IN3=P1^5;
  19. sbit OUT1=P1^6;
  20. sbit OUT2=P1^7;
  21. /*
  22. uchar code table[]={//共阳数码管段码"0~f-."
  23.                 0xc0,0xf9,0xa4,0xb0,
  24.                 0x99,0x92,0x82,0xf8,
  25.                 0x80,0x90,0x88,0x83,
  26.                 0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
  27. */
  28. uchar code table[]={//共阴数码管段码"0~f-."
  29.                 0x3f,0x06,0x5b,0x4f,
  30.                 0x66,0x6d,0x7d,0x07,
  31.                 0x7f,0x6f,0x77,0x7c,
  32.                 0x39,0x5e,0x79,0x71,0x40,0x80};

  33. uchar data dis_buf[4];//显示数据缓存
  34. bit  state1,state2;//倒计时状态
  35. int  time1=115,time2=225;
  36. uchar KeySec;
  37. int num=0,num1=0;
  38. bit flashing=0;

  39. //12T51单片机
  40. void Delay1ms()                //@11.0592MHz
  41. {
  42.         unsigned char i, j;
  43.         _nop_();
  44.         i = 2;
  45.         j = 199;
  46.         do
  47.         {
  48.                 while (--j);
  49.         } while (--i);
  50. }
  51. void Timer0Init()        //10毫秒@11.0592MHz
  52. {
  53.         TMOD |= 0x01;        //设置定时器模式
  54.         TL0 = 0x00;                //设置定时初值
  55.         TH0 = 0xDC;                //设置定时初值
  56. //        TR0 = 1;                //定时器0开始计时
  57.         ET0 = 1;
  58.    EA  = 1;
  59. }
  60. //STC1T单片机
  61. /*void Delay1ms()                //@11.0592MHz
  62. {
  63.         unsigned char i, j;
  64.         i = 15;
  65.         j = 90;
  66.         do
  67.         {
  68.                 while (--j);
  69.         } while (--i);
  70. }
  71. void Timer0Init()        //10毫秒@11.0592MHz
  72. {
  73.         AUXR &= 0x7F;        //定时器时钟12T模式
  74.         TMOD &= 0xF0;        //设置定时器模式
  75.         TMOD |= 0x01;        //设置定时器模式
  76.         TL0 = 0x00;                //设置定时初值
  77.         TH0 = 0xDC;                //设置定时初值
  78.         TF0 = 0;                        //清除TF0标志
  79. //        TR0 = 1;                        //定时器0开始计时
  80.         ET0 = 1;
  81.    EA  = 1;
  82. }
  83. */

  84. //按键扫描
  85. void keyscan()
  86. {
  87.         static unsigned int count=0;
  88.         if(!K1||!K2||!K3)
  89.         {
  90.                 count++;
  91.                 if(count>key_L)//长按有效
  92.                         count=key_I;//连+/-间隔
  93.                 if(count==key_S)//短按消抖
  94.                 {
  95.                         if(!K1)//预设
  96.                         {
  97.                                 KeySec++;
  98.                                 if(KeySec>=3)
  99.                                 {
  100.                                         KeySec=0;
  101.                                 }
  102.                         }
  103.                 }
  104.                 if(count==key_S||count==key_L)//短按+/-,长按连+/-
  105.                 {
  106.                         if(!K2 && KeySec>0)
  107.                         {
  108.                                 switch(KeySec)
  109.                                 {
  110.                                         case 1: if(time1<999)time1++; break;
  111.                                         case 2: if(time2<999)time2++; break;
  112.                                 }
  113.                         }
  114.                         if(!K3 && KeySec>0)
  115.                         {
  116.                                 switch(KeySec)
  117.                                 {
  118.                                         case 1: if(time1>1)time1--; break;
  119.                                         case 2: if(time2>1)time2--; break;
  120.                                 }
  121.                         }
  122.                 }
  123.         }
  124.         else count=0;
  125. }
  126. void INscan()
  127. {
  128.         if(KeySec==0 && TR0==0)
  129.         {
  130.                 if(!IN1)
  131.                 {
  132.                         TR0=1;
  133.                         OUT1=0;
  134.                         OUT2=1;
  135.                         state1=1;
  136.                         state2=0;
  137.                         num1=0;
  138.                         num=time1;
  139.                 }
  140.                 if(!IN2)
  141.                 {
  142.                         TR0=1;
  143.                         OUT1=1;
  144.                         OUT2=0;
  145.                         state1=0;
  146.                         state2=1;
  147.                         num1=0;
  148.                         num=time2;
  149.                 }
  150.         }
  151.         if(!IN3)
  152.         {
  153.                 OUT1=1;
  154.                 OUT2=1;
  155.                 state1=0;
  156.                 state2=0;
  157.                 num1=0;
  158.                 num=0;
  159.         }
  160. }
  161. void display()//显示
  162. {
  163.         static uchar i=0;
  164.         uchar j=0;
  165.         if(KeySec==0)
  166.         {
  167.                 if(state1==0 && state2==0)
  168.                 {//显示----
  169. //                        for(j=0;j<4;j++)
  170. //                                dis_buf[j] = 0xbf;//共阳-
  171.                         for(j=0;j<4;j++)
  172.                                 dis_buf[j] = 0x40;//共阴-
  173.                 }
  174.                 else
  175.                 {
  176.                         if(state1==1)//显示A倒计时时间
  177. //                                dis_buf[0] = 0x88;//共阳A
  178.                                 dis_buf[0] = 0x77;//共阴A
  179.                         else if(state2==1)//显示B倒计时时间
  180. //                                dis_buf[0] = 0x83;//共阳b
  181.                                 dis_buf[0] = 0x7c;//共阴b
  182.                         dis_buf[1] = table[num/100%10];
  183. //                        dis_buf[2] = table[num/10%10]&0x7f;//共阳加小数点
  184.                         dis_buf[2] = table[num/10%10]|0x80;//共阴加小数点
  185.                         dis_buf[3] = table[num%10];
  186.                 }
  187.         }
  188.         if(KeySec==1)
  189.         {//显示A预设时间
  190. //                dis_buf[0] = 0x88; //共阳A
  191.                 dis_buf[0] = 0x77; //共阳A
  192.                 dis_buf[1] = table[time1/100%10];
  193. //                dis_buf[2] = table[time1/10%10]&0x7f;//共阳加小数点
  194.                 dis_buf[2] = table[time1/10%10]|0x80;//共阴加小数点
  195.                 dis_buf[3] = table[time1%10];
  196.         }
  197.         if(KeySec==2)
  198.         {//显示B预设时时间
  199. //                dis_buf[0] = 0x83; //共阳b
  200.                 dis_buf[0] = 0x7c; //共阳b
  201.                 dis_buf[1] = table[time2/100%10];
  202. //                dis_buf[2] = table[time2/10%10]&0x7f;//共阳加小数点
  203.                 dis_buf[2] = table[time2/10%10]|0x80;//共阴加小数点
  204.                 dis_buf[3] = table[time2%10];
  205.         }
  206.         //共阳数码管驱动
  207. /*        P2&=0xf0;//消隐
  208.         P0=dis_buf[i];//送段码
  209.         P2|=0x01<<i;//送位码
  210. */
  211.         //共阴数码管驱动
  212.         P0=0x00;//消隐
  213.         P2&=0xf0;//清低4位
  214.         P0=dis_buf[i];//送段码
  215.         P2|=~(0x01<<i);//送位码

  216.         i++;i%=4;
  217. }

  218. void main()//主函数
  219. {
  220.         Timer0Init();//定时器初始化程序
  221.         while(1)
  222.         {
  223.                 keyscan();                        //按键扫描
  224.                 INscan();                        //输入扫描
  225.                 display();                        //数码管显示
  226.                 Delay1ms();                        //控制主循环约1ms
  227.         }
  228. }

  229. void Timer0Interrupt(void) interrupt 1
  230. {
  231.         TL0 = 0x00;                //设置定时初值
  232.         TH0 = 0xDC;                //设置定时初值
  233.         num1++;
  234.         if(num1>=10)
  235.         {
  236.                 num1=0;
  237.                 num--;
  238.                 if(num<=0)
  239.                 {
  240.                         num=0;
  241.                         OUT1=1;
  242.                         OUT2=1;
  243.                         state1=0;
  244.                         state2=0;
  245.                         TR0=0;
  246.                 }
  247.         }
  248. }
复制代码
回复

使用道具 举报

6#
ID:821047 发表于 2020-10-9 21:23 | 只看该作者
谢谢前辈指点
回复

使用道具 举报

7#
ID:821047 发表于 2020-10-9 23:34 | 只看该作者
谢谢总工
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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