欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

我想實(shí)現(xiàn)長按k1按鍵3s開機(jī)再按3s關(guān)機(jī) 單片機(jī)程序?yàn)樯恫恍?請大神看下

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

單片機(jī)源程序如下:
#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() //定時(shí)器0初始化
{
TMOD |= 0x01; //模式1
TMOD &= 0x0F;
TH0 = (65536-1000)/256;
TL0 = (65536-1000)%256; //定時(shí)1ms
EA=1;
ET0=1;
TR0=1; //T0中斷溢出請求標(biāo)志位
}

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

ID:712493 發(fā)表于 2020-5-18 22:43 來自觸屏版 | 顯示全部樓層
這個(gè)初始會(huì)不會(huì)老把定時(shí)器清除
IMG_20200518_224101.jpg
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 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;
        }
}
回復(fù)

使用道具 舉報(bào)

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

單片機(jī)源程序如下:
#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;                        //按下彈起標(biāo)志位:0 彈起 1 按下
bit                f_key_ctrl=0;                        //長按標(biāo)志位
bit                F_WORK_ON=0;                //開關(guān)機(jī)標(biāo)志位:1開機(jī) 0關(guān)機(jī)
/////////////////////////////////       
unchar        press_cnt=0;
unint                ctrl_cnt=0;
unchar        show_time=0;
void Timer0Init() //定時(shí)器0初始化
{
        TMOD |= 0x01; //模式1
        TMOD &= 0x0F;
        TH0 = (65536-1000)/256;
        TL0 = (65536-1000)%256; //定時(shí)1ms
        EA=1;
        ET0=1;
        TR0=1; //T0中斷溢出請求標(biāo)志位
        ///////這個(gè)作為主程序的定時(shí),所有的定時(shí)都是在這上面進(jìn)行計(jì)算
}

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



前面那個(gè)POWER_INIT();這個(gè)函數(shù)你要自己配置,就是IO口的輸入輸出屬性,開不開上拉,初始電平的高低.  思路是這個(gè)思路. 這是一個(gè)模版.希望你可以看看,并且希望對你有幫助.因?yàn)槲沂窃诰W(wǎng)頁上編輯的,所以沒有在KEIL里面驗(yàn)證,如果有報(bào)錯(cuò), 你自己解決一下,但是整體的一個(gè)按鍵思路是這樣的.
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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