標題: 繼電器延時直流電機正反轉(zhuǎn)帶4位數(shù)碼管芯片程序如何編寫? [打印本頁]

作者: hzxty    時間: 2020-10-6 05:02
標題: 繼電器延時直流電機正反轉(zhuǎn)帶4位數(shù)碼管芯片程序如何編寫?
接線端口說明
1、DC:輸入電源直流12V
2、IN1:信號輸入端1(負極觸發(fā))
3、IN2:信號輸入端2(負極觸發(fā))
4、IN3:信號輸入端3(負極觸發(fā))


要如下功能:
P-1:給信號1,繼電器1吸合到A時間自動停止,在這延時期間再給信號1或信號2沒有反應(yīng);   給信號2,繼電器2吸合到B時間自動停止,在這期間再給信號1或信號2都沒有反應(yīng);信號3是急停復(fù)位信號,在繼電器1或2吸合期間都會停止。
P-2:  通電繼電器1吸合到A時間自動停止,在這延時期間再給信號1或2沒有反應(yīng),當(dāng)繼電器1停止后,再給信號1繼電器1吸合到A時間自動停止;    給信號2,繼電器2吸合到B時間自動停止,在這期間再給信號1或信號2都沒有反應(yīng);  信號3是急停復(fù)位信號,在繼電器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腳到數(shù)碼管TM1650IC的2、3腳。

按鍵設(shè)置說明
通電顯示
表示進入待機狀態(tài)
按第一次K1屏幕顯示:Pー1:  K2和K3調(diào)節(jié)模式,按第二次K1,屏幕顯示:A001:K2和K3調(diào)節(jié)第一個時間A,K4調(diào)節(jié)小數(shù)點(時間單位)按第三次K1,屏幕顯示:B001:K2和K3調(diào)節(jié)第二個時間B,按第四次K1,顯示“-----”表示進入待機狀態(tài)。

比如;需要設(shè)定模式為:P-2;時間為:A010,B005。
表示第二個工作方式;給信號1后;繼電器1啟動10秒之后關(guān)閉; 繼電器2再給信號2之后延時5秒之后自動關(guān)閉。
計時范圍:0.1秒~99秒。


作者: hzxty    時間: 2020-10-6 09:39
標題: RE: 求繼電器延時直流電機正反轉(zhuǎn)帶4位數(shù)碼管芯片程序
STC8F1K08S2或STC8F2K08S2芯片也可以
作者: hzxty    時間: 2020-10-6 20:10
求助繼電器延時直流電機正反轉(zhuǎn)帶4位數(shù)碼管芯片程序
作者: hzxty    時間: 2020-10-8 23:10
請教大師傅,200黑幣
作者: wulin    時間: 2020-10-9 11:43
給你一個演示程序,按實際電路配置端口即可滿足你的需求。
  1. //按樓主意圖優(yōu)化編寫
  2. //雙路0.1~99.9秒倒計時演示程序
  3. //此程序適合51單片機和STC1T單片機
  4. //也適合共陽/共陰數(shù)碼管
  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. //端口根據(jù)實際電路重新定義
  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[]={//共陽數(shù)碼管段碼"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[]={//共陰數(shù)碼管段碼"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];//顯示數(shù)據(jù)緩存
  34. bit  state1,state2;//倒計時狀態(tài)
  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;        //設(shè)置定時器模式
  54.         TL0 = 0x00;                //設(shè)置定時初值
  55.         TH0 = 0xDC;                //設(shè)置定時初值
  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;        //設(shè)置定時器模式
  75.         TMOD |= 0x01;        //設(shè)置定時器模式
  76.         TL0 = 0x00;                //設(shè)置定時初值
  77.         TH0 = 0xDC;                //設(shè)置定時初值
  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)//預(yù)設(shè)
  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;//共陽加小數(shù)點
  184.                         dis_buf[2] = table[num/10%10]|0x80;//共陰加小數(shù)點
  185.                         dis_buf[3] = table[num%10];
  186.                 }
  187.         }
  188.         if(KeySec==1)
  189.         {//顯示A預(yù)設(shè)時間
  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;//共陽加小數(shù)點
  194.                 dis_buf[2] = table[time1/10%10]|0x80;//共陰加小數(shù)點
  195.                 dis_buf[3] = table[time1%10];
  196.         }
  197.         if(KeySec==2)
  198.         {//顯示B預(yù)設(shè)時時間
  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;//共陽加小數(shù)點
  203.                 dis_buf[2] = table[time2/10%10]|0x80;//共陰加小數(shù)點
  204.                 dis_buf[3] = table[time2%10];
  205.         }
  206.         //共陽數(shù)碼管驅(qū)動
  207. /*        P2&=0xf0;//消隱
  208.         P0=dis_buf[i];//送段碼
  209.         P2|=0x01<<i;//送位碼
  210. */
  211.         //共陰數(shù)碼管驅(qū)動
  212.         P0=0x00;//消隱
  213.         P2&=0xf0;//清低4位
  214.         P0=dis_buf[i];//送段碼
  215.         P2|=~(0x01<<i);//送位碼

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

  218. void main()//主函數(shù)
  219. {
  220.         Timer0Init();//定時器初始化程序
  221.         while(1)
  222.         {
  223.                 keyscan();                        //按鍵掃描
  224.                 INscan();                        //輸入掃描
  225.                 display();                        //數(shù)碼管顯示
  226.                 Delay1ms();                        //控制主循環(huán)約1ms
  227.         }
  228. }

  229. void Timer0Interrupt(void) interrupt 1
  230. {
  231.         TL0 = 0x00;                //設(shè)置定時初值
  232.         TH0 = 0xDC;                //設(shè)置定時初值
  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. }
復(fù)制代碼

作者: hzxty    時間: 2020-10-9 21:23
謝謝前輩指點
作者: hzxty    時間: 2020-10-9 23:34
謝謝總工




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1