Keil软件的使用文档格式.docx
《Keil软件的使用文档格式.docx》由会员分享,可在线阅读,更多相关《Keil软件的使用文档格式.docx(62页珍藏版)》请在冰点文库上搜索。
![Keil软件的使用文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/5/e2ecedad-d446-41cf-a6e1-09db6c6d054c/e2ecedad-d446-41cf-a6e1-09db6c6d054c1.gif)
以下將介紹的是如何將HEX檔下載到單片機裡面。
我們用的下載軟體是
Easy51Pro
Easy51Prov2.0軟體的使用
Easy51Prov2.0是單片機下載工具:
在我們的QQ群裡有這個軟體,大家可以下載來直接用,而不用安裝。
下面我給大家簡單的說一下用法:
1.硬體連接;
必須滿足下面的每一個條件才能下載。
如圖
2.打開軟體;
3.檢測器件,注意右邊的資訊提示。
如果沒有檢測到器件,檢查硬體連接。
3.打開HEX文件。
先按一下“(自動)打開檔”。
在“實驗1”的資料夾裡找到檔LED.hex文件.
4.最後按一下“自動完成”,OK大功告成。
5.大功既然告成,就要看到效果。
現在我們在實驗板的左下角找到JK7,用導線連到P1.0上,LED2被點亮了把。
是不是很有成就感。
如果以上的實驗你覺得是小兒科,太簡單了。
那麼請關注以下的內容。
一.閃爍燈
[實驗任務]
在P1.0埠上接一個發光二極體L1,使L1在不停地一亮一滅,一亮一滅的時間間隔為0.2秒。
[硬體電路]
與上麵點亮小燈的連接完全相同。
[C語言來源程式]
#include<
AT89X51.H>
/*************************************************************************************
第一行是一個"
檔包含"
處理。
所謂"
是指一個檔將另外一個檔的內容全部包含進來,所以這裡的程式雖然只有4行,但C編譯器在處理的時候卻要處理幾十或幾百行。
這裡程式中包含REG51.h檔的目的是為了要使用P1這個符號,即通知C編譯器,程式中所寫的P1是指80C51單片機的P1埠而不是其它變數。
*****************************************************************************/
voiddelay02s(void)//延時0.2秒副程式
{
unsignedchari,j,k;
//定義3個無符號字元型資料。
for(i=20;
i>
0;
i--)//作迴圈延時
for(j=20;
j>
j--)
for(k=248;
k>
k--);
}
voidmain(void)//每一個C語言程式有且只有一個主函數,
while
(1)//迴圈條件永遠為真,以下程式一直執行下去。
P1_0=0;
//I/O口P1.0輸出低電平,小燈被點亮。
delay02s();
//延時經過0.2秒。
P1_0=1;
//I/O口P1.0輸出高電平,小燈熄滅。
}
二.廣告燈的左移右移
[實驗任務]
做廣告燈的左移右移,八個發光二極體分別接在單片機的P3.0-P3.7介面上,輸出“0”時,發光二極體亮,開始時P3.0→P3.1→P3.2→P3.3→┅→P3.7→P3.6→┅→P3.0亮,重複迴圈。
[DPY-1實驗板連接]
用8芯排線把JP-LSH連接到JP12上。
#include<
AT89X52.H>
unsignedchari;
unsignedchartemp;
unsignedchara,b;
voiddelay(void)//延時副程式
unsignedcharm,n,s;
for(m=20;
m>
m--)
for(n=20;
n>
n--)
for(s=248;
s>
s--);
voidmain(void)//主程序
temp=0xfe;
P3=temp;
//直接對I/O口P3賦值,使.P3.0輸出低點平。
delay();
//延時
for(i=1;
i<
8;
i++)//實現廣告燈的從右到左移動(以原理圖為准)
a=temp<
<
i;
b=temp>
>
(8-i);
P3=a|b;
i++)//實現廣告燈的從左到右移動
a=temp>
b=temp<
三.按鍵識別
通過按下一次按鍵,使廣告燈向左移動一位,直到最後一位,在向右移動。
[硬體電路]
(大家注意到這一個電路圖與上一個實驗的電路圖只多了一個按鍵和一個5.1K的電阻。
)
用一根導線把JK5接到P2.1上。
[實驗原理]
從圖中可以看出P2.1在按鍵沒有按下時接的是高電平,按鍵按下時接的就是低電平了。
所以我們只要判斷P2.1的電平就可以知道按鍵是否被按下了。
而在按鍵按下的過程中,由於抖動,將產生干擾,在按下的過程中,一旦有干擾過來,可能造成誤觸發過程,這並不是我們所想要的。
因此在按鍵按下的時候,要把我們手上的干擾信號以及按鍵的機械接觸等干擾信號給濾除掉,一般情況下,我們可以採用軟體濾波的方法去除這些干擾信號,一般情況下,一個按鍵按下的時候,總是在按下的時刻存在著一定的干擾信號,按下之後就基本上進入了穩定的狀態。
我們在程式設計時,從按鍵被識別按下之後,延時5ms以上,從而避開了干擾信號區域,我們再來檢測一次,看按鍵是否真得已經按下,若真得已經按下,這時肯定輸出為低電平,若這時檢測到的是高電平,證明剛才是由於干擾信號引起的誤觸發,CPU就認為是誤觸發信號而捨棄這次的按鍵識別過程。
#include<
reg52.h>
sbitBY1=P2^1;
//定義按鍵的輸入端
unsignedcharcount;
//按鍵計數,每按一下,count加1
unsignedchartemp;
unsignedchara,b;
voiddelay10ms(void)//延時程式
{
unsignedchari,j;
i--)
for(j=248;
j--);
}
key()//按鍵判斷程式
if(BY1==0)//判斷是否按下鍵盤
delay10ms();
//延時,軟體去干擾
if(BY1==0)//確認按鍵按下
count++;
//按鍵計數加1
if(count==8)//計8次重新計數
{count=0;
}//將count清零
while(BY1==0);
//按鍵鎖定,每按一次count只加1.
move()//廣告燈向左移動移動函數
{
count;
(8-count);
}
main()
count=0;
//初始華參數設置
P3=0xff;
while
(1)//永遠迴圈,掃描判斷按鍵是否按下
{
key();
//調用按鍵識別函數
move();
//調用廣告燈移動函數
四.數碼管動態顯示
P0埠接動態數碼管的字形碼筆段,P2埠接動態數碼管的數位選擇端,動態顯示“1234”字樣;
注意:
在P0口還有1K的排阻作為上拉電阻,在以後的電路原理圖中都是如此,請大家不要忽略了
用排線把JP-CODE連到JP8是,注意:
a接P0.0;
b接P0.1;
c接P0.3……
把JP-CS連到JP14上,注意:
4H接P2.4;
3H接P2.5;
2H接P2.6;
1H接P2.7;
七段LED顯示器內部由七個條形發光二極體和一個小圓點發光二極體組成,根據各管的極管的接線形式,可分成共陰極型和共陽極型。
LED數碼管的a-dp七個發光二極體因以不同亮暗的組合就能形成不同的字形,這種組合稱之為字形碼,下面給出共陰極的字形碼
“0”3FH“1”06H“2”5BH“3”4FH
“4”66H“5”6DH“6”7DH“7”07H
“8”7FH“9”6FH“A”77H“b”7CH
“C”39H“d”5EH“E”79H“F”71H
由於顯示的數位0-9的字形碼沒有規律可循,只能採用查表的方式來完成我們所需的要求了。
這樣我們按著數位0-9的順序,把每個數位的筆段代碼按順序排好!
建立的表格如下所示:
TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
動態介面採用各數碼管迴圈輪流顯示的方法,當迴圈顯示頻率較高時,利用人眼的暫留特性,看不出閃爍顯示現象,這種顯示需要一個介面完成字形碼的輸出(字形選擇),另一介面完成各數碼管的輪流點亮(數位選擇)。
codeunsignedcharseg7code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f};
//顯示段碼
voidDelay(unsignedinttc)//延時程式
while(tc!
=0)//如果tc為0則終止延時
unsignedinti;
//局部正整數變數i
for(i=0;
i<
100;
i++);
//執行400次將耗時1毫秒
tc--;
//tc計數減一
voidLed(intdate)//顯示函數
P2=P2&
0x7f;
//P2.7輸出低電平,選通千位數
P0=seg7code[date/1000];
//取出千位數,查表,輸出。
Delay(8);
P2=P2|0xf0;
//銷隱
0xbf;
//P2.6輸出低電平,選通百位數
P0=seg7code[date%1000/100];
//取出百位數,查表,輸出。
P2=P2|0xf0;
0xdf;
//P2.5輸出低電平,選通十位數
P0=seg7code[date%100/10];
//取出十位數,查表,輸出。
0xef;
P0=seg7code[date%10];
//取出個位數,查表,輸出。
intdisplay_date=1234;
//定義並賦值要顯示的資料
while
(1)
Led(display_date);
//調用顯示函數顯示資料display_date
五.4×
4矩陣式鍵盤識別
用AT89S51的並行口P3接4×
4矩陣鍵盤,以P3.0-P3.3作輸入線,以P3.4-P3.7作輸出線;
在每一個數碼管上顯示每個按鍵的“0-F”序號。
用排線把JP-CODE連到JP8是,注意:
c接P0.3……
用排線把JP-KEY連到JP12上,注意1,2,3,4,5,6,7,8,分別對應P3.0,P3.1,P3.3,P3.4……
每個按鍵有它的行值和列值 ,行值和列值的組合就是識別這個按鍵的編碼。
矩陣的行線和列線分別通過兩平行介面和CPU通信。
鍵盤控制碼的任務是:
確定有無鍵按下,判斷哪一個鍵按下,鍵的功能是什麼;
還要消除按鍵在閉合或斷開時的抖動。
兩個並行口中,一個輸出掃描碼,使按鍵逐行動態接地,另一個並行口輸入按鍵狀態,由行掃描值和回饋信號共同形成鍵編碼而識別按鍵,通過軟體查表,查出該鍵的功能。
unsignedcharcodeseg7code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsignedchark;
voidGetch()
{unsignedcharX,Y,Z;
P3=0x0f;
//先對P3置數行掃描
if(P3!
=0x0f)//判斷是否有鍵按下
{delay10ms();
=0x0f)//確認按鍵按下X=P3;
X=P3;
//保存行掃描時有鍵按下時狀態
P3=0xf0;
//列掃描
Y=P3;
//保存列掃描時有鍵按下時狀態
Z=X|Y;
//取出鍵值
switch(Z)//判斷鍵值(那一個鍵按下)
case0xee:
k=0;
break;
//對鍵值賦值
case0xde:
k=1;
case0xbe:
k=2;
case0x7e:
k=3;
case0xed:
k=4;
case0xdd:
k=5;
case0xbd:
k=6;
case0x7d:
k=7;
case0xeb:
k=8;
case0xdb:
k=9;
case0xbb:
k=10;
break;
case0x7b:
k=11;
case0xe7:
k=12;
case0xd7:
k=13;
case0xb7:
k=14;
case0x77:
k=15;
}}}}//請注意寫程式時的格式規範,此處是為了節省紙張
voidmain(void)
{P3=0xff;
Getch();
P0=seg7code[k];
//查表LED輸出
P2=0x0f;
//輸出相同的四位元資料。
六.按鍵中斷識別
採用中斷技術,每按一下按鍵,計數器加1,並用LED顯示出來。
注意:
我們只用了4位數碼管中的兩位。
用排線把JP-CODE連到JP8上,注意:
2H接P2.0;
1H接P2.1;
中斷按鍵已經接好。
以上的兩個關於按鍵識別的實驗的程式都是採用掃描的方式來實現的,CPU的利用率比較低,在即時性要求高比較高,要求快速回應的場合不太實用。
中斷方式可以滿足快速回應的要求。
關於中斷技術的具體內容,請大家參照教材。
#include<
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
unsignedchardispcount=0;
//計數
sbitgewei=P2^0;
//個位選通定義
sbitshiwei=P2^1;
//十位選通定義
{while(tc!
=0)
voidExtInt0()interrupt0//中斷服務程式
dispcount++;
//每按一次中斷按鍵,計數加一
if(dispcount==100)//計數範圍0-99
{dispcount=0;
voidLED()//LED顯示函數
if(dispcount>
=10)//顯示兩位元數
shiwei=0;
P0=table[dispcount/10];
shiwei=1;
gewei=0;
P0=table[dispcount%10];
Delay(5);
gewei=1;
else//顯示一位元數
P0=table[dispcount];
voidmain()
{TCON=0x01;
//中斷設置
IE=0x81;
while
(1)//迴圈執行
LED();
//只須調用顯示函數
七.計時器T0的應用---9.9秒計時設計
[實驗任務]
開始時,顯示“00”,第1次按下BY1後就開始計時。
第2次按BY1後,計時停止。
第3次按BY1後,計時歸零。
注意這一個電路圖與上一個的接法只是按鍵接的I/O口不一樣。
所以只要用導線把JK5接到P3.0上就可以了。
c接P0.3……把JP-CS連到JP14,注意:
用導線把JK5接到P3.0上。
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,};
unsignedcharsec;
//定義計數值,每過1/10秒,sec加一
unsignedcharkeycnt=0;
unsignedinttcnt;
//鍵值判斷
voidLED()//LED顯示函數
P0=table[sec/10];
P0=table[sec%10];
voidKEY()//按鍵掃描程式
unsignedchari,j;
if(P3_0==0)
i--)//延時去干擾
if(P3_0==0)
keycnt++;
switch(keycnt)//按下次數判斷
case1:
//第一次按下
TH0=0x06;
//對TH0TL0賦值
TL0=0x06;
TR0=1;
//開始定時
case2:
//第二次按下
TR0=0;
//定時結束
case3:
//第三次按下