找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1551|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

如何增加這個(gè)按鍵和定時(shí)的程序的功能?求幫助

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:562338 發(fā)表于 2019-6-15 19:48 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
現(xiàn)在程序是上電默認(rèn)開機(jī)并運(yùn)行了的,但想增加一些功能
增加:上電默認(rèn)不開機(jī),長(zhǎng)按鍵KEY約2秒再開機(jī),并運(yùn)行SRL(),短按切換到SR(),只要是短按就來回切換,但任何狀態(tài)下長(zhǎng)按開與關(guān)機(jī)
          啟動(dòng)后,運(yùn)行1小時(shí)自動(dòng)關(guān)機(jī)
#include "stc15w.h"                       
#include <intrins.H>                      //函數(shù)運(yùn)算頭文件
#define uint unsigned int                 //宏定義變量0-6553
#define uchar unsigned char               //宏定義變量0-255
#define     MAIN_Fosc       11059200L     //定義主時(shí)鐘


/*定義ADC參數(shù)*/


#define ADC_POWER   0x80                //ADC power control dit (宏定義ADC電源控制位)1000 0000
#define ADC_FLAG    0x10                //ADC complete flag (宏定義ADC完成標(biāo)志位)    0001 0000
#define ADC_START   0x08                //ADC start control dit (宏定義ADC啟動(dòng)控制位)0000 1000
#define ADC_SPEEDLL 0x00                //420 clocks (宏定義420時(shí)鐘)速度控制         0000 0000
#define ADC_SPEEDL  0x20                //280 clocks (宏定義280時(shí)鐘)速度控制         0001 0000
#define ADC_SPEEDH  0x40                //140 clocks (宏定義140時(shí)鐘)速度控制         0010 0000
#define ADC_SPEEDHH 0x60                //070 clocks (宏定義70時(shí)鐘)速度控制          0011 0000
/*定義接口*/
sbit out=P1^1;                          //驅(qū)動(dòng)端口定義
sbit key = P2^4;                        //定義KEY接口
sbit ledL = P4^2;                       //定義低檔位接口
sbit ledH = P4^3;                       //定義高檔位接口
void InitADC();                         //初始化ADC子程序聲明
uchar zhADC(uchar ch);                  //ADC 轉(zhuǎn)換子程序聲明
void delayms(uint k);                   //1ms延時(shí)子程序聲明
void SR();                              //執(zhí)行AD轉(zhuǎn)換結(jié)果子程序聲明H
void SRL();                             //執(zhí)行AD轉(zhuǎn)換結(jié)果子程序聲明L
uchar n = 0;                            //按鍵初始化


/*接口模式初始化*/
void port_mode()                        
{
   P2M1=0x00; P2M0=0x00;                // P2 P4燈和按鍵端口模式, 準(zhǔn)雙向口0x00
   P4M1=0x00; P4M0=0x00;
   P1M1 = 0x01;                         //P1.0高阻 P1.1強(qiáng)推挽:0000 0001 ADC輸入高阻、繼電器強(qiáng)上拉
   P1M0 = 0x02;                         //P1.0高阻 P1.1強(qiáng)推挽:0000 0010 ADC輸入高阻、繼電器強(qiáng)上拉
   out=0;                               //驅(qū)動(dòng)初始化0
}


/*void delay()                           //延時(shí)函數(shù)1
{
  uint  i, j;
  for(i = 0; i < 100; i++)  
  for(j = 0; j < 500; j++);
}
*/
void readkey(void)                   //按鍵讀取函數(shù)
{
  uchar  i, j;
  if(!key)  
    {
     for(i = 0; i < 10; i++)
     for(j = 0; j < 120; j++);       //延時(shí)消抖
  if(!key)  
    {
     while(!key);            //等待按鍵釋放
     n++;
     n %= 2;                //n = 0~2
     }
     }
  }


/*----------------------------
   初始化ADC
-----------------------------*/
void InitADC()
{
    P1ASF=0x01;                            //設(shè)置P1.0端口作為模擬輸入
    ADC_RES=0;                             //清除以前的結(jié)果
    ADC_CONTR=ADC_POWER|ADC_SPEEDLL;       //開啟ACD電源、設(shè)置轉(zhuǎn)換速度420
    delayms(1);                            //上電延時(shí)                                                
}


