天天看點

avr單片機c語言程式設計結構,AVR單片機c語言程式設計風格

c語言

本文由飓風1030貢獻

doc文檔可能在WAP端浏覽體驗不佳。建議您優先選擇TXT,或下載下傳源檔案到本機檢視。

AVR 單片機 c 語言程式設計風格

作為一個初學者如何具有良好的程式設計風格呢?我想引用一個關于初學者請教程式設計 大師的故事讓讀者自己去領悟。 有一位程式設計大師, 他寫非結構化的程式, 一位初學者刻意模仿他, 也寫非結構化的程式。 當他讓大師看他的進步時,大師批評了他的非結構化程式:“ 對一位程式設計大師合适的東西 未必對一個初學者同樣合适,在超越結構化之前,你必須了解程式設計之道。” 我個人認為作 為一個初學者應該踏踏實實的打好程式設計的基礎,不要急功近利,舍本逐末。我走過不少 彎路, 希望大家能和我一樣能牢記程式設計大師的忠告: “對程式設計大師合适的東西未必對一個初 學者同樣合适”。

AVR c 語言優秀程式設計風格 1 檔案結構

子產品化的程式應該是有一個很好的程式結構的。AVR C 語言程式有兩種使用者檔案,.c 程式檔案,.h 頭檔案,程式中編寫過程中需要在.c 檔案中包含.h 頭檔案。初學者往往出現 重複包含或者頭檔案包含錯誤的問題, 我當時也時常為這種錯誤而發愁。 下面以電機驅動例 程來給大家說明一下,優秀的程式設計檔案結構。 成型的程式的檔案個數基本上都是偶數,因為每一個結構化的函數定義.c 檔案都會對 應一個.h 檔案。main.c 對應 config.h。我們來看看各檔案的包含關系。下面我們看看這些 檔案的包含關系與内容:[推薦的檔案包含順序與關系] 所有.c 檔案都包含了 config.h 檔案。如: #include "config.h" 在 config.h 中有如下代碼: #include "delay.h" #include "device_init.h" #include "motor.h" 這樣做就不容易出現錯誤的包含關系,為了預防萬一,我們還引入了宏定義與預編譯。 如下: #ifndef _UNIT_H__ #define _UNIT_H__ 1 //100us extern void Delay100us(uint8 n); //1s extern void Delay1s(uint16 n); // n <= 6 ,when n==7, it is 1. //1ms extern void Delay1ms(uint16 n); #endif 第一次包含本檔案的時候正确編譯,并且#define _UNIT_H__ 1,第二次包含本檔案 #ifndef _UNIT_H__就不再成立,跳過檔案。 預編譯還有更多的用途,比如可以根據不同的值編譯不同的語句,如下: //#pragma REGPARMS #if CPU_TYPE == M128 #include  #endif #if CPU_TYPE == M64 #include

#endif #if CPU_TYPE == M32 #include  #endif #if CPU_TYPE == M16 #include  #endif #if CPU_TYPE == M8 #include  #endif #include<filename> 與 #include "filename" 的差別 :前者是包含系統目錄 include 下 的檔案,後者是包含程式目錄下的檔案。

2.變量名與函數名

變量以及函數命名應該按照盡量短,按需長,具有實際意義。可以通過下劃線或者大小 寫結合的方法組合動詞和名詞組成變量函數名。下面對比好的命名方法與不好的命名方法: 好的: Delay100us(); 不好的: Yanshi(); 好的: init_devices(); 不好的: Chengxuchushihua(); 好的: int temp; 不好的: int dd;

3.外部調用

首先在子產品化程式的.h 檔案中定義 extern //端口初始化 extern void port_init(void); //T2 初始化 void timer2_init(void); //各種參數初始化 extern void init_devices(void);子產品化程式的.c 檔案中定義函數,不要在子產品化的程 序中調用程式,及不要出現向 timer2_init();這樣函數的使用,因為你以後不知道你到底 什麼地方調用了函數, 導緻程式調試難度增加。 可以在定義函數的過程中調用其他函數作為 函數體。 /**************************采用 timer2 産生波形***********************/ // PWM 頻率 = 系統時鐘頻率/(分頻系數*2*計數器上限值)) void timer2_init(void) { TCCR2 = 0x00; //stop TCNT2= 0x01; //set count OCR2 = 0x66; //set compare TCCR2 = (1<<WGM20)|(1<<WGM21)|(1<<COM21)|0x06; // start timer 快速 pwm 模式,匹 配清零,溢出置位 256 分頻 //占空比=高比低為:(OCR2-0X01)/(0XFF-OCR2) OX01++++++(OCR2)OXFF (+表示輸出高,_表示輸出低)    //即 OCR2 越大,輸出越大 } 在少數幾個檔案中調用函數,在 main.c 中調用大部分函數,在 interupts.c 中根據不 同的中斷調用服務函數。 void main(void)