㈠ 單片機 p1.0和 p1.1引腳有兩個開關 s0和 s1。s0、s1均閉合的時, 只有 led0亮,
//設你的LED接在P0^1腳
#define <reg52.h>
void DetectInput()
{
while(P1^0==1 && P1^1==1)//當P1.0和P1.1均為高電平時
{
P0^1=1;
}
}
void main()
{
DetectInput();
}
㈡ 一、設計秒錶:單片機的振盪頻率fosc=11.0592MHz,兩位數碼管顯示,用三個按鍵S0、S1、S2控制秒錶,上電時
這是你們實訓的內容吧,把中斷看看,串列通訊看看,就ok了
㈢ 求單片機源程序將S0至S3按鍵所代表的二進制編制轉換成十進制後在數碼管上的顯示
S0至S3按鍵所代表的二進制,到底代表的是什麼呢?鍵值嗎?
㈣ 單片機一個獨立按鍵
#include<reg51.h> // 4*4 按鍵+數碼管模擬,可以參考。
#define uchar unsigned char
uchar temp;
int key1,key,disbuf;// 此表為 LED 的字模 0 1 2 3 4 5 6 7 8 9 a b c d e f
unsigned char code LED7Code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
unsigned char ledx[8];
bit s0,s1;
void delay(uchar z)
{
uchar i,j;
for(i=0;i<120;i++)
for(j=0;j<z;j++);
}
void scan() //要是按鍵了,掃描鍵盤編碼值
{
P1=0xF0;
delay(1);
temp=P1;
switch(temp)
{
case 0xe0: key1=0;
break;
case 0xd0: key1=1;
break;
case 0xb0: key1=2;
break;
case 0x70: key1=3;
break;
}
P1=0x0f;
delay(1);
temp=P1;
switch(temp)
{
case 0x0E: key=key1+0;
break;
case 0x0D: key=key1+4;
break;
case 0x0B: key=key1+8;
break;
case 0x07: key=key1+12;
break;
default : key=-1;
}
if((key1+1)&&(key+1)) disbuf=key;
}
void ejjc() //判斷是否按鍵
{
P1=0xF0;
if(P1!=0xF0) { scan();s0=1;}
else { s0=0; s1=1;}
}
void main()
{
uchar i;
while(1)
{
ejjc();
if(s0==1 && s1==1)
{
s0=0;s1=0;
for(i=0;i<8;i++)
{ ledx[i]=ledx[i+1]; ledx[8]=disbuf; }
}
P0=0xff;
P2=LED7Code[ledx[0]];
P0=0xfe;
delay(5);
P0=0xff;
P2=LED7Code[ledx[1]];
P0=0xfd;
delay(5);
P0=0xff;
P2=LED7Code[ledx[2]];
P0=0xfb;
delay(5);
P0=0xff;
P2=LED7Code[ledx[3]];
P0=0xf7;
delay(5);
P0=0xff;
P2=LED7Code[ledx[4]];
P0=0xef;
delay(5);
P0=0xff;
P2=LED7Code[ledx[5]];
P0=0xdf;
delay(5);
P0=0xff;
P2=LED7Code[ledx[6]];
P0=0xbf;
delay(5);
P0=0xff;
P2=LED7Code[ledx[7]];
P0=0x7f;
delay(5);
}
}
㈤ 求大神一個關於89c52單片機用S0鍵來啟動和停止流水燈的程序,在這里先感謝各位大佬幫幫忙。
//鍵控流水燈
#include "REG52.H"
#define DataGPIO P1//顯示埠
#define FLOWTIME 100//修改此值,改變流水速度
sbit KEY = P2^0;//按鍵
bit Start_flag =0;//流水燈控制
bit Flow_flag =0;//流水
unsigned char Cnt =0;//流水燈計數器
unsigned char KEY_Cnt=0;//按鍵識別計數器
void Init_Timer0()//定時器0初始化
{
TMOD |= 0x01;//16位計數器
TH0 = 0xEC;
TL0 = 0x77;//12M,12T,5000us=5ms
TCON |= 0x10;//定時器0啟動
TCON |= 0x01;//定時器0中斷允許
IE |= 0x80;//總中斷開
}
void Flow_Cont()//流水計數
{
if(++Cnt>FLOWTIME)//500ms
{
Cnt=0;
Flow_flag =1;//流水控制位
}
}
void KEY_Scan()//鍵掃描
{
if(!KEY)//鍵被按下
{
if(KEY_Cnt!=0)//鍵計數器不為0,已經消抖
{
KEY_Cnt = 0;//清計數器
Start_flag =~Start_flag;//流水顯示控制
}
else //鍵計數器為0,沒有消抖
{
KEY_Cnt++;//鍵計數器+1,再掃描一次。
}
}
}
//
void Timer0_ISR() interrupt 1 //定時器0中斷響應
{
TCON &= ~0x20;//定時器0清溢出
TH0 = 0x3C;
TL0 = 0xAF;//12M,12T,50000us=50ms
Flow_Cont();//流水計數
KEY_Scan();//鍵掃描
}
void DispFlashLED()//流水燈
{
if(Flow_flag)
{
Flow_flag =0;//
switch(DispBit)
{
case 0; DataGPIO = 0xfe; break;
case 0; DataGPIO = 0xfd; break;
case 0; DataGPIO = 0xfb; break;
case 0; DataGPIO = 0xf7; break;
case 0; DataGPIO = 0xef; break;
case 0; DataGPIO = 0xdf; break;
case 0; DataGPIO = 0xbf; break;
case 0; DataGPIO = 0x7f; break;
}
DispBit++;
}
}
int main()
{
Init_Timer0();//定時器0初始化
while(1)
{
if(Start_flag)//如果啟動流水燈
{
DispFlashLED();//流水燈
}
else
{
DataGPIO = 0xff;//不顯示
}
}
}
㈥ 單片機。c. bit s1,s2;啥意思
bit是位數據變數申明,這行的意思是位聲明變數s0和s1,他們的取值只有0或者1.當取值為0以外的數值時候,系統均以1看待,有點類似高級語言的True和False。它與sbit的區別是,相同的地方都是位申明,bit和int char差不多,只是一個是8位,而bit是1位;bit在編譯的時候分配的地址是隨機的,sbit編譯時候地址是固定的,即sbit可以定址操作,而bit不行。
㈦ 單片機中斷實驗交通燈的實驗原理
根據圖3.2電路,用單片機的IO口控制4組紅綠黃共12個發光二極體,使發光二極體按照一定規則與次序發光與閃亮以實現模擬交通燈的功能。假設初始狀態為:(南北通行狀態)南北綠燈、東西紅燈(25s);後轉為過度狀態:南北黃燈、東西紅燈(5s);再轉為東西通行狀態:東西綠燈、南北紅燈25(s)。再轉為過渡狀態:東西黃燈、南北紅燈(5s),然後循環往復。
要求採用定時器實現所需要的定時時間。
2、鍵控交通燈。
按一下K1鍵
,保持南北通行狀態;按一下K2鍵
,保持東西通行狀態;按一下K3鍵
,保持正常交通燈。
要求在中斷中進行按鍵處理。
3、具有閃爍的交通燈。
在2的基礎上增加,綠燈最後5s閃爍,即亮0.5S滅0.5S閃爍。
四、實驗原理圖
圖3.2交通燈實驗電路原理圖
圖3.2共有4個按鍵K1、K2、K3、K4,分別連接到單片機P2.0、P2.1、P2.2、P2.3引腳,按鍵後對應引腳為低電平,通過4個二極體D17、D18、D19、D20連接到P3.2(外部中斷0),這是二極體構成的相與電路,即任意按一個鍵能在P3.2上產生一個低電平或下降,作為中斷觸發信號。
五、軟體設計思想
1、定時思想。
採用定時器T0或T1的方式1定時500ms,每500ms中斷進行計數,計數10次即0.5s,計數20次即1s,對秒計數實現所需要的定時時間。
2、亮燈控制思想。
單片機控制燈引腳與燈對應如下,0點亮。
一共有四種狀態S0、S1、S2、S3,
a、南北通行S0狀態:
南北綠燈、東西紅燈,P0=11110111=0xf7,P1=10011110=0x9e;
南北通行S0
b、過渡狀態S1:
南北黃燈、東西紅燈,P0=11111011=0xfb,P1=10101110=0xae;
過渡狀態S1
c、東西通行狀態S2:
東西綠燈、南北紅燈,P0=11111100=0xfc,P1=11110011=0xf3;
東西通行狀態S2
d、過渡狀態S3:
東西黃燈、南北紅燈,P0=11111101=0xfd,P1=01110101=0x75;
過渡狀態S3
設置一個秒計數單元SEC每秒+1,設置兩個控制值變數a,b。
㈧ 89S51單片機上S0 S1鍵控制跑馬燈
這怎麼回答呢?
流程:
開始
S0,S1同時按下了?
是,開始主程序
不是,等待S0,S1同時按下
主程序
跑馬燈
㈨ 單片機匯編語言
MOV R0,#30H ;y所在的起始地址
MOV R2,#10 ;循環初值,10個數,循環10次
S0:
MOV DPTR,#2000H ;x開始的起始地址
MOVX A,@DPTR ;取出x的值
RL A ;因為數在1~10之間,所以左移1位,相當於乘2
ADD A,@R0 ;2x+y
DEC A ;2x+y-1
MOV DPTR,#3000H
MOVX @DPTR,A ;結果送3000H
DJNZ R2,S0 ;控制循環10次
SJMP $
END
㈩ 單片機的獨立按鍵
#include<reg51.h> // 4*4 按鍵+數碼管模擬,可以參考。
#define uchar unsigned char
uchar temp;
int key1,key,disbuf;// 此表為 LED 的字模 0 1 2 3 4 5 6 7 8 9 a b c d e f
unsigned char code LED7Code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
unsigned char ledx[8];
bit s0,s1;
void delay(uchar z)
{
uchar i,j;
for(i=0;i<120;i++)
for(j=0;j<z;j++);
}
void scan() //要是按鍵了,掃描鍵盤編碼值
{
P1=0xF0;
delay(1);
temp=P1;
switch(temp)
{
case 0xe0: key1=0;
break;
case 0xd0: key1=1;
break;
case 0xb0: key1=2;
break;
case 0x70: key1=3;
break;
}
P1=0x0f;
delay(1);
temp=P1;
switch(temp)
{
case 0x0E: key=key1+0;
break;
case 0x0D: key=key1+4;
break;
case 0x0B: key=key1+8;
break;
case 0x07: key=key1+12;
break;
default : key=-1;
}
if((key1+1)&&(key+1)) disbuf=key;
}
void ejjc() //判斷是否按鍵
{
P1=0xF0;
if(P1!=0xF0) { scan();s0=1;}
else { s0=0; s1=1;}
}
void main()
{
uchar i;
while(1)
{
ejjc();
if(s0==1 && s1==1)
{
s0=0;s1=0;
for(i=0;i<8;i++)
{ ledx[i]=ledx[i+1]; ledx[8]=disbuf; }
}
P0=0xff;
P2=LED7Code[ledx[0]];
P0=0xfe;
delay(5);
P0=0xff;
P2=LED7Code[ledx[1]];
P0=0xfd;
delay(5);
P0=0xff;
P2=LED7Code[ledx[2]];
P0=0xfb;
delay(5);
P0=0xff;
P2=LED7Code[ledx[3]];
P0=0xf7;
delay(5);
P0=0xff;
P2=LED7Code[ledx[4]];
P0=0xef;
delay(5);
P0=0xff;
P2=LED7Code[ledx[5]];
P0=0xdf;
delay(5);
P0=0xff;
P2=LED7Code[ledx[6]];
P0=0xbf;
delay(5);
P0=0xff;
P2=LED7Code[ledx[7]];
P0=0x7f;
delay(5);
}
}