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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4855|回復: 9
收起左側

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

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

按照這個抄的,關鍵新手沒抄好 。  現在 否則為短按有效果 不知道哪里沒抄到位。求大神指導。

程序見2樓
回復

使用道具 舉報

ID:634487 發表于 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;
         }
}




回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

ID:213173 發表于 2019-12-19 10:11 | 顯示全部樓層
樓主按照原作示例寫的程序不成功是沒有充分理解原作意圖。樓主的頭文件#include <STC15Wxx.h>,想必是使用了STC15系列單片機,由于STC15系列是1T單片機,速度比51快許多,所以原來的延時函數要修改。原作是用定時器中斷計數的方式判斷長、短按時間,樓主沒有開中斷,所以numl不可能>= 10,也就不會有長按響應。
給你的代碼補充完整:
  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;//按鍵有效標志位變量
  11. uchar count = 0;//中斷計數變量
  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;                //設置定時器模式
  29.         TH0 = 0xDC;                //10毫秒@11.0592MHz
  30.         TL0 = 0x00;                //10毫秒@11.0592MHz
  31.         TR0 = 0;                        //定時器0關閉
  32.         ET0 = 1;                        //開定時器0中斷
  33.         EA  = 1;                        //開總中斷
  34.         while(1)
  35.         {
  36.                 if(key == 0)//判斷鍵按下
  37.                 {
  38.                         delayms(10);//延時10ms防抖
  39.                         if(key == 0)//確認鍵按下
  40.                         {
  41.                                 key_flag = 1; //有效標志位置1
  42.                                 TR0 = 1;                        //開定時器
  43.                                 while(!key);        //等待松手
  44.                                 TR0 = 0;                        //關定時器
  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;                                //中斷計數變量清0
  59.                 key_flag = 0;                //按鍵有效標志位清0
  60.         }
  61. }
  62. //定時器0 中斷服務函數
  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++;                //中斷計數變量自+1
  69. }
復制代碼
回復

使用道具 舉報

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

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

使用道具 舉報

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

多謝你的指導,我想在主程序加入別的程序。也就是沒有中斷的時候干別的事情。
我現在加了后,按鍵按下去后很難進入到中斷程序里。也就是反應遲鈍。不能夠隨時中斷。中斷后執行中斷程序 一直到中斷程序結束,中間不在接受中斷。



加在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--);




回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九色一区 | 成人性视频在线播放 | 久久高清 | 黄网站在线播放 | 欧美日韩在线观看视频网站 | 国产在线一区二区三区 | 日韩精品一区二区三区中文在线 | 亚洲欧美一区二区三区国产精品 | 精久久久久 | 欧美激情久久久 | 97精品国产97久久久久久免费 | 欧美一区二区在线视频 | 亚洲国产精品一区 | www.日本在线观看 | 日韩二| 日本一区二区三区四区 | 日日干天天操 | 亚洲精品一区二区在线观看 | 成人av影院| 国产精品二区三区在线观看 | 日韩欧美一级精品久久 | 99精品视频免费观看 | 亚洲精品美女视频 | 日韩另类视频 | 午夜精品网站 | 国产在线精品一区二区三区 | 成人a视频 | 午夜精品一区二区三区在线观看 | www日韩| 国产在线视频一区二区董小宛性色 | 99reav| 91视频久久 | 日本一区二区三区在线观看 | 欧美福利影院 | av中文在线 | 久久久久久久久久性 | 亚洲国产成人精品女人 | 精品国产一区二区在线 | 美日韩免费 | 一区二区免费在线视频 | 午夜一区二区三区在线观看 |