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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

請問怎么寫這個10s燈滅的語句 幫下忙解解惑

  [復制鏈接]
跳轉到指定樓層
樓主
按下按鍵燈亮 松按鍵燈滅
按下按鍵10s燈滅(一直按按鍵不松燈也滅)

用計時器完成10s的計時

請問怎么寫這個10s燈滅的語句

關鍵是一直按著按鍵如何能讓燈滅呢

寫了if語句不能保證按鍵按著還能夠燈滅
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

來自 5#
ID:213173 發表于 2018-2-9 08:29 | 只看該作者
weiwei850113 發表于 2018-2-8 21:53
困擾我好幾天了

就是寫不出按鍵按著燈滅的語句

給你一個例程,按鍵和LED端口根據你的實際電路定義
#include <AT89X52.H>
#define uint unsigned int
#define uchar unsigned char
sbit key=P3^4;                                        //按鍵端口定義       
sbit LED=P1^0;                                        //發光管端口定義
uchar Cnt50ms=0;                                //中斷計數變量

void Timer0Init()                                //50毫秒@12.000MHz
{
        TMOD= 0x01;                                        //設置定時器模式
        TL0 = 0xB0;                                        //設置定時初值
        TH0 = 0x3C;                                        //設置定時初值
//        TF0 = 0;                                                //清除TF0標志
//        TR0 = 1;                                                //定時器0開始計時
        EA=1;                                                        //開總中斷
        ET0=1;                                                //開定時器0中斷       
}
void keyscan()                                        //按鍵識別子程序
{
        static bit key_sign=0;        //按鍵有效標志
        static uint  count=0;        //計數變量                       
        if(key==0)                                        //檢測按鍵如果為0
        {
                count++;                                        //消抖計數
                if((count>=500)&&(key_sign==0))
                {                       
                        key_sign=1;                        //按鍵有效標志置1
                        Cnt50ms=0;                        //中斷計數變量清0
                        TR0 = 1;                                //啟動定時器
                        LED=0;                                //發光管亮
                }
        }
        else                                                        //按鍵抬起
        {
                key_sign=0;                                //按鍵有效標志清0
                count=0;                                        //消抖計數清0
                LED=1;                                        //發光管滅
                TR0=0;                                        //關閉定時器
        }
}
void main()
{
        Timer0Init();                                //定時器0初始化
        while(1)
        {
                keyscan();                                //按鍵掃描
        }
}
void timer0() interrupt        1        //定時器0中斷
{
        TL0 = 0xB0;                                        //設置定時初值
        TH0 = 0x3C;                                        //設置定時初值
        Cnt50ms++;
        if(Cnt50ms>=200)                        //10秒
        {
                Cnt50ms=0;
                LED=1;                                        //發光管滅
                TR0=0;                                        //關閉定時器
        }
}

評分

參與人數 2黑幣 +18 收起 理由
通天塔 + 8 很給力!
weiwei850113 + 10 很給力!

查看全部評分

回復

使用道具 舉報

來自 8#
ID:47286 發表于 2018-2-10 22:30 | 只看該作者
隨便寫了下思路 供你參考吧

這個思路的問題是 不管什么時候 都有個防抖延時的損失 等于程序的實時性有點差 不過一般防抖都是15~20ms 對于你初學 不要求運行精度的情況下沒什么影響 至少人去按鍵時感覺不出來有什么差別

嚴謹的話還是用標記或者進程來控制狀態好 你慢慢來 將來會搞得很好的

如果 按鍵按下
{
        防抖延時
        如果 按鍵依舊按下
        {
                如果 計數器01清零標記==0
                {
                        計數器01清零
                        計數器01清零標記置位
                }
                如果 燈為滅狀態
                {
                        開燈
                }
                如果 計數器01達到設定值
                {
                        如果 燈為開狀態
                        {
                                關燈
                                等待按鍵釋放
                                計數器01清零標記清零
                        }
                }
        }
}

如果 按鍵松開(等同于未按下)
{
        防抖延時
        如果 按鍵松開
        {
                如果 等為亮狀態
                {
                        關燈
                }
        }
        計數器01清零標記清零
}

評分

參與人數 1黑幣 +80 收起 理由
admin + 80 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

沙發
ID:241249 發表于 2018-2-8 21:53 | 只看該作者
困擾我好幾天了

就是寫不出按鍵按著燈滅的語句
回復

使用道具 舉報

板凳
ID:155507 發表于 2018-2-8 23:17 | 只看該作者
用同一個按鍵 利用外部雙向中斷(上升沿+下降沿)處理。
回復

使用道具 舉報

地板
ID:280994 發表于 2018-2-8 23:44 | 只看該作者
按鍵觸發檢測的方式改為邊沿檢測,這樣按住的話沒有邊沿信號不久可以了嘛

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

6#
ID:126165 發表于 2018-2-9 09:59 | 只看該作者
按鍵觸發的是計時器的亮燈程序即可,如果不能用中斷,可以選擇在計時程序中加入if (key==0)break,直接跳出子程序。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

7#
ID:282917 發表于 2018-2-10 19:59 | 只看該作者
掃描到按鍵按下以后,計時器開始計時,計時時間大概10ms一次,按鍵還是按著的,計數,滿10
s就燈滅,如果中途掃到按鍵不安著了,關中斷,滅燈

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

