A. 單片機電子時鍾如何識別按鍵或開關按下與否
單片機由運算器、控制器、存儲器、輸入輸出設備構成。
單片機自動完成賦予它的任務的過程,也就是單片機執行程序的過程,即一條條執行的指令的過程,所謂指令就是把要求單片機執行的各種操作用的命令的形式寫下來,這是在設計人員賦予它的指令系統所決定的,一條指令對應著一種基本操作;單片機所能執行的全部指令,就是該單片機的指令系統,不同種類的單片機,其指令系統亦不同。為使單片機能自動完成某一特定任務,必須把要解決的問題編成一系列指令(這些指令必須是選定單片機能識別和執行的指令),這一系列指令的集合就成為程序,程序需要預先存放在具有存儲功能的部件——存儲器中。存儲器由許多存儲單元(最小的存儲單位)組成,就像大樓房有許多房間組成一樣,指令就存放在這些單元里,單元里的指令取出並執行就像大樓房的每個房間的被分配到了唯一一個房間號一樣,每一個存儲單元也必須被分配到唯一的地址號,該地址號稱為存儲單元的地址,這樣只要知道了存儲單元的地址,就可以找到這個存儲單元,其中存儲的指令就可以被取出,然後再被執行。程序通常是順序執行的,所以程序中的指令也是一條條順序存放的,單片機在執行程序時要能把這些指令一條條取出並加以執行,必須有一個部件能追蹤指令所在的地址,這一部件就是程序計數器PC(包含在CPU中),在開始執行程序時,給PC賦以程序中第一條指令所在的地址,然後取得每一條要執行的命令,PC在中的內容就會自動增加,增加量由本條指令長度決定,可能是1、2或3,以指向下一條指令的起始地址,保證指令順序執行。
應用:
單片機作為計算機發展的一個重要分支領域,根據發展情況,從不同角度,單片機大致可以分為通用型/專用型、匯流排型/非匯流排型及工控型/家電型。通用型:這是按單片機適用范圍來區分的。例如,80C51式通用型單片機,它不是為某種專門用途設計的;專用型單片機是針對一類產品甚至某一個產品設計生產的,例如為了滿足電子體溫計的要求,在片內集成ADC介面等功能的溫度測量控制電路。
匯流排型:這是按單片機是否提供並行匯流排來區分的。匯流排型單片機普遍設置有並行地址匯流排、 數據匯流排、控制匯流排,這些引腳用以擴展並行外圍器件都可通過串列口與單片機連接,另外,許多單片機已把所需要的外圍器件及外設介面集成一片內,因此在許多情況下可以不要並行擴展匯流排,大大減省封裝成本和晶元體積,這類單片機稱為非匯流排型單片機。
B. 怎麼用89C51單片機實現用一個開關控制8個流水燈,要求開關按下去松開是亮的,再按下去松開是滅的
開關,接在 P2.7 與地之間。
#include <AT89X51.H> //預處理命令
void w(unsigned char k)
{
unsigned int a; //定義變數a 為int 類型
if (k) {
while(P2_7); //沒有按就循環,等待按下
for (a = 0; a < 600; a++); //延時消抖
while(P2_7); //沒有按就循環
}
else while(!P2_7); //按下就循環,等待松開
}
void main(void) //主函數名
{
while(1) {
w(1); P1_0 = 0; w(0); P1_0 = 1;
w(1); P1_1 = 0; w(0); P1_1 = 1;
w(1); P1_2 = 0; w(0); P1_2 = 1;
w(1); P1_3 = 0; w(0); P1_3 = 1;
w(1); P1_4 = 0; w(0); P1_4 = 1;
w(1); P1_5 = 0; w(0); P1_5 = 1;
w(1); P1_6 = 0; w(0); P1_6 = 1;
w(1); P1_7 = 0; w(0); P1_7 = 1;
}
}
C. 按下開關輸出低電平,松開開關輸出高電平(5v)並驅動單片機,請問該如何實現
按下開關輸出低電平,松開開關輸出高電平(5v)並驅動單片機,
可以這樣實現,
開關一端接地,
另一端輸出,
輸出端到正5伏連接5千歐電阻。
D. 51單片機,開關控制LED,開始流水燈,按一下停止,再按一下繼續流水燈
#include<reg51.h>
#include<intrins.h>
#define
uchar
unsigned
char
sbit
button=P1^0;
uchar
press=0;
void
Delay(uchar
z)
{
uchar
x,y;
for(x=z;x>0;x--)
for(y=255;y>0;y--);
}
void
Led_Continue()
{
P2=0xfe;
while(press==0|press==2)
{
P2=_crol_(P2,1);
Delay(255);
}
}
void
Led_Stop()
{
P2=0xff;
}
void
Keyscan()
{
if(button==0)
{
Delay(20);
if(button==0)
{
press+=1;
if(press==1)
{
Led_Stop();
}
if(press==2)
{
press=0;
}
}
}
}
void
main()
{
while(1)
{
Keyscan();
Led_Continue();
}
}
試試這個,在mian中要一直去掃描,否則就掃描一次不能達到目的。
然後你問用中斷怎麼完成,告訴你中斷更簡單,定時器用作延時用,鍵盤只需要寫當這個按鍵按下時
TRx=~TRx
就是每一次按下,定時器開關都和上一次狀態不一樣,這樣每按一次都會停止、開始、停止、開始......
希望我的回答能幫助到你。
E. 單片機按下開關燈就亮,5秒後滅掉
//假設晶振12MHZ,按鍵輸入P1.0,LED控制P2.0,都是低電平有效
#include "reg51.h"
unsigned int YSJS=0;
sbit KEY=P1^0;按鍵
sbit LED=P2^0;燈
void Timer1Init(void) //500微秒@12.000MHz
{
AUXR &= 0xBF; //定時器時鍾12T模式
TMOD &= 0x0F; //設置定時器模式
TMOD |= 0x10; //設置定時器模式
TL1 = 0x0C; //設置定時初值
TH1 = 0xFE; //設置定時初值
TF1 = 0; //清除TF1標志
ET1 = 1; //使能定時器1中斷
EA =1; //開總中斷
}
void main(void)
{
LED=1;
while(1)
{
if(KEY==0)
{
LED=0;
TR1=1; //定時器1開始計時
}
}
}
void TIMER1(void) interrupt 3 //定時器1中斷函數使用默認寄存器組
{
TH1 = 0XFE; //定時器1定時時間=500us
TL1 = 0X0C;
YSJS++;
if(YSJS==10000) //500uS*10000=5000000us=5s
{
LED=1;
TR1=0;
}
}
F. 單片機在檢測按鈕是否按下時,需要注意什麼問題如果要解決應如何處理
檢測按鍵是否按下,一要注意是」消抖「;二要注意按鍵的」抬起「和按下狀態。前者一般加幾十毫秒延時。後者看程序要求,是確定按下後,等待抬起才退出鍵盤檢測,還是直接退出。
G. 單片機如何接收按鈕信號,比如我按下開關,線路接通,單片機如何知道...
如圖:兩種方法,一個地點平觸發(開關在下),一個高電平觸發(開關在上)。如果連接的是普通的IO口,則採用
輪詢
方式,就是
程序
要不停地判斷
埠
是否有變化。如果連接的中斷腳的話,
單片機
內部需要對觸發類型做設置,開關在下的設置為
低電平
觸發,開關在上的設置為高電平觸發,這樣不用你在程序裡面不停的去輪詢埠的
電平
變化,只需要在中斷服務里編寫你要執行的功能即可,這樣當外界有相應的電平變化的時候,單片機就自動的跳到了你的
中斷服務程序
里執行了,執行完了,就會退出,等待下一個
脈沖
的到來。這樣你的程序就靈活多了。
H. 單片機按下按鍵1,燈亮,按下按鍵2,燈滅,按下按鍵3,燈閃爍,求代碼
主要程序如下:
flag是用來記憶按鍵狀態,按下key3,flag置1,程序中檢測到flag是1才閃爍,鬆手後LED仍然閃爍,同時下一輪還可以檢測另外兩個按鍵
while(1)
{
if(key1==0)//判斷按鍵是否按下
{
Delay1ms(10);//延時消抖
if(key1==0)
{
while(key1==0);//等待按鍵抬起
LED=1;
flag=0;
}
}
if(key2==0)//判斷按鍵是否按下
{
Delay1ms(10);//延時消抖
if(key2==0)
{
while(key2==0);//等待按鍵抬起
LED=0;
flag=0;
}
}
if(key3==0)//判斷按鍵是否按下及是否在走時
{
Delay1ms(10);//延時消抖
if(key3==0)
{
while(key3==0);//等待按鍵抬起
flag=1;
}
if(flag==1)
{
LED=!LED;
Delay1ms(200);
}
}