亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2990|回復: 26
打印 上一主題 下一主題
收起左側

51單片機繼電器控制程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:1104510 發表于 2026-1-12 10:43 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各位大神,麻煩幫我看一下,用C語言寫一個51單片機程序,實現如下功能:單片機型號為STC15W408AS,有四個輸入口,兩個輸出口。4個輸入口分別命名為key1~key4,2個輸出繼電器口分別命名為kt1~kt2;key1接入的是一個自復位按鈕開關,key2,key3接入的是兩個光電開關。key1主要實現按鈕一鍵控制繼電器kt1啟停(不管key2和key3的狀態),即按一下開,再按一下關。當kt1處于打開狀態時,如果檢測到key2和key3任意一個輸入口沒有輸入信號時,關閉kt1;引腳定義:sbit key1 = P1^2;                        /*單片機1.2引腳檢測key1是否動作*/
        sbit key2 = P1^3;                        /*單片機1.3引腳檢測key2是否動作*/
        sbit key3 = P1^4;                        /*單片機1.4引腳檢測key3是否動作*/
        sbit key4 = P1^5;                        /*單片機1.5引腳檢測key4是否動作*/
           
        sbit kt1 = P3^7;                  /*單片機3.7引腳控制繼電器kt1*/
        sbit kt2 = P3^6;                  /*單片機3.6引腳控制繼電器kt2*/    輸入口為0表示有信號輸入;輸入口為1表示無信號輸入;輸出口為0表示開啟繼電器,輸出口為1表示關閉繼電器;  我自己寫了一些,然后又在deepseek上問了  寫出來的都不對  麻煩各位大神看看怎么寫
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:69038 發表于 2026-1-12 11:36 | 只看該作者
"我自己寫了一些,然后又在deepseek上問了  寫出來的都不對"...
DeepSeek也要訓練的,不對就要提出來,讓它完善啊。。。
回復

使用道具 舉報

板凳
ID:230500 發表于 2026-1-12 11:45 | 只看該作者
key1主要實現按鈕一鍵控制繼電器kt1啟停(不管key2和key3的狀態),


KEY1  KEY2 KEY3 控制KT1   那KEY4 和KT2呢?   問題需求你都沒描敘清楚
回復

使用道具 舉報

地板
ID:1104510 發表于 2026-1-12 12:40 | 只看該作者
a399288395 發表于 2026-1-12 11:45
key1主要實現按鈕一鍵控制繼電器kt1啟停(不管key2和key3的狀態),

key4  kt2 暫時閑置
回復

使用道具 舉報

5#
ID:1104510 發表于 2026-1-12 12:41 | 只看該作者
zhuls 發表于 2026-1-12 11:36
"我自己寫了一些,然后又在deepseek上問了  寫出來的都不對"...
DeepSeek也要訓練的,不對就要提出來,讓 ...

提了   改來改去都跟沒改一樣
回復

使用道具 舉報

6#
ID:1104510 發表于 2026-1-12 12:45 | 只看該作者
a399288395 發表于 2026-1-12 11:45
key1主要實現按鈕一鍵控制繼電器kt1啟停(不管key2和key3的狀態),

在kt1是關閉狀態時,不管key2和key3什么狀態,只要按下key1,就打開kt1;在kt1是打開狀態時,不管key2和key3什么狀態,只要按下key1,就關閉kt1;在kt1處于打開狀態時,key2或者key3任意一個輸入點無信號,都關閉kt1;
回復

使用道具 舉報

7#
ID:230500 發表于 2026-1-12 13:42 | 只看該作者
鄭效桂 發表于 2026-1-12 12:45
在kt1是關閉狀態時,不管key2和key3什么狀態,只要按下key1,就打開kt1;在kt1是打開狀態時,不管key2和k ...

1; 在kt1是關閉狀態時,不管key2和key3什么狀態,只要按下key1,就打開kt1;2; 在kt1是打開狀態時,不管key2和key3什么狀態,只要按下key1,就關閉kt1;
3; 在kt1處于打開狀態時,key2或者key3任意一個輸入點無信號,都關閉kt1;


