導航:首頁 > 操作系統 > 寫單片機代碼

寫單片機代碼

發布時間:2022-07-03 22:55:32

A. 如何寫出高效的單片機C語言程序代碼

由於單片機的性能同電腦的性能是天淵之別的,無論從空間資源上、內存資源、工作頻率,都是無法
與之比較的。PC 機編程基本上不用考慮空間的佔用、內存的佔用的問題,最終目的就是實現功能就可以了。
對於單片機來說就截然不同了,一般的單片機的Flash 和Ram 的資源是以KB 來衡量的,可想而知,單片
機的資源是少得可憐,為此我們必須想法設法榨盡其所有資源,將它的性能發揮到最佳,程序設計時必須
遵循以下幾點進行優化:

1. 使用盡量小的數據類型
能夠使用字元型(char)定義的變數,就不要使用整型(int)變數來定義;能夠使用整型變數定義的變
量就不要用長整型(long int),能不使用浮點型(float)變數就不要使用浮點型變數。當然,在定義變
量後不要超過變數的作用范圍,如果超過變數的范圍賦值,C 編譯器並不報錯,但程序運行結果卻錯了,
而且這樣的錯誤很難發現。

2. 使用自加、自減指令
通常使用自加、自減指令和復合賦值表達式(如a-=1 及a+=1 等)都能夠生成高質量的
程序代碼,編譯器通常都能夠生成inc 和dec 之類的指令,而使用a=a+1 或a=a-1 之類
的指令,有很多C 編譯器都會生成二到三個位元組的指令。

3. 減少運算的強度
可以使用運算量小但功能相同的表達式替換原來復雜的的表達式。
(1) 求余運算
N= N %8 可以改為N = N &7
說明:位操作只需一個指令周期即可完成,而大部分的C 編譯器的「%」運算均是調用子程序來
完成,代碼長、執行速度慢。通常,只要求是求2n 方的余數,均可使用位操作的方法來代替。
(2) 平方運算
N=Pow(3,2) 可以改為N=3*3
說明:在有內置硬體乘法器的單片機中(如51 系列),乘法運算比求平方運算快得多, 因為浮點數
的求平方是通過調用子程序來實現的,乘法運算的子程序比平方運算的子程序代碼短,執行速度快。
(3) 用位移代替乘法除法
N=M*8 可以改為N=M<<3
N=M/8 可以改為N=M>>3
說明:通常如果需要乘以或除以2n,都可以用移位的方法代替。如果乘以2n,都可以生成左移
的代碼,而乘以其它的整數或除以任何數,均調用乘除法子程序。用移位的方法得到代碼比調用乘除法子
程序生成的代碼效率高。實際上,只要是乘以或除以一個整數,均可以用移位的方法得到結果。如N=M*9
可以改為N=(M<<3)+M;
(4) 自加自減的區別
例如我們平時使用的延時函數都是通過採用自加的方式來實現。
void DelayNms(UINT16 t)
{
UINT16 i,j;
for(i=0;i<t;i++)
for(j=0;i<1000;j++)
}
可以改為
void DelayNms(UINT16 t)
{
UINT16 i,j;
for(i=t;i>=0;i--)
for(j=1000;i>=0;j--)
}
說明:兩個函數的延時效果相似,但幾乎所有的C 編譯對後一種函數生成的代碼均比前一種代碼少1~3
個位元組,因為幾乎所有的MCU 均有為0 轉移的指令,採用後一種方式能夠生成這類指令。

4. while 與do...while 的區別
void DelayNus(UINT16 t)
{
while(t--)
{
NOP();
}
}
可以改為
void DelayNus(UINT16 t)
{
do
{
NOP();
}while(--t)
}
說明:使用do…while 循環編譯後生成的代碼的長度短於while 循環。

5. register 關鍵字
void UARTPrintfString(INT8 *str)
{
while(*str && str)
{
UARTSendByte(*str++)
}
}
可以改為
void UARTPrintfString(INT8 *str)
{
register INT8 *pstr=str;
while(*pstr && pstr)
{
UARTSendByte(*pstr++)
}
}
說明:在聲明局部變數的時候可以使用register 關鍵字。這就使得編譯器把變數放入一個多用途的寄存
器中,而不是在堆棧中,合理使用這種方法可以提高執行速度。函數調用越是頻繁,越是可能提高代碼的
速度,注意register 關鍵字只是建議編譯器而已。

6. volatile 關鍵字
volatile 總是與優化有關,編譯器有一種技術叫做數據流分析,分析程序中的變數在哪裡賦值、在
哪裡使用、在哪裡失效,分析結果可以用於常量合並,常量傳播等優化,進一步可以死代碼消除。一般來
說,volatile 關鍵字只用在以下三種情況:
a) 中斷服務函數中修改的供其它程序檢測的變數需要加volatile(參考本書高級實驗程序)
b) 多任務環境下各任務間共享的標志應該加volatile
c) 存儲器映射的硬體寄存器通常也要加volatile 說明,因為每次對它的讀寫都可能由不同意義
總之,volatile 關鍵字是一種類型修飾符,用它聲明的類型變數表示可以被某些編譯器未知的因素
更改,比如:操作系統、硬體或者其它線程等。遇到這個關鍵字聲明的變數,編譯器對訪問該變數的代碼
就不再進行優化,從而可以提供對特殊地址的穩定訪問。

