㈠ 怎麼用C語言/C51程序實現單片機按鍵長按開機與長按關機
首先需要硬體支持,也就是單片機某個引腳可以控制斷電和維持上電
按鍵的的作用也可以給單片機供電,並且還要有個專門的引腳檢測按鍵狀態。
軟體:首先是長按判斷。這個最好用按鍵掃描。就是檢測按鍵按下時候,定時器計時,如果松開就立即清零。在設置一個功能函數檢測定時值,大於兩秒後,就表示長按。
按鍵按下單片機供電開始計時,如果達到長按標准,就輸出引腳控制持續供電,這時候按鍵鬆了也不會斷電。
運行期間,按鍵再次按下並符合長按,那木引腳輸出停止供電,這時候如果按鍵松開,那就徹底沒電關機。
㈡ 高手幫忙.用51單片機控制一個燈.要求按下啟動按鈕後以亮5秒,滅3秒為周期運行.關鍵是要有掉電保持功能!!
關鍵叢巧和的掉電保護可以像1L那樣說用內部EEPROM實滲盯現,或者用24C02(外置寬孫的EEPROM)來做,然後燈亮滅那些就容易搞了。具體思路還是自己動手才懂的
㈢ 單片機按鍵觸發C程序
while(1)
{
if(keyflag==1) //有按下切出死循環
break;
else continue;
}
while(1)
{
..... //用戶自己的程序
}
這種方法是模擬按鍵按下啟動真正的應用程序,觸發的是自己的功能程序短。從效果上來還是可以的
㈣ 單片機的按鍵啟動和復位電路圖
單片機的復位有上電復位和按鈕手動復位兩種。如圖(a)所示為上電復位電路,圖(b)所示為上電按鍵復位電路。
上電復位是利用電容充電來實現的,即上電瞬間RST端的電位與VCC相同,隨著充電電流的減少,RST的電位逐漸下降。圖(a)中的R是施密特觸發器輸入端的一個10KΩ下拉電阻,時間常數為10×10-6×10×103=100ms。只要VCC的上升時間不超過1ms,振盪器建立時間不超過10ms,這個時間常數足以保證完成復位操作。上電復位所需的最短時間是振盪周期建立時間加上2個機器周期時間,在這個時間內RST的電平應維持高於施密特觸發器的下閾值。
上電按鍵復位(b)所示。當按下復位按鍵時,RST端產生高電平,使單片機復位。復位後,其片內各寄存器狀態改變,片內RAM內容不變。
由於單片機內部的各個功能部件均受特殊功能寄存器控制,程序運行直接受程序計數器PC指揮。各寄存器復位時的狀態決定了單片機內有關功能部件的初始狀態。
另外,在復位有效期間(即高電平),80C51單片機的ALE引腳和引腳均為高電平,且內部RAM不受復位的影響。
圖要點一下查看大圖才清楚哦O(∩_∩)O
㈤ 單片機怎麼用一個按鈕控制步進電機啟動和停止
單片機用一個按鈕控制步進電機啟動和停止,這很容易的,識別按鍵按下的程序會寫吧,那定義一個位變數,即標志位,如flag,上電後flag=0,為電機停止狀態。每按一次按鍵,flag=!flag,即取反一次,然後再判斷標志位,flag=1,則啟動電機。flag=0,則停止電機。
㈥ 單片機如何用一個按鍵實現啟停
不知道你想要實現啥樣的啟停,今天上班有點閑,給你寫一個程序做參考,你可以根據你的需要進行更改。//功能是按鍵,按下啟動停止,啟動後LED燈閃爍,
停止LED燈滅。
#include
"REG52.H"
sbit
LED1_01
=
P1^1;
//LED燈
sbit
KEY0_01
=
P1^2;
//按鍵
bit
value_flag
=
0;
//標志位
/*
*
延時1ms延時子函數
**/
void
Delay_1ms(unsigned
int
Time)
{
unsigned
int
x,
y;
for(x
=
Time;
x
>
0;
x--)
for(y
=
120;
y
>
0;
y--);
}
/*
*
按鍵開關【啟動和停止】子函數
**/
void
Scan_keyoutCmd(void)
{
if(KEY0_01
==
0)
//檢測按鍵是否按下
{
Delay_1ms(10);
//延時去抖動
if(KEY0_01
==
0)
//確定按鍵按下
{
value_flag
=
~
value_flag;
//取反標志位
}
while(KEY0_01
==
0);
//檢測鬆手
}
}
/*
*
程序運行【啟動和停止】子函數
**/
void
Disp_layledketCmd(void)
{
if(value_flag
==
1)
//如果標志打開啟動單片機運行程序
{
LED1_01
=
0;
Delay_1ms(500);
//啟動運行程序後LED燈開始閃爍
LED1_01
=
1;
Delay_1ms(500);
}
else
if(value_flag
==
0)
//如果標志關閉停止單片機運行程序
{
LED1_01
=
0;
//停止運行程序後LED滅。
}
}
/*
*
函數主體
**/
int
main(void)
{
value_flag
=
1;
//打開標志位
while(1)
{
Scan_keyoutCmd();//單片機循環檢測是否有按鍵按下【啟動或停止】應運程序
Disp_layledketCmd();
//執行應運程序
}
}