上面1,2,3項是你的要求, 1,2 可以實現,對于1,2. 相當于KEY1是總開關,他的開和關 不受KEY2,KEY3 影響。 但是你第3項 和上面的1,2相沖突,(按下開關后 由于KEY2 KEY3 沒信號, 繼電器根本不會吸合,吸合馬上又斷開)  ;





回復

使用道具 舉報

8#
ID:1104510 發表于 2026-1-12 15:32 | 只看該作者
a399288395 發表于 2026-1-12 13:42
1; 在kt1是關閉狀態時,不管key2和key3什么狀態,只要按下key1,就打開kt1;2; 在kt1是打開狀態時,不 ...

對的   這就是問題所在
回復

使用道具 舉報

9#
ID:592807 發表于 2026-1-12 16:15 | 只看該作者
鄭效桂 發表于 2026-1-12 15:32
對的   這就是問題所在

你將K1換成普通開關,一般自恢復開關都有自鎖功能你按下KEY1后,KEY1就會一直處于0狀態(按鍵鎖死),你不再按一次將狀態解開,他就一直處于0狀態。然后當按鍵KEY1處于0狀態時(按下狀態),你就必須開啟繼電器KIT1=0,你開啟以后你要檢測KEY2 和KEY3狀態,如果KEY2 和KEY3沒有信號(不為0狀態),你要關閉繼電器,但是你忘了嗎,你的KEY1是自鎖自恢復的按鍵,它鎖著呢,你沒松開它,他一直處于0狀態,你關了繼電器KEY1會立刻讓你重新打開繼電器,這矛盾了。除非你能讓KEY1強制復位,不然你的邏輯就是死循環,就是錯的。
回復

使用道具 舉報

10#
ID:1133081 發表于 2026-1-12 16:32 | 只看該作者
鄭效桂 發表于 2026-1-12 12:45
在kt1是關閉狀態時,不管key2和key3什么狀態,只要按下key1,就打開kt1;在kt1是打開狀態時,不管key2和k ...

這種簡單控制本身沒有難度,問題是樓主提出的控制功能有邏輯問題。
既然“在kt1是關閉狀態時,不管key2和key3什么狀態,只要按下key1,就打開kt1;在kt1是打開狀態時,不管key2和key3什么狀態,只要按下key1,就關閉kt1;”
這段話就是key1點控kt1開關不受key2和key3狀態限制。那么后面這段話就與前面的話是矛盾的:“在kt1處于打開狀態時,key2或者key3任意一個輸入點無信號,都關閉kt1;”

回復

使用道具 舉報

11#
ID:1104510 發表于 2026-1-12 16:38 | 只看該作者
WL0123 發表于 2026-1-12 16:32
這種簡單控制本身沒有難度,問題是樓主提出的控制功能有邏輯問題。
既然“在kt1是關閉狀態時,不管key2 ...

對的   這個邏輯有問題   我在嘗試換另一種方案
回復

使用道具 舉報

12#
ID:1109793 發表于 2026-1-13 07:41 | 只看該作者
if(!key1)kt1 = 0;
kt1 = key2|key3;
回復

使用道具 舉報

13#
ID:227818 發表于 2026-1-13 08:00 | 只看該作者
http://www.denmoz.com/bbs/dpj-195153-1.html
看看這篇文章,如果你把這些例程都搞懂,你就是大佬。
回復

使用道具 舉報

14#
ID:592807 發表于 2026-1-13 10:54 | 只看該作者
鄭效桂 發表于 2026-1-12 16:38
對的   這個邏輯有問題   我在嘗試換另一種方案

有啥難得加個報警機制就行了,出錯報警,復位KEY1取消報警
回復

使用道具 舉報

15#
ID:161164 發表于 2026-1-13 11:44 | 只看該作者
鄭效桂 發表于 2026-1-12 16:38
對的   這個邏輯有問題   我在嘗試換另一種方案

按下Key1 切換手動模式,一鍵控制繼電器kt1啟停
按下Key4 切換自動模式,檢測到key2和key3任意一個輸入口沒有輸入信號時,關閉kt1
回復

使用道具 舉報

16#
ID:1104510 發表于 2026-1-14 08:43 | 只看該作者
lkc8210 發表于 2026-1-13 11:44
按下Key1 切換手動模式,一鍵控制繼電器kt1啟停
按下Key4 切換自動模式,檢測到key2和key3任意一個輸入 ...

