導航:首頁 > 操作系統 > 單片機代碼怎麼做

單片機代碼怎麼做

發布時間:2022-09-07 03:01:07

『壹』 單片機代碼編寫

假設:
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

『貳』 如何寫出高效的單片機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 關鍵字是一種類型修飾符,用它聲明的類型變數表示可以被某些編譯器未知的因素
更改,比如:操作系統、硬體或者其它線程等。遇到這個關鍵字聲明的變數,編譯器對訪問該變數的代碼
就不再進行優化,從而可以提供對特殊地址的穩定訪問。

『叄』 如何編寫高效率穩定的單片機代碼

要寫出高效率穩定的單片機代碼:
1、使用匯編語言編寫。
2、熟練掌握和靈活應用各種演算法

『肆』 51單片機程序編寫

最簡程序如下:

『伍』 單片機定時器實驗的代碼怎麼寫求詳細注釋。

如果是100ms中斷一次,那麼晶振需要用6MHz

#include<reg51.h>
#defineucharunsignedchar
uchart1,sec1,dscan=0,dis[3]={0,0,0};
uchartable={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
voidt0isr()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t1++;
if(t1>=20)
{
t1=0;
sec1++;
dis[0]=sec1%10;
dis[1]=sec1%100/10;
dis[2]=sec1/100;
}
}
voidt1isr()interrupt3
{
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
P2=1<<dscan;
P0=table[dis[dscan]];
}
main()
{
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
TR0=1;
ET0=1;
TR1=1;
ET1=1;
EA=1;
t1=0;
sec1=0;
while(1);
}

『陸』 單片機的程序怎麼編寫

你可以先把0放到一個單元裡面,比如說100h,然後
mov
r0,100h
inc
100h
mov
r1,100h
inc
100h
繼續寫下去就可以了。

『柒』 利用單片機,如何才能正確的編寫出一段程序,編寫的步驟是什麼

51之類的入門級單片機搭建的小程序可以用Keil來編比較方便,C語言記得導入頭文件reg51.h或者reg52.h,然後後面用類似普通的C語言語法,注意這里的Keil C51和普通的C不同,比如sbit之類的,因為是交叉編譯,所以要注意各個介面,深入學習一定需要看書的。KeilC步驟:1、下載Keil42、project選擇晶元類型3、導入頭文件4、編程

『捌』 單片機的程序怎麼寫

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

『玖』 單片機代碼編寫

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

END

『拾』 用c++怎樣編寫51單片機程序

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

閱讀全文

與單片機代碼怎麼做相關的資料

熱點內容
php如何解析xml文件 瀏覽:700
如何改變appstore的語言 瀏覽:460
javahtmlxml 瀏覽:28
單片機啟動文件 瀏覽:811
橙app如何開啟聊天 瀏覽:899
訪問伺服器公網地址 瀏覽:666
pdf列印底色去掉 瀏覽:463
java快遞介面 瀏覽:397
哪個app可以教新爸爸 瀏覽:210
如何查看伺服器系統版本信息 瀏覽:524
成都市土地出讓金演算法 瀏覽:703
鋼筋加密標記 瀏覽:578
ps中擴展功能在文件夾的什麼位置 瀏覽:905
雙極壓縮機為什麼要先高壓 瀏覽:527
蘋果手機伺服器填什麼 瀏覽:832
android移動動畫效果 瀏覽:692
電子和伺服器是什麼意思 瀏覽:692
phpurl中文亂碼問題 瀏覽:894
程序員那麼可愛大結局陸漓產子 瀏覽:539
java如何從雲伺服器讀取本地文件 瀏覽:924