單片機中只有一條語句是對進制調整的
DA A 對累加器A的結果進行十進制調整
如果隨意對一個累加器A中的二進制數據進行「二進制轉十進制」調整是沒有任何實際意義的!
DA調整的對象是ADD或ADDC以後的結果,而且是BCD碼相加以後才能夠加以調整,否則沒有實際意義!
比如,現在我想執行12D+39D也就是兩個十進制數相加這樣一個加法(有時候程序處理的需要,數據在單片機中是以BCD碼的形式存儲的,也就是12H和39H(十六進制),但我們可以人為將它們看為12D和39D(十進制),而且還希望相加以後的結果為51H,也就是說符合十進制運算規則12+39=51,而不是4BH的結果),但這樣的十進制加法運算在單片機中是不能夠直接實現的。因為單片機只能夠執行二進制加法指令,也就是所有的運算都按照二進制中的規則進行!
於是就出現了DA調整指令!
現在12H+39H,將12H放於A中,執行 ADD A,#39H指令,則結果為4BH,這不是我們希望的51H的數據形式!!這時執行DA A 指令後,就會將A中的數據調整為51H(具體調整過程和原理你可以詳細看書,如果單片機書中講的不詳細,那麼微機原理中一定說的非常詳細),而我們按照BCD碼規則就將其看為51D,符合我們的要求!
也就是說加數和被加數都是BCD碼的形式,最大也只可能是99H,也就是我們十進制數中的99,只有這樣才會有實際的意義!
所以DA A指令只用於十進制BCD碼加法指令以後,否則是沒有實際意義的!
在單片機中數據就是以二進制存放的也可以說是以16進制存放(4位二進制就是16進制),所以一般來說在單片機只有二進制轉十進制才有意義,通過單片機將十進制轉二進制是沒意義的。 這個一般都是我們自己把一個十進制數轉成二進制再送給單片機處理。
非得編寫程序的話 程序如下
----------------------------------------------------------------------
;二進制整數(2位)轉換為十進制整數(組合BCD碼)
;入口: R3,R4
;出口: R0
IBTD22 : MOV A,R0
PUSH A
MOV R7,#03H
CLR A
IBD221 : MOV @R0,A
INC R0
DJNZ R7,IBD221
POP A
MOV R0,A
MOV R7,#10H
IBD222 : PUSH A
CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV B,#03H
IBD223 : MOV A,@R0
ADDC A,@R0
DA A
MOV @R0,A
INC R0
DJNZ B,IBD223
POP A
MOV R0,A
DJNZ
--------------------------------------------------
;二進制整數(M位)轉換為十進制整數(組合BCD碼)
;入口: R1,M,N
;出口: R0
IBTDMN : MOV A,R0
MOV R2,A
MOV A,R1
MOV R3,A
MOV B,N
CLR A
IBDMN1 : MOV @R0,A
INC R0
DJNZ B,IBDMN1
MOV A,M
SWAP A
RR A
CLR C
MOV R7,A
IBDMN2 : MOV A,R2
MOV R0,A
MOV A,R3
MOV R1,A
MOV B,M
IBDMN3 : MOV A,@R1
RLC A
MOV @R1,A
INC R1
DJNZ B,IBDMN3
MOV B,N
IBDMN4 : MOV A,@R0
ADDC A,@R0
DA A
JNB ACC.4,IBDMN5
SETB C
CLR ACC.4
IBDMN5 : MOV @R0,A
INC R0
DJNZ B,IBDMN4
DJNZ R7,IBDMN2
MOV A,R2
MOV R0,A
RET
----------------------------------------------------------------
BCD整數轉換為二進制整數(1位)
;入口: R0(高位地址),R7
;出口: R4
IDTB1: CLR A
MOV R4,A
IDB11: MOV A,R4
MOV B,#0AH
MUL AB
ADD A,@R0
INC R0
MOV R4,A
DJNZ R7,IDB11
RET
------------------------------------------
;BCD整數轉換為二進制整數(N位)
;入口: R1(高位地址),M,N
;出口: R0
IDTBMN : MOV A,R0
MOV R2,A
MOV B,N
CLR A
IDBMN1 : MOV @R0,A
INC R0
DJNZ B,IDBMN1
MOV A,R2
MOV R0,A
MOV A,M
MOV NCNT,A
IDBMN2 : MOV R7,N
CLR A
CLR F0
IDBMN3 : XCH A,@R0
MOV B,#0AH
MUL AB
MOV C,F0
ADDC A,@R0
MOV F0,C
MOV @R0,A
INC R0
MOV A,B
DJNZ R7,IDBMN3
MOV A,R2
MOV R0,A
MOV A,@R1
INC R1
ADD A,@R0
MOV @R0,A
DJNZ NCNT,IDBMN2
RET
----------------------------------------------------------
NDIV31 : MOV A,R2
MOV B,R7
DIV AB
PUSH A
MOV R2,B
MOV B,#10H
NDV311 : CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV F0,C
CLR C
SUBB A,R7
JB F0,NDV312
JC NDV313
NDV312 : MOV R2,A
INC R4
NDV313 : DJNZ B,NDV311
POP A
CLR OV
JZ NDV314
SETB OV
NDV314 : XCH A,R2
MOV R7,A
RET
『貳』 51單片機是什麼如何學習它的編程都用在哪些方面
51單片機是對所有兼容Intel 8031指令系統的單片機的統稱。
由於intel生產的8031的升級版8051工藝成熟,成為當時市場應用量最大的單片機,所以對此類兼容晶元統稱51單片機。
該系列單片機的始祖是Intel的8031單片機,後來隨著Flash rom技術的發展,8031單片機取得了長足的進展,成為應用最廣泛的8位單片機之一,其代表型號是ATMEL公司的AT89系列,它廣泛應用於工業測控系統之中。很多公司都有51系列的兼容機型推出,今後很長的一段時間內將佔有大量市場。51單片機是基礎入門的一個單片機,還是應用最廣泛的一種。
現在每年仍舊會使用幾十億片51系列的兼容晶元,在你想得到的電器、玩具上,比如:遙控燈具、洗衣機、冰箱、電子鍾表、顯示器、汽車(每輛汽車可能會用到十幾到幾十片)。。。。。
學習它很簡單,到當地書店、圖書館、隨手可以找到幾十種單片機入門書,8成以上是講51系列單片機的。
----------------
學習編輯
作為一個初學者,如何單片機入門?
知識上,其實不需要多少東西,會簡單的C語言,知道51單片機的基本結構就可以了。一般的大學畢業生都可以了,自學過這2門課程的高中生也夠條件。設備上,一般是建議購買一個模擬器,例如,的「雙功能下載線」就具有良好的穩定性和較快的下載速度,上位機可擴展,可以下載更多的單片機及嵌入式晶元。通過實驗,這樣才可以進行實際的,全面的學習。日後在工作上,模擬器也大有用處。還有,一般光有模擬器是不行,還得有一個實際的電路,即學習板,如圖,即為,單片機最小系統。
學習板以強大的介面為主,單片機的學習分兩方面,一方面是單片機的原理及內部結構,另一方面是單片機的介面技術。這些都是需要平時多積累,多動手,多思考,這樣才能學好單片機技術。
註:「雙功能下載線」在網路文庫里有詳細的使用說明,並且上位機會定期更新以支持更多的單片機。
單片機學習的4個階段
一、整體了解
要知道 單片機是什麼?單片機有何用?如何系統學習單片機?單片機系統設計的流程是怎樣的,需要掌握哪些輔助軟體?
了解這些之後,我們的學習就有了目標和方向。
二、揭秘單片機很難學,是因為其內部結構、編程語言抽象,且實際應用中與其他電子技術和元器件知識相互關聯,需結合起來一起設計開發產品。所以,第二階段要了解單片機的內部結構是怎樣的?單片機開發經常會用到哪些電子技術和元器件知識?如何將一條條編程指令組合成一段段有效的程序?
三、解密之所以單片機能成為控制核心,設計出包羅萬象的應用系統來,是因為開發者利用了單片機提供的種種功能及各種外設。所以,第三階段我們要掌握單片機的各種功能,再加上諸如感測器、模數轉換、掃描顯示、串列、中斷的應用思維,結合更多的元器件、電子電路知識,逐個學習、體會實際的單片機系統的秘密。
四、遠航通過以上三個階段,讀者基本就可掌握單片機的應用了。但要設計出豐富的單片機系統,解決復雜的實際問題,還需要了解更多的外設知識及其與單片機的聯系(如電動機、各類
存儲器、繼電器、紅外管等)。這些需要不斷的學習和積累。有時候,接到一些開發任務,就需要你針對這個任務自覺地去搜集、學習相關知識,在實踐中不斷載學習和提高。
參考網路:http://ke..com/link?url=
『叄』 51單片機控制的智能小車程序
#include<reg51.h> //包含單片機寄存器的頭文件
sbit IR=P3^2; //將IR位定義為P3.2引腳
unsigned char a[4]; //儲存用戶碼、用戶反碼與鍵數據碼、鍵數據反碼
unsigned int LowTime,HighTime; //儲存高、低電平的寬度
/************************************************************
函數功能:對4個位元組的用戶碼和鍵數據碼進行解碼
說明:解碼正確,返回1,否則返回0
出口參數:dat
*************************************************************/
bit DeCode(void)
{
unsigned char i,j;
unsigned char temp; //儲存解碼出的數據
for(i=0;i<4;i++) //連續讀取4個用戶碼和鍵數據碼
{
for(j=0;j<8;j++) //每個碼有8位數字
{
temp=temp>>1; //temp中的各數據位右移一位,因為先讀出的是高位數據
TH0=0; //定時器清0
TL0=0; //定時器清0
TR0=1; //開啟定時器T0
while(IR==0) //如果是低電平就等待
; //低電平計時
TR0=0; //關閉定時器T0
LowTime=TH0*256+TL0; //保存低電平寬度
TH0=0; //定時器清0
TL0=0; //定時器清0
TR0=1; //開啟定時器T0
while(IR==1) //如果是高電平就等待
;
TR0=0; //關閉定時器T0
HighTime=TH0*256+TL0; //保存高電平寬度
if((LowTime<370)||(LowTime>640))
return 0; //如果低電平長度不在合理范圍,則認為出錯,停止解碼
if((HighTime>420)&&(HighTime<620)) //如果高電平時間在560微秒左右,即計數560/1.085=516次
temp=temp&0x7f; //(520-100=420, 520+100=620),則該位是0
if((HighTime>1300)&&(HighTime<1800)) //如果高電平時間在1680微秒左右,即計數1680/1.085=1548次
temp=temp|0x80; //(1550-250=1300,1550+250=1800),則該位是1
}
a[i]=temp; //將解碼出的位元組值儲存在a[i]
}
if(a[2]=~a[3]) //驗證鍵數據碼和其反碼是否相等,一般情況下不必驗證用戶碼
return 1; //解碼正確,返回1
}
/************************************************************
函數功能:執行遙控功能
*************************************************************/
void Function(void)
{
P1=a[2]; //將按鍵數據碼送P1口顯示
}
/************************************************************
函數功能:主函數
*************************************************************/
void main()
{
EA=1; //開啟總中斷
EX0=1; //開外中斷0
ET0=1; //定時器T0中斷允許
IT0=1; //外中斷的下降沿觸發
TMOD=0x01; //使用定時器T0的模式1
TR0=0; //定時器T0關閉
while(1) //等待紅外信號產生的中斷
;
}
/************************************************************
函數功能:紅外線觸發的外中斷處理函數
*************************************************************/
void Int0(void) interrupt 0 using 0
{
EX0=0; //關閉外中斷0,不再接收二次紅外信號的中斷,只解碼當前紅外信號
TH0=0; //定時器T0的高8位清0
TL0=0; //定時器T0的低8位清0
TR0=1; //開啟定時器T0
while(IR==0) //如果是低電平就等待,給引導碼低電平計時
;
TR0=0; //關閉定時器T0
LowTime=TH0*256+TL0; //保存低電平時間
TH0=0; //定時器T0的高8位清0
TL0=0; //定時器T0的低8位清0
TR0=1; //開啟定時器T0
while(IR==1) //如果是高電平就等待,給引導碼高電平計時
;
TR0=0; //關閉定時器T0
HighTime=TH0*256+TL0; //保存引導碼的高電平長度
if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<4700))
{
//如果是引導碼,就開始解碼,否則放棄,引導碼的低電平計時
//次數=9000us/1.085=8294, 判斷區間:8300-500=7800,8300+500=8800.
if(DeCode()==1)
Function(); //如果滿足條件,執行遙控功能
}
EX0=1; //開啟外中斷EX0
}
『肆』 51單片機的具體介紹
T89C2051是精簡版的51單片機,精簡掉了P0口和P2口,只有20引腳,但其內部集成了一個很實用的模擬比較器,特別適合開發精簡的51應用系統,畢竟很多時候我們開發簡單的產品時用不了全部32個I/O口,用AT89C2051更合適,晶元體積更小,而且AT89C2051的工作電壓最低為2.7V,因此可以用來開發兩節5號電池供電的攜帶型產品。
本文以ATMEL公司生產的51系列家族的AT89S51和AT89C2051兩種單片機來講解,兩種單片機是目前最常用的單片機,其中AT89S51為標准51單片機,當然其功能比早期的51單片機更強大,支持ISP在系統編程技術,內置硬體看門狗。。。
一、AT89S51單片機引腳介紹
AT89S51有PDIP、PLCC、TQFP三種封裝方式,其中最常見的就是採用40Pin封裝的雙列直接PDIP封裝,外形結構下圖。
晶元共有40個引腳,引腳的排列順序為從靠晶元的缺口(見右圖)左邊那列引腳逆時針數起,依次為1、2、3、4。。。40,其中晶元的1腳頂上有個凹點(見右圖)。在單片機的40個引腳中,電源引腳2根,外接晶體振盪器引腳2根,控制引腳4根以及4組8位可編程I/O引腳32根。
1、主電源引腳(2根)
VCC(Pin40):電源輸入,接+5V電源
GND(Pin20):接地線
2、外接晶振引腳(2根)
XTAL1(Pin19):片內振盪電路的輸入端
XTAL2(Pin20):片內振盪電路的輸出端
3、控制引腳(4根)
RST/VPP(Pin9):復位引腳,引腳上出現2個機器周期的高電平將使單片機復位。
ALE/PROG(Pin30):地址鎖存允許信號
PSEN(Pin29):外部存儲器讀選通信號
EA/VPP(Pin31):程序存儲器的內外部選通,接低電平從外部程序存儲器讀指令,如果接高電平則從內部程序存儲器讀指令。
晶元實物圖片 晶元引腳功能
4、可編程輸入/輸出引腳(32根)
AT89S51單片機有4組8位的可編程I/O口,分別位P0、P1、P2、P3口,每個口有8位(8根引腳),共32根。每一根引腳都可以編程,比如用來控制電機、交通燈、霓虹燈等,開發產品時就是利用這些可編程引腳來實現我們想要的功能,盡情發揮你的想像力吧,實現你想要的:)
強大無比。。。
PO口(Pin39~Pin32):8位雙向I/O口線,名稱為P0.0~P0.7
P1口(Pin1~Pin8):8位準雙向I/O口線,名稱為P1.0~P1.7
P2口(Pin21~Pin28):8位準雙向I/O口線,名稱為P2.0~P2.7
P3口(Pin10~Pin17):8位準雙向I/O口線,名稱為P3.0~P3.7
上面就是AT89S51單片機引腳的簡單介紹,其它51系列家族的單片機8031、8051、89C51等引腳和89S51兼容,只是個別引腳功能定義不同。
二、AT89C2051單片機引腳介紹
AT89C2051為20引腳小型封裝,2K內部程序存儲器,15個可編程I/O口線,沒有P0口和P2口的16根I/O線,內部集成了一個模擬比較器。AT89C2051單片機的引腳排列如下圖所示。
晶元實物圖片 晶元引腳功能
晶元共有20個引腳,引腳的排列順序為從靠晶元的缺口(見上圖)左邊那列引腳逆時針數起,依次為1、2、3。。。20,在單片機的20個引腳中,電源引腳2根,外接晶體振盪器引腳2根,復位引腳1根以及P1、P3口可編程I/O引腳15根。
1、主電源引腳(2根)
VCC(Pin20):電源輸入,接+5V電源
GND(Pin10):接地線
2、外接晶振引腳(2根)
XTAL1(Pin5):片內振盪電路的輸入端
XTAL2(Pin4):片內振盪電路的輸出端
3、控制引腳(1根)
RST/VPP(Pin1):復位引腳,引腳上出現2個機器周期的高電平將使單片機復位。
4、可編程輸入/輸出引腳(15根)
P1口: 8位準雙向I/O口線,P1.0~P1.7 ,共8根
P3口: 8位準雙向I/O口線,P3.0~P3.5、P3.7,共7根
聰明的你一定會發現:標准51單片機有32根可編程I/O口線,89C2051精簡掉P0、P2口16根I/O線後,應該還有16根I/O口線,現在只有15根,另一根跑那裡去了呢?!前面講到AT89C2051內部集成了一個模擬比較器,正是因為集成了模擬比較器把另一根引線佔用了,比較器的輸出端佔用了一個I/O口,它就是P3.6口,引腳P3.6沒有接出來的,所以少一根I/O口線。在編程時,P3.6就只能用來讀比較器的狀態了,不能象其它I/O口一樣用來驅動外部指示燈等設備了,不過模擬比較器很實用的,在開發中就可以省去外加比較器的麻煩,圖為比較器的原理。
三、主要性能參數介紹
AT89S51
·與MCS-51產品指令系統完全兼容
·4k位元組在系統編程(ISP)Flash閃速存儲器
·1000次擦寫周期
·4.0-5.5V的工作電壓范圍
·全靜態工作模式:0Hz-33MHz
·三級程序加密鎖
·128×8位元組內部RAM
·32個可編程I/O口線
·2個16位定時/計數器
·6個中斷源
·全雙工串列UART通道
·低功耗空閑和掉電模式
·中斷可從空閑模喚醒系統
·看門狗(WDT)及雙數據指針
·掉電標識和快速編程特性
·靈活的在系統編程(ISP位元組或頁寫模式)
AT89C2051
·與MCS-51產品指令系統完全兼容
·2k位元組可重擦寫閃速存儲器
·1000次擦寫周期
·2.7V-6V的工作電壓范圍
·全靜態操作:0Hz-24MHz
·兩級加密程序存儲器
·128×8位元組內部RAM
·15個可編程I/O口線
·2個l6位定時/計數器
·6個中斷源
·可編程串列UART通道
·可直接驅動LED的輸出埠
·內置一個模擬比較器
·低功耗空閑和掉電模式
『伍』 51單片機燈閃爍怎麼編程
51單片機閃爍燈的編程程序要與相對應的機器連接之後,固定編碼操作。
『陸』 51單片機入門編程(匯編語言)
ORG0000H
LJMPMAIN
ORG000BH
LJMPT0ISR
ORG0030H
MAIN:
MOVTMOD,#01H
MOVTH0,#HIGH(65536-50000)
MOVTL0,#LOW(65536-50000)
SETBTR0
SETBET0
SETBEA
CLRP1.0
SJMP$
T0ISR:
CLRTR0
MOVTH0,#HIGH(65536-50000)
MOVTL0,#LOW(65536-50000)
SETBTR0
CPLP1.0
RETI
END
『柒』 51單片機編程2位數碼管倒計時,從10秒開始每隔一秒減一當減到零有重復回到10秒
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//主程序
void main()
{
P0=0x06; //顯示10
P2=0x3f;
i=0;
Second_Counts=100;
TMOD=0x01; //定時器0方式1
TH0=(65536-50000)/256; //定時器0: 5ms
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1
while(1) ;
}
//T0中斷函數
void DSY_Refresh() interrupt 1
{
TH0=(65536-50000)/256; //恢復定時器0初值
TL0=(65536-50000)%256;
if(++i==2) //50ms*2=0.1s轉換狀態
{
i=0;
Second_Counts--;
P0=DSY_CODE[Second_Counts/100];
P2=DSY_CODE[(Second_Counts/10)%10];
if(Second_Counts<=-1) Second_Counts=100; //顯示10
}
}
『捌』 51單片機用什麼軟體編程
51單片機用什麼軟體編程介紹如下:
與匯編相比,C語言在功能上、結構性、可讀性、握腔可維護性上有明顯的優勢,因而易學易用。用過匯編語言後再使用C來開發,體會更加深刻。KeilC51軟體提供豐富的函數庫個功能強大的集成開發調試工具,全Windows界面。
『玖』 51單片機設計跑馬燈的程序用(c語言)編寫
|P1口接8個發光二極體共陽
#include <AT89X51.H>
unsigned char i;
unsigned char temp;
unsigned char a,b;
void delay(void)
{
unsigned char m,n,s;
for(m=20;m>0;m--)
for(n=20;n>0;n--)
for(s=248;s>0;s--);
}
void main(void)
{
while(1)
{
temp=0xfe;
P1=temp;
delay();
for(i=1;i<8;i++)
{
a=temp<<i;
b=temp>>(8-i);
P1=a|b;
delay();
}
for(i=1;i<8;i++)
{
a=temp>>i;
b=temp<<(8-i);
P1=a|b;
delay();
}
}
}
(9)少兒編程51單片機擴展閱讀:
Proteus 自從有了單片機也就有了開發系統,隨著單片機的發展開發系統也在不斷發展。 keil是一種先進的單片機集成開發系統。它代表著匯編語言單片機開發系統的最新發展,首創多項便利技術,將開發的編程/模擬/調試/寫入/加密等所有過程一氣呵成,中間不須任何編譯或匯編。
『拾』 51單片機如何入門
入門快不快要看你有沒有一定的基礎,比如電子電路知識,0基礎的話確實是有點難。
零基礎的話建議:
1,學習電子元器件基礎
2,學習模擬電子電路基礎
3,學習數字電路基礎
4,熟悉51單片機硬體結構
5,學習編程語言
上面的學完了就入門了 ,我不建議買51單片機開發實驗板來學習,開始學就是要增加自己的動手能力,動手才了解電路,排除故障,得到經驗,製作一個51單片機最小系統是很簡單的,再加個8位流水燈,就可以學了,然後再加按鍵,和流水燈一起學,這樣硬體製作也學會,編程也學會,循序漸進才有進步,不要想著一步登天。
有空和我交流交流,我也在學51單片機。