找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4773|回復(fù): 9
收起左側(cè)

單片機單獨按鍵時間長短控制請教

[復(fù)制鏈接]
ID:634487 發(fā)表于 2019-12-18 22:54 | 顯示全部樓層 |閱讀模式
https://blog.csdn.net/Mr_jianfeng/article/details/79507108

按照這個抄的,關(guān)鍵新手沒抄好 。  現(xiàn)在 否則為短按有效果 不知道哪里沒抄到位。求大神指導(dǎo)。

程序見2樓
回復(fù)

使用道具 舉報

ID:634487 發(fā)表于 2019-12-18 22:56 | 顯示全部樓層
#include <STC15Wxx.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define count unsigned int
sbit key=P1^7;               
sbit k=P3^1;                       
sbit key1=P3^0;                       
sbit key2=P3^2;                       
sbit key3=P0^3;                                 

uchar key_flag = 0;
ulong numl;

void delayms (uint xms)           //添加延時
        {
          uint i, j;
                for(i=xms;i>0;i--)
                  for(j=110;j>0;j--);
        }


main()
{

           TMOD=0x01;
        TH0 = 0xB8;
        TL0 = 0x00;
         ET0=1;
     TR0=1;
     EA = 1;
while(1)
{
static key_flag;
   if(key == 0)
     {
            delayms (10);
                if(key == 0)
                {
                  key_flag = 1;
                   TR0 = 1;
                  while(!key);
                   TR0 = 0;
                }
           }
         if(key_flag)
           {
                  if(numl>= 10)
                  {
                   key2 = 0 ;
                              numl =0 ;
                   key_flag = 0;
                  }
                  else
                  {
                    key3 = ~key3 ;
                                numl =0 ;
                    key_flag = 0;
                  }
           }
           numl =0 ;
           key_flag = 0;
         }
}




回復(fù)

使用道具 舉報

ID:634487 發(fā)表于 2019-12-18 22:59 | 顯示全部樓層
怎么發(fā)程序    我這發(fā)的都是亂碼了
回復(fù)

使用道具 舉報

ID:210017 發(fā)表于 2019-12-18 23:19 | 顯示全部樓層
程序改成,按鍵按下后這個變量numl自加,然后判斷這個變量大小,確定是長按還是短按
回復(fù)

使用道具 舉報

ID:634487 發(fā)表于 2019-12-19 01:11 | 顯示全部樓層
問題解決了  管理刪了吧
回復(fù)

使用道具 舉報

ID:332444 發(fā)表于 2019-12-19 04:28 | 顯示全部樓層
回復(fù)

使用道具 舉報

ID:164602 發(fā)表于 2019-12-19 08:19 | 顯示全部樓層
可以看看我的程序:
                if (Agoto==1)//如果相應(yīng)的鍵按下
                {
                        n=0;//時間計數(shù)復(fù)位
                        while(Agoto)//如果鍵一直按著
                        {
                                n++;//時間開始計數(shù)
                                Delay10ms(1);//計時一次0.01s
                                if (n>200)//如果長時間按著不放,大于2s
                                {
                                        break;//則退出
                                }
                        }
                        if (n>30)//如果時間次數(shù)大于30次小于200,即大于0.3s小于2s
                        {
                                PWMD();//執(zhí)行這個
                        }
                        else//否則,時間小于0.3s
                        {
                                PU();//執(zhí)行這個
                        }
                }