/*----------------------------
   獲取ADC結(jié)果
-----------------------------*/
uchar zhADC(uchar ch)                                //zhADC(獲取ADC結(jié)果)
{
    ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;    //啟動(dòng)轉(zhuǎn)換
    _nop_();                                         //4個(gè)時(shí)鐘延時(shí)
    _nop_();
    _nop_();
    _nop_();
    while(!(ADC_CONTR & ADC_FLAG));                  //等待完成標(biāo)志
    ADC_CONTR &=~ADC_FLAG;                           //Close ADC(關(guān)閉ADC)
    return ADC_RES;                                  //返回ADC結(jié)果
}


/*----------------------------
1ms延時(shí)子程序(12M晶振)
-----------------------------*/
void delayms(uint k)                    


{
    uint i,j;            
    for(i=k;i>0;i--)   
    for(j=747;j>0;j--);   
}
/*----------------------------
執(zhí)行ADC轉(zhuǎn)換結(jié)果子程序SR_高檔 SRL_低檔
-----------------------------*/
void SR()
{               
      uchar M;                        
      M=0x22;                         //TEMP=55度


      if (zhADC(0)>=M)                //如果ADC_1通道檢測(cè)值大于等于M
         out=1;                       //驅(qū)動(dòng)輸出1
    else
         out=0;                       //否則驅(qū)動(dòng)輸出0
}
/*低溫控制*/
void SRL()
{               
      uchar M;                        
      M=0x30;                         //TEMP=45度


      if (zhADC(0)>=M)                //如果ADC_1通道檢測(cè)值大于等于M
        out=1;                        //驅(qū)動(dòng)輸出1
    else
        out=0;                        //否則驅(qū)動(dòng)輸出0
}
void main()      //主函數(shù)
{
  port_mode();                         //初始化IO口
  InitADC();                           //Init ADC sfr (初始化ADC SFR)


  while(1)      
  {
  switch(n)      //開關(guān)選擇
  {
  case 0: ledL = 0;readkey(); SRL(); break;       //LEDL亮并執(zhí)行低檔控制45度


  case 1: ledH = 0;ledL = 1;readkey();SR(); break;              //LEDH亮并執(zhí)行高檔控制55度


  }
  }
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:563165 發(fā)表于 2019-6-15 22:08 | 只看該作者
可以根據(jù)記錄按鍵按下的次數(shù),以及按下的時(shí)間來做區(qū)別。具體功能我沒有看的太明白的,希望能補(bǔ)充說明!
回復(fù)

使用道具 舉報(bào)

板凳
ID:213173 發(fā)表于 2019-6-16 09:11 | 只看該作者
給你增加了加電等待,長(zhǎng)短按鍵控制開關(guān)和高低溫,運(yùn)行1小時(shí)自動(dòng)關(guān)機(jī)。如果樓主沒有使用ADC硬件濾波必須再增加軟件濾波,否則繼電器在溫度臨界點(diǎn)會(huì)抖動(dòng)。
  1. #include <STC15F2K60S2.H>
  2. //#include "stc15w.h"                       
  3. #include <intrins.H>                      //函數(shù)運(yùn)算頭文件
  4. #define uint unsigned int                 //宏定義變量0-6553
  5. #define uchar unsigned char               //宏定義變量0-255
  6. #define     MAIN_Fosc       11059200L     //定義主時(shí)鐘
  7. #define key_S 80                                                                        //宏定義短按(約20ms)
  8. #define key_L key_S*50                                                        //宏定義長(zhǎng)按(約1s)
  9. /*定義ADC參數(shù)*/
  10. #define ADC_POWER   0x80                //ADC power control dit (宏定義ADC電源控制位)1000 0000
  11. #define ADC_FLAG    0x10                //ADC complete flag (宏定義ADC完成標(biāo)志位)    0001 0000
  12. #define ADC_START   0x08                //ADC start control dit (宏定義ADC啟動(dòng)控制位)0000 1000
  13. #define ADC_SPEEDLL 0x00                //420 clocks (宏定義420時(shí)鐘)速度控制         0000 0000
  14. #define ADC_SPEEDL  0x20                //280 clocks (宏定義280時(shí)鐘)速度控制         0001 0000
  15. #define ADC_SPEEDH  0x40                //140 clocks (宏定義140時(shí)鐘)速度控制         0010 0000
  16. #define ADC_SPEEDHH 0x60                //070 clocks (宏定義70時(shí)鐘)速度控制          0011 0000
  17. /*定義接口*/
  18. sbit out=P1^1;                          //驅(qū)動(dòng)端口定義
  19. sbit key = P2^4;                        //定義KEY接口
  20. sbit ledL = P4^2;                       //定義低檔位接口
  21. sbit ledH = P4^3;                       //定義高檔位接口
  22. void InitADC();                         //初始化ADC子程序聲明
  23. uchar zhADC(uchar ch);                  //ADC 轉(zhuǎn)換子程序聲明
  24. void delayms(uint k);                   //1ms延時(shí)子程序聲明
  25. void SR();                              //執(zhí)行AD轉(zhuǎn)換結(jié)果子程序聲明H
  26. void SRL();                             //執(zhí)行AD轉(zhuǎn)換結(jié)果子程序聲明L
  27. //uchar n=0;                            //按鍵初始化
  28. uint Cnt250us=0,Cnt1s;//定時(shí)變量
  29. bit  ON_OFF=0; //開關(guān)位變量
  30. bit  H_L=0;                //高低溫位變量
  31. /*接口模式初始化*/
  32. void port_mode()                        
  33. {
  34.    P1M1 = 0x01;               //P1.0高阻 P1.1強(qiáng)推挽:0000 0001 ADC輸入高阻、繼電器強(qiáng)上拉
  35.    P1M0 = 0x02;               //P1.0高阻 P1.1強(qiáng)推挽:0000 0010 ADC輸入高阻、繼電器強(qiáng)上拉
  36.         P2M0 = 0x00;               //P2 P4燈和按鍵端口模式, 準(zhǔn)雙向口0x00
  37.         P2M1 = 0x00;
  38.         P4M0 = 0x00;
  39.         P4M1 = 0x00;
  40.    out=0;                         //驅(qū)動(dòng)初始化0
  41. }

  42. void readkey(void)                                        //按鍵讀取函數(shù)
  43. {
  44.         static uint count=0;                                //計(jì)數(shù)變量
  45.         if(!key)   
  46.         {  
  47.                 count++;  
  48.                 if(count==key_L)                                //長(zhǎng)按
  49.                         ON_OFF=~ON_OFF;                        //開關(guān)機(jī)選擇
  50.                 if(count>key_L)                                //防止count溢出
  51.                         count=key_L+1;          
  52.         }  
  53.         else                                                                        //按鍵抬起
  54.         {  
  55.                 if(count>key_S && count<key_L)//短按
  56.                 {
  57.                         if(ON_OFF==1)                        //開機(jī)狀態(tài)有效
  58.                                 H_L=~H_L;                        //高低溫選擇
  59.                 }
  60.                 count=0;                                        //count清0
  61.         }   
  62. }
  63. /*----------------------------
  64.    初始化ADC
  65. -----------------------------*/
  66. void InitADC()
  67. {
  68.     P1ASF=0x01;                            //設(shè)置P1.0端口作為模擬輸入
  69.     ADC_RES=0;                             //清除以前的結(jié)果
  70.     ADC_CONTR=ADC_POWER|ADC_SPEEDLL;       //開啟ACD電源、設(shè)置轉(zhuǎn)換速度420
  71.     delayms(1);                            //上電延時(shí)                                                
  72. }
  73. /*----------------------------
  74.    獲取ADC結(jié)果
  75. -----------------------------*/
  76. uchar zhADC(uchar ch)                                //zhADC(獲取ADC結(jié)果)
  77. {
  78.     ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;    //啟動(dòng)轉(zhuǎn)換
  79.     _nop_();                                         //4個(gè)時(shí)鐘延時(shí)
  80.     _nop_();
  81.     _nop_();
  82.     _nop_();
  83.     while(!(ADC_CONTR & ADC_FLAG));                  //等待完成標(biāo)志
  84.     ADC_CONTR &=~ADC_FLAG;                           //Close ADC(關(guān)閉ADC)
  85.     return ADC_RES;                                  //返回ADC結(jié)果
  86. }


  87. /*----------------------------
  88. 1ms延時(shí)子程序(12M晶振)
  89. -----------------------------*/
  90. void delayms(uint k)                    
  91. {
  92.     uint i,j;            
  93.     for(i=k;i>0;i--)   
  94.             for(j=747;j>0;j--);   
  95. }
  96. /*----------------------------
  97. 執(zhí)行ADC轉(zhuǎn)換結(jié)果子程序SR_高檔 SRL_低檔
  98. -----------------------------*/
  99. void SR()
  100. {               
  101.         uchar M;                        
  102.         M=0x22;                         //TEMP=55度
  103.         if(zhADC(0)>=M)                //如果ADC_1通道檢測(cè)值大于等于M
  104.                 out=1;                       //驅(qū)動(dòng)輸出1
  105.         else
  106.                 out=0;                       //否則驅(qū)動(dòng)輸出0
  107. }
  108. /*低溫控制*/
  109. void SRL()
  110. {               
  111.         uchar M;                        
  112.         M=0x30;                         //TEMP=45度
  113.         if(zhADC(0)>=M)                //如果ADC_1通道檢測(cè)值大于等于M
  114.                 out=1;                        //驅(qū)動(dòng)輸出1
  115.         else
  116.                 out=0;                        //否則驅(qū)動(dòng)輸出0
  117. }
  118. void Timer0Init()                //250微秒@11.0592MHz
  119. {
  120.         AUXR |= 0x80;                //定時(shí)器時(shí)鐘1T模式
  121.         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  122.         TL0 = 0x33;                        //設(shè)置定時(shí)初值
  123.         TH0 = 0xF5;                        //設(shè)置定時(shí)初值
  124.         TF0 = 0;                                //清除TF0標(biāo)志
  125.         TR0 = 1;                                //定時(shí)器0開始計(jì)時(shí)
  126. }

  127. void main()      //主函數(shù)
  128. {
  129.         port_mode(); //初始化IO口
  130.         InitADC();   //Init ADC sfr (初始化ADC SFR)
  131.         Timer0Init();//初始化定時(shí)器
  132.         while(1)      
  133.         {
  134.                 if(TF0==1)//查詢周期250us
  135.                 {
  136.                         TF0=0;
  137.                         readkey();//讀按鍵
  138.                         if(ON_OFF==1)
  139.                         {
  140.                                 Cnt250us++;
  141.                                 if(Cnt250us>=4000)
  142.                                 {
  143.                                         Cnt250us=0;
  144.                                         Cnt1s++;
  145.                                         if(Cnt1s>=3600)
  146.                                         {
  147.                                                 Cnt1s =0;
  148.                                                 ON_OFF=0;
  149.                                                 ledH = 1;
  150.                                                 ledL = 1;
  151.                                                 out  = 0;
  152.                                         }
  153.                                 }
  154.                                 if(H_L==1)
  155.                                 {
  156.                                         ledH = 0;
  157.                                         ledL = 1;
  158.                                         SR();
  159.                                 }
  160.                                 else
  161.                                 {
  162.                                         ledH = 1;
  163.                                         ledL = 0;
  164.                                         SRL();
  165.                                 }
  166.                         }
  167.                         else
  168.                         {
  169.                                 Cnt250us=0;
  170.                                 Cnt1s= 0;
  171.                                 ledH = 1;
  172.                                 ledL = 1;
  173.                                 out  = 0;
  174.                         }
  175.                 }
  176.         }
  177. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

地板
ID:562338 發(fā)表于 2019-6-16 10:58 | 只看該作者
wulin 發(fā)表于 2019-6-16 09:11
給你增加了加電等待,長(zhǎng)短按鍵控制開關(guān)和高低溫,運(yùn)行1小時(shí)自動(dòng)關(guān)機(jī)。如果樓主沒有使用ADC硬件濾波必須再增 ...

感謝大師!下載運(yùn)行正常。我學(xué)習(xí)學(xué)習(xí)一下先,你寫的控制效果比我的好很多啊,控溫反饋很及時(shí)。我驅(qū)動(dòng)的是MOS管,所以應(yīng)不用擔(dān)心反復(fù)的問題。我要的就是這種效果,控溫才能準(zhǔn)一些。不知道什么時(shí)候才能學(xué)到PID技術(shù)那一步
回復(fù)

使用道具 舉報(bào)

5#
ID:562338 發(fā)表于 2019-6-17 23:56 | 只看該作者
wulin 發(fā)表于 2019-6-16 09:11
給你增加了加電等待,長(zhǎng)短按鍵控制開關(guān)和高低溫,運(yùn)行1小時(shí)自動(dòng)關(guān)機(jī)。如果樓主沒有使用ADC硬件濾波必須再增 ...

大師,謝謝你的幫助。你的是充分利用if  else。但和我原來想的用的switch區(qū)別還是滿大的,F(xiàn)在想自己增加多一道M檔,增加不進(jìn)去了。能再幫我增加多一道SRM();  嗎。麻煩你了。
回復(fù)

使用道具 舉報(bào)

6#
ID:562338 發(fā)表于 2019-7-8 11:01 | 只看該作者
經(jīng)過大半個(gè)月的抽空學(xué)習(xí)和償試,已實(shí)現(xiàn)想要的功能。
思路就是短按時(shí),增加n++,通過switch(n),短按就可以選擇幾種模式了。終于實(shí)現(xiàn)長(zhǎng)按開關(guān),短按換子程序了。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表