9#
ID:89515 發表于 2018-2-14 13:07 | 只看該作者
不知問題可有解決。你想一想按鍵按下為什么燈不滅。按鍵一直按下是會造成cpu時間堵塞的。這樣常規的按鍵檢測方式會有意想不到的后果。所以你有兩種常用的方法可以解決,第一按鍵程序寫為狀態機的方式,但是你必須懂這種方式,第二把按鍵程序寫成中斷的方式,是定時器中斷不是外部中斷。狀態機的方式可以在網上學習。定時器中斷就很簡單了,當主程序檢測到按鍵按下,不要延時消除抖動,直接啟動定時器。在定時器中斷里對按鍵端口進行判斷,如果端口為低電平就不用關閉定時器,反之關閉。這里你要按下多久,就多久關閉就行了。定時器的溢出時間可以是10毫秒級,這樣不用浪費CPU資源.你可以做很多事情,就不要說改變LED狀態了。狀態機的方式與之有些類似,但學好了要強大很多。所有的程序都可以用。而且用好了都不會遇到CPU堵塞的情況

評分

參與人數 1黑幣 +70 收起 理由
admin + 70 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

10#
ID:964852 發表于 2021-11-18 10:03 | 只看該作者
wulin 大神!膜拜
回復

使用道具 舉報

11#
ID:554500 發表于 2021-11-18 10:55 | 只看該作者
//用定時器100ms調用一次
sbit key=P1^0;
void key_scan()
{
        static u8 i=0,n=0;
       
        if(key==0)
        {
                if(i==0)
                {
                        if(key==0&&n++>100) //100ms *100=10000ms=10s
                        {
                                i=1;
                                //燈滅
                        }
                }
        }
        else
        {
                i=0;
                n=0;
        }
}
回復

使用道具 舉報

12#
ID:554500 發表于 2021-11-18 11:23 | 只看該作者


#include<reg52.h>
#include "LCD1602.H"
#define u8 unsigned char
#define u16 unsigned int
sbit LED=P2^0;
sbit KEY=P2^1;
bit Time_f=0;
void Timer0_init() //50毫秒@12.000MHz
{
  TMOD|=0x01;
TL0 = (65536-50000)%256;  //設置定時初始值
TH0 = (65536-50000)/256;  //設置定時初始值
TF0 = 0;  //清除TF0標志
TR0 = 1;  //定時器0開始計時
ET0=1;
EA=1;
}
void isr_timer0()interrupt 1  //定時器0中斷服務子函數
{
TL0 = (65536-50000)%256;  //設置定時初始值
TH0 = (65536-50000)/256;  //設置定時初始值
Time_f=1;
}
//50ms調用一次
//短按燈亮,長按燈滅
void KEY_SCAN()
{
static u8 i=0,c=0;

if(KEY==0)
{
  if(i==0)
  {
   if(KEY==0&&c++>=200) //50ms*200=10000ms=10s
   {
    i=1;
    LED=1; //燈滅
   }
  }
}
else
{
  if(c>1&&c<200)
   LED=0; //燈亮
  
  i=0;
  c=0;
}
}
void main()
{

Timer0_init();
  while(1)
{
  if(Time_f)
  {
   Time_f=0;
   KEY_SCAN();
  }
}
}

51單片機定時器proteus仿真.zip

103.31 KB, 下載次數: 1

回復

使用道具 舉報

13#
ID:123289 發表于 2021-11-18 12:53 | 只看該作者
要點如下:
1、按鍵確認:彈動處理,略。
2、按鍵邊沿識別:通過【按鍵確認】后是0,是1,并與上次鍵值比較是否相同,達成【按鍵前沿確認】的目的。如按下=0,則上次為1,本次為0時,為前沿;如按下=1,則上次為0,本次為1時,為前沿。上次鍵值要做好標記。
3、用定時器計時:做個標記T,T=1 時計時器增加,T=0不計。
4、計時起動:【按鍵前沿確認】時置T=1。
5、計時器停止:當計時器增加達到10秒時,清T0。
6、顯示:T=1時亮,T=0時滅。可以只有4、5、時變動一下。

記住:寫程序最重要的是構思,邏輯上先要說得通!而后再據此寫程序。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品欧美日韩 | 国产精品久久久久久久久久免费看 | 国产免费拔擦拔擦8x高清 | 亚洲不卡在线视频 | 成人在线视频网址 | 国产成人自拍av | 中文字幕av网址 | 超碰在线97国产 | 日本视频中文字幕 | 国产精品99久| 精品欧美一区二区三区久久久 | 日韩色在线 | 九九精品在线 | 精品国产乱码久久久久久久久 | 久久日韩精品 | 视频第一区| 日韩精品1区2区 | 视频一区二区三区四区五区 | 亚洲成人av在线播放 | 黄色网址大全在线观看 | 91精品国产综合久久久久久丝袜 | 国产精品视频一区二区三区不卡 | 精品国产乱码久久久久久蜜臀 | 色婷婷一区二区三区四区 | 日韩毛片播放 | 理论片87福利理论电影 | 久久精品国产久精国产 | 激情小视频 | 国产激情一区二区三区 | 亚洲狠狠 | 在线国产小视频 | 有码一区 | 国产成人免费观看 | 久久91| 日韩av中文 | 97久久精品午夜一区二区 | 精品伊人 | 精品国产黄a∨片高清在线 www.一级片 国产欧美日韩综合精品一区二区 | 丁香五月网久久综合 | 亚洲国产成人精品在线 | 免费一区二区 |