這樣貌似還是不對,如果key4在觸發狀態,key2或者key3任意一個輸入口無信號,kt1關閉了,此時,如果再按key1,就會出現kt1開啟一下然后迅速關閉  就是kt1會閃爍一下  然后保持關閉狀態
回復

使用道具 舉報

17#
ID:1104510 發表于 2026-1-14 09:31 | 只看該作者
黃youhui 發表于 2026-1-13 10:54
有啥難得加個報警機制就行了,出錯報警,復位KEY1取消報警

請問這個報警機制怎么寫呢
回復

使用道具 舉報

18#
ID:1133081 發表于 2026-1-14 11:02 | 只看該作者
鄭效桂 發表于 2026-1-14 09:31
請問這個報警機制怎么寫呢

樓主還處于編程初級階段,這樣問也問不出什么有用的結果。不如直接講目的,壇友幫你捋清邏輯關系更可行。
回復

使用道具 舉報

19#
ID:1104510 發表于 2026-1-14 11:59 | 只看該作者
WL0123 發表于 2026-1-14 11:02
樓主還處于編程初級階段,這樣問也問不出什么有用的結果。不如直接講目的,壇友幫你捋清邏輯關系更可行。

好的   現在有3個輸入口  key1~key3  一個輸出繼電器 kt1;key1是一個自復位按鈕開關,key2~key3是兩個光電開關;key1控制kt1的一鍵啟停(無論key2和key3有沒有輸入信號);當kt1處于打開狀態,此時key2或者key3任意一個輸入口沒有信號,將kt1關閉;此時再次按下key1,將kt1開啟;就這樣循環;
回復

使用道具 舉報

20#
ID:427868 發表于 2026-1-14 12:11 | 只看該作者

樓主試試:

這個功能較為簡單,寫了個以STC8H1K08 為例,可以試試。

#include <stc8g.h>          //STC8H1K08  IRC內部時鐘選12MHZ
typedef unsigned char u8;   //對數據類型進行定義聲明
typedef unsigned int u16;   //對數據類型進行定義聲明

sbit key1 = P1^2;           //按鍵輸入
sbit key2 = P1^3;           //光電開關,0為有信號,1為無信號
sbit key3 = P1^4;           //光電開關,0為有信號,1為無信號
sbit key4 = P1^5;           //備用輸入
sbit kt1 = P3^7;            //繼電器控制,0開啟,1關閉
sbit kt2 = P3^6;            //繼電器控制,0開啟,1關閉,備用
bit flag10ms = 0;           //10ms時間標志,按鍵掃描

/*********************觸發掃描*************************/
void scan()
{
  static u8 i = 0;          //掃描次數

  kt1 = key2 | key3;     //key2和key3中有1路無信號,則關閉繼電器1
  if(flag10ms)             //檢測10ms時間標志
  {
    flag10ms = 0;         //清零10ms標志
    if(key1){i = 0;}
    else
      {
        i++;
        if(i == 2) {kt1 = ~kt1;}
        if(i == 250) {i = 3;}
      }
  }
}

/*************************主函數******************************/
void main()
{
  P1M0 = 0x00; P1M1 = 0x00;     //P3設置為準雙向口
  P3M0 = 0x00; P3M1 = 0x00;     //P5設置為準雙向口

  kt1 = 1;                      //關閉繼電器1
  kt2 = 1;                      //關閉繼電器2
  PT1 = 0;                      //設置Tim1中斷為低級0 PT1=0
  IPH &= 0xF7;                //0xF7=11110111       PT1H=0
  ET1 = 1;                      //開啟定時器1中斷
  EA = 1;                       //開啟總中斷
  AUXR &= 0xBF;             //定時器時鐘12T模式
  TMOD &= 0x0F;              //設置定時器模式16位自動重裝
  TL1 = 0xF0;                   //設置定時初始值10ms
  TH1 = 0xD8;                  //設置定時初始值
  TF1 = 0;                       //清除TF1標志
  TR1 = 1;                      //定時器1開始計時
  WDT_CONTR = 0x24;    //使能看門狗,溢出時間約為1s

  while(1)      //主循環
  {
    WDT_CONTR = 0x34;    //清看門狗,否則系統復位
    scan();                        //調入繼電器掃描函數
  }
}