是一鍵雙功能吧。
這個程序已經(jīng)在我的無線電遙控小車上真實使用通過。
對了,延時程序也給你:
void Delay10ms(unsigned int c)
{
    unsigned char a,b;
    for(c;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2019-12-19 10:11 | 顯示全部樓層
樓主按照原作示例寫的程序不成功是沒有充分理解原作意圖。樓主的頭文件#include <STC15Wxx.h>,想必是使用了STC15系列單片機,由于STC15系列是1T單片機,速度比51快許多,所以原來的延時函數(shù)要修改。原作是用定時器中斷計數(shù)的方式判斷長、短按時間,樓主沒有開中斷,所以numl不可能>= 10,也就不會有長按響應(yīng)。
給你的代碼補充完整:
  1. #include <STC15Wxx.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define ulong unsigned long

  6. sbit key        =P1^7;               
  7. sbit LED1=P3^0;                        
  8. sbit LED2=P3^1;                        
  9.                                 
  10. bit key_flag = 0;//按鍵有效標(biāo)志位變量
  11. uchar count = 0;//中斷計數(shù)變量
  12. /*
  13. void delayms(uint xms) //添加延時
  14. {
  15.         uint i, j;
  16.         for(i=xms;i>0;i--)
  17.                 for(j=110;j>0;j--);//12T單片機
  18. }*/
  19. void delayms(uint xms) //添加延時
  20. {
  21.         uint i, j;
  22.         for(i=xms;i>0;i--)
  23.                 for(j=1150;j>0;j--);//1T單片機
  24. }

  25. void main()
  26. {       
  27.         //初始化定時器0
  28.         TMOD= 0x01;                //設(shè)置定時器模式
  29.         TH0 = 0xDC;                //10毫秒@11.0592MHz
  30.         TL0 = 0x00;                //10毫秒@11.0592MHz
  31.         TR0 = 0;                        //定時器0關(guān)閉
  32.         ET0 = 1;                        //開定時器0中斷
  33.         EA  = 1;                        //開總中斷
  34.         while(1)
  35.         {
  36.                 if(key == 0)//判斷鍵按下
  37.                 {
  38.                         delayms(10);//延時10ms防抖
  39.                         if(key == 0)//確認(rèn)鍵按下
  40.                         {
  41.                                 key_flag = 1; //有效標(biāo)志位置1
  42.                                 TR0 = 1;                        //開定時器
  43.                                 while(!key);        //等待松手
  44.                                 TR0 = 0;                        //關(guān)定時器
  45.                         }
  46.                 }
  47.                 if(key_flag)                        //判斷按鍵有效
  48.                 {
  49.                         if(count>=100)        //超過1秒算長按
  50.                         {
  51.                                 LED1=~LED1;        //LED1取反
  52.                         }
  53.                         else                                //小于1秒算短按
  54.                         {
  55.                                 LED2=~LED2;        //LED2取反
  56.                         }
  57.                 }
  58.                 count=0;                                //中斷計數(shù)變量清0
  59.                 key_flag = 0;                //按鍵有效標(biāo)志位清0
  60.         }
  61. }
  62. //定時器0 中斷服務(wù)函數(shù)
  63. void Timer0Interrupt(void) interrupt 1
  64. {
  65.         TH0 = 0xDC;                //10毫秒@11.0592MHz
  66.         TL0 = 0x00;                //10毫秒@11.0592MHz
  67.         if(count<250)        //防止溢出
  68.                 count++;                //中斷計數(shù)變量自+1
  69. }
復(fù)制代碼
回復(fù)

使用道具 舉報

ID:634487 發(fā)表于 2019-12-19 13:24 | 顯示全部樓層
HC6800-ES-V2.0 發(fā)表于 2019-12-19 08:19
可以看看我的程序:
                if (Agoto==1)//如果相應(yīng)的鍵按下
                {

多謝你的例程,我現(xiàn)在主要是實驗在主程序運行的時候。按鍵中斷可以隨時的中斷。
回復(fù)

使用道具 舉報

ID:634487 發(fā)表于 2019-12-19 13:47 | 顯示全部樓層
wulin 發(fā)表于 2019-12-19 10:11
樓主按照原作示例寫的程序不成功是沒有充分理解原作意圖。樓主的頭文件#include ,想必是使用了STC15系列單 ...

多謝你的指導(dǎo),我想在主程序加入別的程序。也就是沒有中斷的時候干別的事情。
我現(xiàn)在加了后,按鍵按下去后很難進(jìn)入到中斷程序里。也就是反應(yīng)遲鈍。不能夠隨時中斷。中斷后執(zhí)行中斷程序 一直到中斷程序結(jié)束,中間不在接受中斷。



加在while(1)下面的
k2 = 0;
for(i=3000;i>0;i--)
for(j=110;j>0;j--);
k2 = 1;  
for(i=3000;i>0;i--)
for(j=110;j>0;j--);




回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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