上個世紀90年代,對於信息類的學生來說,C語言最難學?

上個世紀90年代,對於信息類的學生來說,C語言最難學?

為什麼?

答案一:因為它是“機器語言”,非人類交流的語言,邏輯不通、語言不通,人機交流,談何容易?。

答案二:學習“機器語言”太“費力”,費財力、費人力。學習C語言勞心傷神還在其次,關鍵是“僧多肉少”,唯一的機房,每次上機不超過30人,所以無論春夏秋冬,人氣最高的就是計算機系的機房。

上個世紀90年代,對於信息類的學生來說,C語言最難學?

下面分享一個用C語言寫精確地延時程序:

假設一個延時函數如下:

void delay()

{

uint i;

for(i=0;i<20000;i++);

}

我們怎麼來算呢,先將20000轉成16進制,得到4E20,然後將高字節4E乘以6得到468D,再將468+2=470,然後將470D*20HEX(即32D)=15040;

所心這個延時函數總共要執行15040個週期,假設所用的晶振為12MHZ,則該段函數總延時:15.04ms。

有了這個公式我們如果想要設定指定的延時長度就可以用它的己知公式確定。即:總時間=[(6*i值的高8位)+2]*i的低8位。

例如:設要延時125ms。

我們將低字節先賦值200D*(即:C8);

然後再算高低節的定值,由式中可知125ms=200*((i值的高字節*6)+2);

又可推算出(高低節*6)+2的總延遲時間應等於625us;

將625/6=104.1666,取整數得到104;

將104轉成16進製得到68H;

再將高字節和低字節組合起來即得到了定值,即:68C8HEX,代入函數即如下:

void delay()

{

uint i;

for(i=0;i<0x68C8;i++);

}

如果寫直進行就要將68C8轉成10進制,即:26824,代入後得到:

void delay()

{

uint i;

for(i=0;i<0x26824;i++);

在c語言中嵌入一段彙編的延時程序呀,你自己看看書,很簡單的。

用在單片機裡的可以C和彙編混合使用,因為用匯編編寫延時要準確些,所以你不妨寫一個彙編程序,然後再調用它好了,要用C來編精確的延時確實是比較難的哦。

誰說C語言不能精確延時,用51單片機的定時/計數器一或者用定時/計數器2的工作方式2,自動再裝入8位計數器,就可以精確延時,別說1MS了就是100um也能精確做到。

其實很簡單,採用定時器,將需要定時時間算好後寫入單片機中斷程序中即可,這種方法可以實現精確定時,最終的誤差僅由晶振來確定了。

不錯,用定時器最準確。但是定時器數量有限,有時候不見得能夠用!

比如溫度檢測(尤其是變化比較大、快的),一個定時器就得一直不停檢測。這個時候如果另外一個定時器有正好分配的其他任務,就只有用其他方法延時了。

空循環就行了,如while(i--);根據i的不同決定了延時長短,不過C的延時不是非常準確,你得根據反彙編,看彙編語句的數量和指令週期來計算時間,也可以是:

void mDelay(unsigned int Delay) //Delay = 1000 時間為1S

{

unsigned int i;

for(;Delay>0;Delay--)

{

for(i=0;i<124;i++)

{;}

}

}

寫到最後:

C語言博大精深,豐富多彩,用得好能很好的發揮它的作用,同時學習好的編程方法養成良好的編程習慣對於一名設計人員來說也是極其的重要。

我做C語言編程幾年的時間,如果大家對於學習C語言的學習方法,學習路線還有以後發展問題有任何疑問,都可以隨時來諮詢我,關注我的頭條號,私信給我【學習C語言】我會發你係統學習資料以及交流學習的地址。


分享到:


相關文章: