⑴ 51單片機intrinsic.h怎麼用
頭文件就相當於一組自定義函數或者一些聲明。其實沒什麼使用方法。你在使用include<aaa.h>時,就如同你把aaa.h中的內容全部復制到添加路徑include<aaa.h>的地方。
具體我們看下面:
/*--------------------------------------------------------------------------
INTRINS.H
IntrinsicfunctionsforC51.
--------------------------------------------------------------------------*/
#ifndef__INTRINS_H__
#define__INTRINS_H__
#pragmaSAVE
#ifdefined(__CX2__)
#pragmaFUNCTIONS(STATIC)
/*,butneedstaticattribute*/
#endif
externvoid_nop_(void);
externbit_testbit_(bit);
externunsignedchar_cror_(unsignedchar,unsignedchar);
externunsignedint_iror_(unsignedint,unsignedchar);
externunsignedlong_lror_(unsignedlong,unsignedchar);
externunsignedchar_crol_(unsignedchar,unsignedchar);
externunsignedint_irol_(unsignedint,unsignedchar);
externunsignedlong_lrol_(unsignedlong,unsignedchar);
externunsignedchar_chkfloat_(float);
#ifdefined(__CX2__)
externintabs(int);
externvoid_illop_(void);
#endif
#if!defined(__CX2__)
externvoid_push_(unsignedchar_sfr);
externvoid_pop_(unsignedchar_sfr);
#endif
#pragmaRESTORE
#endif
以上是intrins.h的具體內容。
逐一分析。
1.#ifndef,#define,#endif
#ifndef __INTRINS_H__
#define __INTRINS_H__
#define qwerty
...
#define tyuio
#endif
這是一組。功能是條件編譯。ifndef是if not defined,如果沒有定義__INTRINS_H__,那咱們就定義吧,下一條就是#define __INTRINS_H__。一直到最後終止endif。
使用目的:如果編譯時,系統已有intrins.h的定義,則不編譯以下內容,若系統沒有定義標識則編譯內容。
例如,我們有一個數據類型,在Windows平台中,應該使用long類型表示,而在其他平台應該使用float表示,這樣往往需要對源程序作必要的修改,這就降低了程序的通用性。可以用以下的條件編譯:
#ifdefWINDOWS
#defineMYTYPElong
#else
#defineMYTYPEfloat
#endif
如果在Windows上編譯程序,則可以在程序的開始加上#define WINDOWS
這樣則編譯命令行:#define MYTYPE long。
如果在這組條件編譯命令之前曾出現以下命令行:#define WINDOWS 0
則預編譯後程序中的MYTYPE都用float代替。這樣,源程序可以不必作任何修改就可以用於不同類型的計算機系統。
(#pragma先略過)
2.extern
Extern用在變數/函數聲明前,表明該變數/函數是在別處定義的。Extern void nop (void)表示其他地方有定義過函數nop(void),此處引用。
首先強調一點。頭文件中的定義都不是全局變數,但是因為一直寫在開頭所以總是被最先編譯。如果在xxx.h中定義int key,想在多個文件中使用A.c,B.h,…,編譯不會通過。因為頭文件中的內容如同照抄在include<xxx.h>處。即:在A和B中都定義了一次這個全局變數key(重復定義)。正確做法是在A.c中定義,在B.h中用extern+A.c中的定義,相反也行。
extern unsigned char _cror_ (unsigned char, unsigned char);表示聲明一個叫_cror_ 的函數,兩個參變數,返回unsigned char型的函數。等等。
_crol_字元循環左移
_cror_字元循環右移
_irol_整數循環左移
_iror_整數循環右移
_lrol_長整數循環左移
_lror_長整數循環右移
_nop_空操作8051NOP指令
說明一下,上面的這些函數雖然是外部定義的。但是很難找到定義的地點。可能在某個系統的dll文件中。使用時不必拘泥過多,直接使用就行。具體函數幹些什麼你也可以自己網路。這里不展開了。
3.#pragma
這是預編譯指令,也可以叫編譯器指令。初學者不必深究。換句話說,即使完全不理解也不影響你單片機的學習。
#pragma SAVE表示把當前設定放入保存堆棧。
#pragma RESTORE一直和SAVE組合使用,吧保存堆棧中的內容存儲起來。他們是一組,一般共同使用。
還有剩餘的一些其實就和上面講的是一個類型。無非就是條件編譯和預編譯指令,和你關系不大這里就不展開了。
綜合一下。看一個例子:
voidhahaha(inta,charb);//實際上你打開一個單片機的project,裡面有reg51.h和intrins.h。這句話就如同intrins.h的功能,僅僅是聲明。
main()
{
hahaha(qwe,rty);
}
voidhahaha(inta,charb);//這句話就如同reg51.h的功能,定義了一些函數。
{
a=a++;
b=b--;
}
當你include<reg51.h>include<intrins.h>後,就如同頭文件的內容全部抄到你自己寫的函數的最上面。
⑵ 設計一個單片機雙機通信系統,並編寫通信程序
串口調試助手是PC端的軟體,用來從PC的串口發送和接收數據的。我們調試PC和單片機之間通訊的時候用來模擬PC端應用軟體給單片機發送數據和接收單片機發送的數據的。你調試的是單片機和單片機之間的通訊,不適合用串口調試助手的。
但是單片機和單片機通訊不容易知道實際通訊的數據,所以存在很大的調試難度。如果條件允許的話,一般是通過單片機連PC串口,讓PC模擬模塊收發數據來驗證串口通訊是否正常(PC端能夠直接看到單片機發送的數據,從而判斷程序是否符合同模塊的通訊要求),再把PC換成模塊進行通訊。這樣調試比較方便。
你和模塊通訊也是單純的串口通訊。
我又仔細分析了一下你的系統,按你的意思應該是拿51單片機做上位機。習慣上我們把PC稱為上位機,所以剛才沒明白。
1、SMOD是用來給串口波特率硬體倍頻的。在串口模式1,2,3下,如果SMOD=0波特率是4800,那麼SMOD=1時波特率是9600。它存在的理由就是:如果要求的波特率非常快,在給定晶振條件下SMOD=0已經滿足不了,才需要SMOD=1倍頻。
比如你11.0592MHZ在SMOD=0時波特率最大28800bps達不到要求的57600bps,所以你要用SMOD=1倍頻才能實現。
你串口要選擇模式1,波特率是可變的,取決於定時器1的溢出速率:
波特率=(2SMOD÷32)×定時器1 溢出速率
通常會使用定時器1 工作在定時器工作模式2下,這時定時值中的TL1 做為計數,TH1 做為自動重裝值 ,這個定時模式下,定時器溢出後,TH1 的值會自動裝載到TL1,再次開始計數,這樣可以不用軟體去干預,使得定時更准確。在這個定時模式2 下定時器1 溢出速率的計算公式如下:
溢出速率=(計數速率)/(256-TH1) ;
計數速率= 11.0592M/12;
算了一下是TH1=255(#0FFH);就是計數器走一個計數周期。
2、你不用關心什麼叫做數據包,只是一種形象的叫法。把一串數據作為一次通訊的內容,這一串數據就是一個包了。那個2位和4位只是寫法上便於你理解的,
如01H +0000H + 01H + 03H + 0005H
對應上面的包格式解釋0000H是地址碼保留字0005H是校驗和。
而串口通訊一幀只能發送一個位元組。發送的時候只能 01H + 00H +00H + 01H + 03H + 00H + 05H 依序發送。
用匯編寫的話流程就是 寫入第一個位元組01H到SBUF,等待直到TI=1,發送第二個位元組00H,等待直到TI=1,發送第三個位元組00H,如此循環直到發送完05H為止。
3、類似發送,應答8181H也是81H+81H兩個位元組回復的。可以用中斷,也可以用查詢。例如2的發送通訊中05H發送完之後就要開始查詢RI直到RI=1,然後就把 SBUF中的位元組讀出來,是81H,清RI後再查詢RI直到RI=1,把 SBUF中的位元組讀出來,是81H,清RI。如果判斷兩個接收的都是81H那就表明收包正確。
4、串口通訊一幀只能發送一個位元組。這個就不是問題了。
+我hi交流,不留Q,不留程序。
⑶ 急求!!!哪位朋友指點下單片機程序題。。
ANL A, #17H; (A)=多少A是怎麼算出來的求解
⑷ 單片機習題解答
39. RC A為循環左移指令(F ) 40.MOV A,30H為立即定址方式( F ) 41.如果發生除法溢出錯誤,則PSW標志位P置1。(F ) 42.如JC rel發生跳轉時,目標地址為當前地址加上偏移量rel( T ) 43..MOV A,@A+DPTR是一條查詢指令( F ) 44.MUL AB的執行結果是高8位在A中,低8 位在B中( F ) 45.離散信號都是數字信號( F ) 46.在A/D變換時,抽樣頻率越高越好( F ) 47.CPU對內部RAM和外部RAM的讀寫速度一樣快( F ) 48.對於8051單片機,當CPU對內部程序存儲器定址超過4K時,系統會自動在外部程序存儲器中定址( F) 49.外加晶振頻率越高,系統運算速度也就越快,系統性能也就越好( F ) 50.(-86)原=11010110 (-86)反=10101001 (-86)補=10101010 ( T )
51.我們所說的計算機實質上是計算機的硬體系統與軟體系統的總稱。 ( T )
52.MCS-51的相對轉移指令最大負跳距是127B。 ( T)
53.MCS-51的特殊功能寄存器分布在60H~80H地址范圍內。( F )
54.要MCS-51系統中,一個機器周期等於1.5μs。( F,1us )
55、片內RAM與外部設備統一編址時,需要專門的輸入/輸出指令。( T )
56、MOV A, R0,這是寄存器定址方式。 ( T )
57、8051單片機的P0口既可以做數據口線又可以做為地址口線 。 ( T)
58、CPU和外設之間的數據傳送方式主要有查詢方式和中斷方式,兩者相比後者的效率更高。 ( T)
59、8051內部有4K的程序存儲器 ( F,8kB )
60、MCS-51單片機共有兩個時鍾XTAL1 和XTAL2 ( T )
61、五個中斷源中優先順序是高的是外部中斷0,優先順序是低的是串列口中斷 ( T如果是8051單片機,8052就不對了 )
62、工作寄存器工作在0區,則R2 所對應的內部數據存儲器的地址是03H 。( F)
63、MOVC A @A +DPTR ,這是條相對定址指令 ( T )
64、8051單片機的P2口只能用作通用I/O 口 ( T )
65、程序存儲器和數據存儲器的作用不同,程序存儲器一般用存放數據表格和程序,而數據存儲器一般用來存放數據 ( T )
66、要進行多機通信,MCS-51串列介面的工作方式應為方式1。 ( F )
67、TMOD中的GATE=1時,表示由兩個信號控制定時器的啟停。 ( T )。
68、MCS-51外擴I/O口與外RAM是統一編址的。 ( F )。
69、使用8751且 =1時,仍可外擴64KB的程序存儲器。( T)
70、8155晶元內具有256B的靜態RAM,2個8位和1個6位的可編程並行I/O口,1個14位定時期等常用部件及地址鎖存器。(T )
71、我們所說的計算機實質上是計算機的硬體系統與軟體系統的總稱。 ( T )
72、.MCS-51上電復位時,SBUF=00H。 ( F )。 SBUF不定。
73、使用可編程介面必須處始化。 ( T )。
74.8155的復位引腳可與89C51的復位引腳直接相連。( 不知道 )
75.MCS-51是微處理器。( F )不是。
76.MCS-51系統可以沒有復位電路。( F)不可以。復位是單片機的初始化操作。
77.要MCS-51系統中,一個機器周期等於1.5μs。( F,12mhZ )若晶振頻率屢8MHz,才可能為1.5μs
78.計算機中常作的碼制有原碼、反碼和補碼( T )
79.若不使用MCS-51片內存器引腳EA必須接地. ( T )
⑸ 單片機學習,請大家幫忙
;已知A=7AH,R0=30H,(30H)=A5H,PSW=80H,請按要求填寫各指令的執行結果(每條指令均按已給定的原始數據進行操作)
;首先 先說一下 PSW寄存器(程序狀態寄存器) 是一個8為特殊寄存器,它的各位包含程序執行後
;的狀態信息 供程序查詢或判別之用;
; 分別是是 CY(借,進) AC(鋪進) F0 (用戶標定) RS1 (寄存器選擇)
; RS0 (寄存器選擇) OV (溢出) - (保留) P (奇/偶)
;OV(PSW.2) 溢出標志位 。當進行補碼運算時 如果有溢出。即超出-128~127的范圍時
;或者 進行加減運算時 超過 8位二進制(255)
;OV由硬體自動置一,無溢出時為0
ORG 0000H
MOV A ,#7AH ;OV=0;
MOV R0,#30H ;0V=0;
MOV 30H,#0A5H ;OV=0;
MOV PSW,#80H ;(OV=0) CY=1;J進位為1;
ADD A,R0 ;(OV=(1) CY=0;07AH+30H=AAH (十進制=170) 故 A=AAH因為有溢出
ADD A,30H ;(OV=1) CY=1; AAH+A5H=14F (335) 現在A=14F(335)已經超過8位最大值FFH(255)
;故 A有溢出 OV=1; A=14FH(335)-FFH(255)-CY=4FH(79);
ADD A,#30H ;;(OV=0) 因為現在 A=4FH(79)+30H (48)=7FH(127) 小於FFH(255) OV=0; CY=0
ADDC A,30H ; (OV=0) CY=1 ;7FH(127)+A5H=123H(291)-FFH(255)=24H()
SUBB A,30H ; (OV=0) A=7EH
SUBB A,#30H ; (OV=0) A=4DH
SJMP $
end
⑹ 單片機中 A=4EH,B=5DH,MUL AB 怎麼計算的結果是AB=1C56H怎麼來的
列算式就可以知道怎麼得到的了:
01001110 ;A=4EH,
01011101 ;B=5DH,
------------------------;x;MUL AB
01001110
00000000
01001110
01001110
01001110
00000000
01001110
00000000
---------------------------------------------
0001110001010110
四位一組 0001 1100 0101 0110B,即1C56H。
其實乘法就是移位再累加。
⑺ 單片機 ORL C,/H是什麼意思
單片機中 ORL C,/H的意思是將借位C與「位變數」H取反後進行「邏輯或」運算。
布爾操作指令ORL 為邏輯或的意思
C是狀態寄存器PSW的PSW.7位,借位或進位標志
/H,是用戶自定義的位變數,地址為是20H~2FH中的某一位。
⑻ 單片機原理,"ANL A , # 0F H "這條"與"指令的作用
這條指令的作用是將累加器A的高四位屏蔽掉,保留低四位。
⑼ 單片機,10000H-7DH怎麼計算的求詳細計算過程
1
2
3
51
單片機
C
語言程序(二)定時
/
計數器
中斷
程序一
利用定時
/
計數器
T0
從
P1.0
輸出周期為
1s
的方波,
讓發光二極體以
1HZ
閃爍,
#include<reg52.h>
//52
單片機頭文件
#include<intrins.h>//
包含有左右循環移位子函數的庫
#defineuintunsignedint
//
宏定義
#defineucharunsignedchar
//
宏定義
sbitP1_0=P1^0;
uchartt;
voidmain()
//
主函數
{
TMOD=0x01;//
設置定時器
0
為工作方式
1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//
開總中斷
ET0=1;//
開定時器
0
中斷
TR0=1;//
啟動定時器
0
while(1);//
等待中斷產生
}
單片機系統開發,2021最新報價!立即圍觀!
廣告單片機系統開發意法半導體包含廣泛產品線包含低成本8位單片機和具備豐富外設選擇的單片機系統開發單片機。查看詳情 >
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==20)
{
tt=0;
P1_0=~P1_0;
}
}
程序二
利用定時
/
計數器
T1
產生定時時鍾
,
由
P1
口控制
8
個發光二極體
,
使
8
個指示燈依次一個一個閃動,
閃動頻率為
10
次
/
秒
(8
個燈依次亮一遍為一個周期
)
,循環。
#include<reg52.h>
//52
單片機頭文件
#include<intrins.h>//
包含有左右循環移位子函數的庫
#defineuintunsignedint
//
宏定義
#defineucharunsignedchar
//
宏定義
華清遠見c語言單片機,新手入門-實戰教學,嵌入式開發
廣告c語言單片機,華清遠見自主研發,軟硬體結合教學,畢業相當於擁有1-3年工作經驗。查看詳情 >
sbitP1_0=P1^0;
uchartt,a;
voidmain()
//
主函數
{
TMOD=0x01;//
設置定時器
0
為工作方式
1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//
開總中斷
ET0=1;//
開定時器
0
中斷
TR0=1;//
啟動定時器
0
a=0xfe;
while(1);//
等待中斷產生
}
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==2)
{
tt=0;
網路安全OTA-專業,可靠的單片機ota,初創企業免費申領
廣告2萬台設備OTA額度面向初創企業【免費開放】,為企業降低OTA成本,提高設備安全系數。查看詳情 >
P1=a;
a=_crol_(a,1);
}
}
程序三
同時用兩個定時器控制蜂鳴器發聲,
定時器
0
控制頻率,定時器
1
控制同個
頻率持續的時間,間隔
2s
依次輸出
1
,
10
,
50,100
,
200,400,800,
1k
(
hz
)的方波
#include<reg52.h>
//52
單片機頭文件
#include<intrins.h>//
包含有左右循環移位子函數的庫
#defineuintunsignedint
//
宏定義
#defineucharunsignedchar
//
宏定義
sbitbeep=P2^3;
uchartt;
uintfre,flag;
voidmain()
//
主函數
{
fre=50000;
活字格-企業級低代碼開發平台,軟博會獲獎產品
廣告可視化設計,快速開發企業Web應用,幫助用戶快速構建支持移動端的企業級應用程序,滿足企查看詳情 >
beep=0;
TMOD=0x11;//
設置定時器
0,
定時器
1
為工作方式
1
TH0=(65536-fre)/256;
TL0=(65536-fre)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;//
開總中斷
ET0=1;//
開定時器
0
中斷
ET1=1;
TR1=1;
TR0=1;//
啟動定時器
0
while(1);//
等待中斷產生
}
voidtimer0()interrupt1
//
定時器
0
中斷
{
TR0=0;
//
進中斷後先把定時器
0
中斷關閉,防止內部程序過
多而造成中斷丟失
TH0=(65536-fre)/256;
TL0=(65536-fre)%256;
tt++;
if(flag<40)
//
以下幾個
if
分別用來選取不同的頻率
等,希望以上內容能對你有所幫助、。