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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3699|回復: 7
收起左側

我想實現長按k1按鍵3s開機再按3s關機 單片機程序為啥不行?請大神看下

[復制鏈接]
ID:714987 發表于 2020-5-18 16:54 | 顯示全部樓層 |閱讀模式
51hei圖片20200518165350.png

單片機源程序如下:
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit LED=P1^1;
sbit KEY=P2^0;
static uint i=0;

void Timer0Init() //定時器0初始化
{
TMOD |= 0x01; //模式1
TMOD &= 0x0F;
TH0 = (65536-1000)/256;
TL0 = (65536-1000)%256; //定時1ms
EA=1;
ET0=1;
TR0=1; //T0中斷溢出請求標志位
}

void delay (uint i) //延時函數
{
while(i--);
}

void main()
{
while(1) //一直檢測按鍵是否按下 ?按下則進入中斷
{
delay(1000);
if(KEY==0)
{
delay(1000); //按鍵消抖
if(KEY==0)
Timer0Init(); //定時器0初始化 申請中斷
}
else
{
TR0=0; //無按鍵按下時,關閉定時器中斷申請? 將i置零
i=0;
}
}
}
void Timer0() interrupt 1 //中斷函數
{
TH0 = (65536-1000)/256;
TL0 = (65536-1000)%256;
i++;if(i>=3000) //超過3s開燈 i++至3000時 為3s
LED=~LED;
}
回復

使用道具 舉報

ID:714987 發表于 2020-5-18 16:55 | 顯示全部樓層
即lled的亮與滅
回復

使用道具 舉報

ID:332444 發表于 2020-5-18 19:29 | 顯示全部樓層
建議:既然有中斷計時,循環延時就沒必要了,完全可以由中斷計時獲得延時了。你這樣寫中斷控制LED的代碼與按鍵無關,只是每3秒變換LED而已。
回復

使用道具 舉報

ID:332444 發表于 2020-5-18 19:32 | 顯示全部樓層
另外按鍵處理邏輯不清晰,應當把中斷的判斷3秒移出到按鍵代碼中,再理清按鍵處理邏輯,應該就差不多了。
回復

使用道具 舉報

ID:562338 發表于 2020-5-18 21:23 | 顯示全部樓層
#include "stc15w.h"                       
#include <intrins.H>                      //函數運算頭文件
#define uint unsigned int                 //宏定義變量0-6553
#define uchar unsigned char               //宏定義變量0-255
#define     MAIN_Fosc       11059200L     //定義主時鐘
#define key_S 80                          //宏定義短按(約20ms)
#define key_L key_S*50                    //宏定義長按(約1s)

void readkey(void)                        //按鍵讀取函數
{
        static uint count=0;              //計數變量
        if(!key)   
        {  
                count++;  
                if(count==key_L)          //長按
                        ON=~ON;           //長按要運行的
                if(count>key_L)           //防止count溢出
                        count=key_L+1;           
        }  
        else                               //按鍵抬起
        {  
                if(count>key_S && count<key_L)//短按
                {
                        if(ON==1)             //開機狀態有效
                          HL=~HL;             //短按要運行的
                }
                count=0;                      //count清0
        }   
}
回復

使用道具 舉報

ID:712493 發表于 2020-5-18 22:43 來自觸屏版 | 顯示全部樓層
這個初始會不會老把定時器清除
IMG_20200518_224101.jpg
回復

使用道具 舉報

ID:213173 發表于 2020-5-19 07:27 | 顯示全部樓層
void key_scan()
{
        static unsigned int count=0;
        static bit key_lock=0;
        if(!KEY)
        {
                if(++count>=65000 && key_lock==0)
                {
                        key_lock=1;
                        LED=~LED;
                }
        }
        else
        {
                count=0;
                key_lock=0;
        }
}
回復

使用道具 舉報

ID:548551 發表于 2020-5-19 11:43 | 顯示全部樓層

單片機源程序如下:
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit P_LED=P1^1;
sbit P_KEY=P2^0;
///////////////////////////////
bit                F_4MS=0;
bit                f_key_press=0;                        //按下彈起標志位:0 彈起 1 按下
bit                f_key_ctrl=0;                        //長按標志位
bit                F_WORK_ON=0;                //開關機標志位:1開機 0關機
/////////////////////////////////       
unchar        press_cnt=0;
unint                ctrl_cnt=0;
unchar        show_time=0;
void Timer0Init() //定時器0初始化
{
        TMOD |= 0x01; //模式1
        TMOD &= 0x0F;
        TH0 = (65536-1000)/256;
        TL0 = (65536-1000)%256; //定時1ms
        EA=1;
        ET0=1;
        TR0=1; //T0中斷溢出請求標志位
        ///////這個作為主程序的定時,所有的定時都是在這上面進行計算
}

