久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

如何增加這個按鍵和定時的程序的功能?求幫助

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


/*定義ADC參數*/


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


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


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


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


/*----------------------------
   獲取ADC結果
-----------------------------*/
uchar zhADC(uchar ch)                                //zhADC(獲取ADC結果)
{
    ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;    //啟動轉換
    _nop_();                                         //4個時鐘延時
    _nop_();
    _nop_();
    _nop_();
    while(!(ADC_CONTR & ADC_FLAG));                  //等待完成標志
    ADC_CONTR &=~ADC_FLAG;                           //Close ADC(關閉ADC)
    return ADC_RES;                                  //返回ADC結果
}


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


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


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


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


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


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


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

使用道具 舉報

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

使用道具 舉報

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

  42. void readkey(void)                                        //按鍵讀取函數
  43. {
  44.         static uint count=0;                                //計數變量
  45.         if(!key)   
  46.         {  
  47.                 count++;  
  48.                 if(count==key_L)                                //長按
  49.                         ON_OFF=~ON_OFF;                        //開關機選擇
  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)                        //開機狀態有效
  58.                                 H_L=~H_L;                        //高低溫選擇
  59.                 }
  60.                 count=0;                                        //count清0
  61.         }   
  62. }
  63. /*----------------------------
  64.    初始化ADC
  65. -----------------------------*/
  66. void InitADC()
  67. {
  68.     P1ASF=0x01;                            //設置P1.0端口作為模擬輸入
  69.     ADC_RES=0;                             //清除以前的結果
  70.     ADC_CONTR=ADC_POWER|ADC_SPEEDLL;       //開啟ACD電源、設置轉換速度420
  71.     delayms(1);                            //上電延時                                                
  72. }
  73. /*----------------------------
  74.    獲取ADC結果
  75. -----------------------------*/
  76. uchar zhADC(uchar ch)                                //zhADC(獲取ADC結果)
  77. {
  78.     ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;    //啟動轉換
  79.     _nop_();                                         //4個時鐘延時
  80.     _nop_();
  81.     _nop_();
  82.     _nop_();
  83.     while(!(ADC_CONTR & ADC_FLAG));                  //等待完成標志
  84.     ADC_CONTR &=~ADC_FLAG;                           //Close ADC(關閉ADC)
  85.     return ADC_RES;                                  //返回ADC結果
  86. }


  87. /*----------------------------
  88. 1ms延時子程序(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. 執行ADC轉換結果子程序SR_高檔 SRL_低檔
  98. -----------------------------*/
  99. void SR()
  100. {               
  101.         uchar M;                        
  102.         M=0x22;                         //TEMP=55度
  103.         if(zhADC(0)>=M)                //如果ADC_1通道檢測值大于等于M
  104.                 out=1;                       //驅動輸出1
  105.         else
  106.                 out=0;                       //否則驅動輸出0
  107. }
  108. /*低溫控制*/
  109. void SRL()
  110. {               
  111.         uchar M;                        
  112.         M=0x30;                         //TEMP=45度
  113.         if(zhADC(0)>=M)                //如果ADC_1通道檢測值大于等于M
  114.                 out=1;                        //驅動輸出1
  115.         else
  116.                 out=0;                        //否則驅動輸出0
  117. }
  118. void Timer0Init()                //250微秒@11.0592MHz
  119. {
  120.         AUXR |= 0x80;                //定時器時鐘1T模式
  121.         TMOD &= 0xF0;                //設置定時器模式
  122.         TL0 = 0x33;                        //設置定時初值
  123.         TH0 = 0xF5;                        //設置定時初值
  124.         TF0 = 0;                                //清除TF0標志
  125.         TR0 = 1;                                //定時器0開始計時
  126. }

  127. void main()      //主函數
  128. {
  129.         port_mode(); //初始化IO口
  130.         InitADC();   //Init ADC sfr (初始化ADC SFR)
  131.         Timer0Init();//初始化定時器
  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. }
復制代碼
回復

使用道具 舉報

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

感謝大師啊!下載運行正常。我學習學習一下先,你寫的控制效果比我的好很多啊,控溫反饋很及時。我驅動的是MOS管,所以應不用擔心反復的問題。我要的就是這種效果,控溫才能準一些。不知道什么時候才能學到PID技術那一步
回復

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区三区在线观看 | 日韩资源 | 天天射美女 | 欧美激情精品久久久久久变态 | 免费看黄色国产 | 黄色大片免费网站 | 午夜精品福利视频 | aaa一区 | 久久久天天| 午夜免费网 | 黄在线免费观看 | 色综合久久久 | 国产三级电影网站 | 视频一区在线播放 | 亚洲三区在线观看 | 黄色一级电影在线观看 | 羞羞视频在线观看 | 人人爽人人爽 | 国产女人与拘做受视频 | 欧美一区二区免费电影 | 成人av影院 | www.99久久.com | 国产欧美精品一区二区 | 久久ww| 91免费观看 | 天天综合永久入口 | 五月婷婷在线播放 | 97操操| 自拍偷拍第一页 | 四虎影视免费观看 | a黄视频| 97人人澡人人爽91综合色 | 超碰97av | 欧美一区二区 | 成年无码av片在线 | 高清国产午夜精品久久久久久 | 狠狠亚洲 | 国产一区二区影院 | 国产一区 日韩 | 玖玖视频 | 日韩在线免费 |