/**********定時器Tim1中斷 10ms  級別0***********/
void Time1() interrupt 3
{
  flag10ms = 1;              //產生10ms標志位,用于按鍵掃描
}
/**********Program Size: data=10.1 xdata=0 code=245***********/

回復

使用道具 舉報

21#
ID:592807 發表于 2026-1-14 17:19 | 只看該作者
鄭效桂 發表于 2026-1-14 11:59
好的   現在有3個輸入口  key1~key3  一個輸出繼電器 kt1;key1是一個自復位按鈕開關,key2~key3是兩個光 ...

哥們,你這樣做產品會被開除的。
|你現在需要時是報警機制,就是當按鍵KEY1按下后,如果光電開關沒信號(這是故障來的,可能有哪些地方沒接好,你必須控制你的繼電器斷開,且要告訴使用者有故障,你不能說還讓他循環啊,繼續工作啊,就像你家電路總閘都跳了,你還沒事掰上去繼續干,掰不上去就用東西強行撐上去)你需要提醒使用者重啟機器(重新再按KEY1斷開繼電器檢查故障,然后再次按下KEY1重啟)。你要加個蜂鳴器或者LED燈,如果KEY1按下,光電信號沒反應就閃燈就響蜂鳴器斷開繼電器(沒有燈和蜂鳴器也可以,但是你要將繼電器狀態標記成故障,除非重啟KEY1,不然無論如何都不能開繼電器)
回復

使用道具 舉報

22#
ID:1133081 發表于 2026-1-14 21:23 | 只看該作者
鄭效桂 發表于 2026-1-14 11:59
好的   現在有3個輸入口  key1~key3  一個輸出繼電器 kt1;key1是一個自復位按鈕開關,key2~key3是兩個光 ...

你這樣描述與前面的描述基本相同沒有意義。我給你舉例:要設計制作一款聲、光控樓道燈,晚間無光照,才能受樓道人活動的聲音觸發亮燈,并延時15秒熄滅。聲控不能太靈敏,防止誤動作。另設置一個按鍵強制開關,不論聲、光條件是否滿足,按下按鍵即觸發亮燈,并延時15秒熄滅。
回復

使用道具 舉報

23#
ID:584814 發表于 2026-1-16 12:40 | 只看該作者
樓主自己寫的東西咋沒看見 
回復

使用道具 舉報

24#
ID:1104510 發表于 2026-1-17 16:31 | 只看該作者
劉佑紅 發表于 2026-1-14 12:11
這個功能較為簡單,寫了個以STC8H1K08 為例,可以試試。

#include           //STC8H1K08  IRC內部時鐘 ...

好的 謝謝大佬  馬上我試一下
回復

使用道具 舉報

25#
ID:230500 發表于 2026-1-18 08:49 | 只看該作者
鄭效桂 發表于 2026-1-17 16:31
好的 謝謝大佬  馬上我試一下

不用試了  他這個程序明顯的邏輯不通。 kt1 = key2 | key3;  這句在大循環里會一直執行,  后面不管按鍵怎么掃描,  10毫秒后,KT1的最終結果只受  key2 | key3 控制。
回復

使用道具 舉報

26#
ID:427868 發表于 2026-1-18 09:03 | 只看該作者
本帖最后由 劉佑紅 于 2026-1-18 09:24 編輯
a399288395 發表于 2026-1-18 08:49
不用試了  他這個程序明顯的邏輯不通。 kt1 = key2 | key3;  這句在大循環里會一直執行,  后面不管按鍵 ...

您說得對,確有邏輯錯誤,kt1會持續開啟,可將kt1 = key2 |key3;這句改為if(kt1 == 0) {kt1 = key2 |key3;}試試,或者改為if(kt2 | ky3)  {kt1 = 1;},這句邏輯看著更直觀。
回復

使用道具 舉報

27#
ID:1104510 發表于 2026-1-18 12:28 | 只看該作者
a399288395 發表于 2026-1-18 08:49
不用試了  他這個程序明顯的邏輯不通。 kt1 = key2 | key3;  這句在大循環里會一直執行,  后面不管按鍵 ...

對的   就是這樣   邏輯有問題   最后只受key2跟key3控制
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表