void main(void)
{
        POWER_INIT();                //單片機初始化:配置IO口輸出輸出屬性,這個你沒有配置,輸入的情況是否要開上拉,這個你也沒有配置.
                                        //IO口為輸出時,該IO口的初始化電平是高還是低,如果共陰的IO口初始化電平給低,如果共陽的就給高,
                                        //你這原理圖上是共陽的,所以初始化IO口需要給高電平,防止沒有開機的情況下就亮了, 因為你沒有配置IO
                                        //口的電平一般初始化模式是配置給底電平.
        Timer0Init();                //T0初始化
        while(1) //一直檢測按鍵是否按下 ?按下則進入中斷
        {
                if(F_1MS)
                {
                        F_1MS=0;
                        //清看門狗                                //你自己找下清理看門狗的代碼是什么
                        KEY_SCAN();                        //按鍵掃描
                        LED_DISPLAY();                        //燈顯示
                }
        }
}
/*按鍵掃描子函數模塊,記得給IO口設置為輸入,并且開內部上拉*/
void KEY_SCAN(void)
{
        if(!f_key_press)                                                                //檢測按下
        {
                if(P_KEY){press_cnt=0;}                                        //按鍵檢測到有高電平就清零計數
                press_cnt++;                                                        //按鍵變量++
                if(press_cnt>=40)                                                //累加到40次,也就是消抖完成了
                {
                        press_cnt=0;                                                //清零計數變量
                        f_key_press=1;                                                //把這個標志位置1,表示已經按下了
                        f_key_ctrl=1;                                                //長按標志位置1,
                }
        }
        else
        {
                if(!P_KEY){press_cnt=0;}                                        //檢測彈起
                press_cnt++;
                if(press_cnt>=40)
                {
                        press_cnt=0;
                        f_key_press=0;
                        if(F_WORK_ON&&f_key_ctrl)                        //開機短按后可以增加功能
                        {
                                //功能自己添加
                        }
                        f_key_ctrl=0;                                                //這個標志位不能漏,因為短按的時候這個標志位容易漏掉
                }
        }
        //////////////////////
        if(f_key_ctrl)                                                                //檢測長按
        {
                ctrl_cnt++;
                if(ctrl_cnt>=3000)                                                //加到3000次 ,也就是3S
                {
                        ctrl_cnt=0;                                                //清零累加計數
                        f_key_ctrl=0;                                                //清標志位
                        F_WORK_ON=!F_WORK_ON;                        //開機或者關機
                }
        }
        else                                                                                //這個標志位為0的時候清零累加計數
        {
                ctrl_cnt=0;
        }
}
void LED_DISPLAY(void)
{
        if(F_WORK_ON)
        {
                P_LED=0;
        }
        else
        {
                P_LED=1;
        }
}
void Timer0() interrupt 1 //中斷函數
{
        TH0 = (65536-1000)/256;
        TL0 = (65536-1000)%256;
        F_1MS=1;                        //這個標志位看主程序
}



前面那個POWER_INIT();這個函數你要自己配置,就是IO口的輸入輸出屬性,開不開上拉,初始電平的高低.  思路是這個思路. 這是一個模版.希望你可以看看,并且希望對你有幫助.因為我是在網頁上編輯的,所以沒有在KEIL里面驗證,如果有報錯, 你自己解決一下,但是整體的一個按鍵思路是這樣的.
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区免费 | 99re视频这里只有精品 | 亚洲高清av | 亚洲在线| 一级一级一级毛片 | 久久久久成人精品 | 韩国电影久久 | 一区二区三区国产在线观看 | 妞干网视频 | 精品一区二区三区在线观看国产 | 亚洲天堂av在线 | 国产精品美女久久久久久不卡 | 一区二区三区欧美在线 | 午夜av毛片| 91在线精品一区二区 | 一区二区三区国产 | 日日摸天天添天天添破 | 日本精品一区二区三区四区 | 国产原创视频 | 9porny九色视频自拍 | 精品视频在线观看 | 成人精品国产一区二区4080 | 亚洲人成在线观看 | 免费不卡av| 国外激情av | 中文字幕高清 | 亚洲精品一区二区 | 成人超碰 | 极品电影院 | 91久久久久久久久久久 | 韩国久久精品 | 黄色大片免费网站 | 亚洲一区二区三区四区五区午夜 | 在线免费小视频 | 男人电影天堂 | 欧美日韩精品在线免费观看 | 天天躁日日躁aaaa视频 | 一区二区三区精品在线 | 视频一区二区在线观看 | 亚洲日韩欧美一区二区在线 | 国产四区 |