B. 單片機代碼編寫

51 單片機。
MOVA,R0
ADDA,R3
MOVR4,A
MOVA,R1
ADDCA,R2
MOVR5,A
MOVA,#0
ADDCA,#0
MOVR6,A

END

C. 單片機的程序怎麼寫

看你用什麼單片機啊,每種單片機都會對應有一個或多個編譯器的,比如8051單片機,用得最多的就是keil了,如果你用的是51單片機,-下載keil軟體安裝包-安裝軟體------打開軟體----------就可以編寫單片機的程序了。

D. 單片機代碼編寫

假設:
P0和P1接數碼管顯示,
熄滅P1.0用低電平,
按鍵盤P3.2按下是低電平,
程序如下:

1 ORG 0000H
0000 020030 2 LJMP 0030H
3 ORG 0030H
0030 75803F 4 MOV P0,#3FH
0033 7590FF 5 MOV P1,#0FFH
0036 75A000 6 MOV P2,#00H
0039 C290 7 CLR P1.0
003B D2B2 8 L01: SETB P3.2
003D 20B209 9 JB P3.2,L02
0040 75805B 10 MOV P0,#5BH
0043 75905B 11 MOV P1,#5BH
0046 02003B 12 LJMP L01
0049 75803F 13 L02: MOV P0,#3FH
004C 7590FF 14 MOV P1,#0FFH
004F 02003B 15 LJMP L01
16 END

E. 用c++怎樣編寫51單片機程序

相信很多初學者都有同樣的疑問,也有同樣的希望。就是用C++語言來寫單片機程序的源代碼。現在我來解釋一下單片機的源代碼程序幾乎沒有人用C++來寫的。
1. 假設一下你現在用C++寫完了一個程序代碼。那麼你要讓單片機認識必須要編譯吧,對吧 。請問你有合適的編譯軟體來編譯你的代碼嗎?
2. 就算有編譯器能編譯,你能保證它的代碼效率一定能給單片機用嗎?
單片機的ROM是K級的水平,執行指令的速度也遠遠小於PC。絕對不能和PC機相比的。這個就決定了單片機編程時很多時候要考慮它的代碼效率和代碼大小問題。所以一般情況下對於單片機編程我們之用匯編語言或者C語言。就算是用C寫程序也要注意代碼的效率等問題。
還有就是只有很大型的項目及應用程序開發才有可能有C++來寫程序。一般的系統文件,應用程序都是用C來寫的。有的系統代碼甚至要用匯編語言來寫。
舉個生活中的例子:如果你從家裡去公司上班你一般的出行方式是什麼?
1.坐公車 2.騎車 3.自己開車 4.坐地鐵 5.走過去。如果誰說他是做直升飛機去上班的。那要麼這個人腦子不正常,要麼就是太有錢了炫富。如果你要打蒼蠅用蒼蠅拍子就行了。如果要你用巡航導彈來打蒼蠅,你認為可能嗎?
所以我們單片機寫程序的話一般就是匯編語言和C語言。幾乎沒有人用C++語言的。

F. (用匯編語言編寫單片機代碼,有注釋最好)

INT_INIT:
CLR IT0 ;外部中斷1電平觸發方式
SETB EX1 ;允許外部中斷1
SETB ET0 ;允許定時器0
SETB ET1 ;允許定時器1
SETB ES ;允許串口中斷
SETB PT0 ;定時器0高優先順序
SETB EA ;開啟總中斷

G. 求寫一段簡單的51單片機C語言代碼

#include < reg52.h >
#include <intrins.h>

sbit P00 = P0^0;
void delay(unsigned int ms)
{
unsigned char i;
while(ms--) for(i = 110; i-- ; i > 0);
}

void main()
{
unsigned char LED = 0xfe, COUN = 0;
while(1) {
P1 = LED;
P2 = COUN;
if (P00 == 1) {
delay(2);
if (P00 == 1) {
while (P00 == 1);
LED = _cror_(LED, 1);
COUN++;
} } } }

H. 單片機怎麼寫入程序

有專門的燒錄器,燒錄進去

I. 單片機寫代碼是什麼意思

就是往單片機裡面寫入程序,代碼的意思也就是程序,說寫代碼顯得高深,哈哈糊弄人的

閱讀全文

與寫單片機代碼相關的資料

熱點內容
堵車如何緩解壓力 瀏覽:15
喜鵲快貸app怎麼了 瀏覽:263
海龜編輯器積木編程怎麼安裝 瀏覽:185
程序員理發店生意怎麼樣 瀏覽:603
程序員羅技 瀏覽:180
軟考初級程序員課程2021下載 瀏覽:491
杭州程序員奶奶 瀏覽:880
不聽命令造成錯誤 瀏覽:981
kool系統源碼 瀏覽:610
流氓app在哪裡看 瀏覽:98
域名購買了怎麼指向伺服器 瀏覽:121
安卓手機如何讓照片顏色反轉 瀏覽:859
怎麼下載卓睿安手機版 瀏覽:514
h3crange命令 瀏覽:468
php前景和python 瀏覽:338
php壓縮圖片內存大小 瀏覽:495
在哪裡可以查看雲伺服器的信息 瀏覽:70
python讀取非txt文件 瀏覽:799
艾莫迅用什麼編程軟體好 瀏覽:227
android文件存儲讀取 瀏覽:214