專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

單片機(jī)開發(fā)中斷及一些理解

作者:佚名   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2014年04月19日   【字體:

強(qiáng)制類型轉(zhuǎn)換

a = 0x0000; b = 0xaa55;(uint16)

a = (uint8)(b);

a = 0x55;

 

a = 0x00; b = 0x10;

a = (bit)(表達(dá)式);

中斷響應(yīng)條件

一、中斷源有中斷請求;

二、此中斷源的中斷允許位為1;

三、CPU開中斷(即EA=1);

以上三個條件同時滿足時,CPU才有可能響應(yīng)中斷。

EA =1;開總中斷

EX0=1;開外部中斷0   都是IE寄存器

觸發(fā)方式 電平與跳變沿

IT0 = 0; 跳邊沿觸發(fā)由于單片機(jī)上電所有寄存器就是0 可以不用設(shè)置

電平觸發(fā)方式不好,會始終不走了停在中斷當(dāng)中,所以應(yīng)該采用跳變沿方式

IT1 =1;跳變沿方式  或TCON =0X01 就是IT0 =1;

 

 

中斷處理函數(shù)原型(中斷服務(wù)程序原型)    記住中斷函數(shù)不需要聲明

 void    timer1()  interrupt    using 0 

timer1()  函數(shù)名  

interrupt  表示是中斷處理函數(shù)

表示是第幾個中斷源的處理函數(shù) 

using  表示是使用第幾組工作寄存器一般在C語言里面編譯器屏蔽了會自動分配程序員一般不用關(guān)心。

 

注意:如果在中斷處理函數(shù)中進(jìn)行處理數(shù)據(jù)不能處理的數(shù)據(jù)量太大,因為定時器時間已到它就會又進(jìn)入下一個中斷處理函數(shù),也就是這個中斷處理函數(shù)還沒有處理完下一個中斷又來了。這樣會造成結(jié)果錯誤或異常。

 

定時器:

    定時器內(nèi)部是有2個8位的寄存器控制,里面裝一些數(shù)沒來一個機(jī)器周期這個數(shù)自動加1或減1(大部分是加1 STC就是加1因為好做)到2個字節(jié)加滿減滿為止它會觸發(fā)一次中斷進(jìn)入中斷函數(shù)。定時器的實質(zhì)是加1計數(shù)器(16位),由高8位和低8位兩個寄存器組成。一個是TMOD  用于選擇定時器、計數(shù)器 T0,T1的工作模式和工作方式。另一個是TCON 用于控制TO,T1的啟動和停止,同時包含了T0,T1的狀態(tài),這2個寄存器在單片機(jī)復(fù)位時候所有位都被清0.

TMOD 是不能位尋址的,因為它的地址是89H不能被8整除。只能賦值或者  進(jìn)行  與  或 運(yùn)算進(jìn)行賦值 ,其中有位是C/T 是把它配置成定時器還是計數(shù)器 0 表示是定時器 M0,M1 這2位進(jìn)行是定時器的模式幾共4種模式其中方式1為16  高8位  TH0,低8位在 TL0   (65536-50000)/256  這就是高8位   (65536-50000)%6 放入低8位  是大約50毫秒  前提是晶振為12兆赫。凡是用11.0592 的晶振是因為單片機(jī)要進(jìn)行 串口通訊因為實現(xiàn)標(biāo)準(zhǔn)的波特率  4800  2400  115200 好計算。才選用11.0592的晶振。單片機(jī)的晶振可以選12兆一下的晶振都可以。12兆算是最快的速度了。當(dāng)然不排除其他高速的單片級,可能達(dá)到更高運(yùn)算速度。定時器最高一次定時為65535的數(shù)字,也就是大概65毫秒,因為是16位  高8位低8位。所以如果用定時器長時間定時可以  設(shè)置多次定時然后在main里面判斷。實現(xiàn)長時間定時。定時器是一個加1的寄存器。初值最小為0 。最大65535 ,單片機(jī)做延時不占用MCU的資源比用 while  或 for循環(huán)好,能提高效率,當(dāng)時浪費(fèi)一個I/O口,所以用時綜合考慮。

     在一般情況下都是定時器與中斷一起使用的,如:定時器時間到發(fā)生中斷,一般都是IE  TMOD TCON 三個寄存器聯(lián)合使用 TCON 控制TR0 TR1 運(yùn)行與停止  TMOD 控制工作模式   IE 控制總中斷 與 對應(yīng)的那個中斷的開關(guān)如 IE =1  ET0 =1 .

 

最重要的是定時器的啟動與停止 直接控制 TR0 TR1這2位 置1 置0就可以了。

也就是是說中斷里可以  把它置為0   置為1   ,或者有初值自加的也清0.

還有就是全局變量名與局部變量名不能相同如果相同,局部變量會改變?nèi)肿兞康闹怠5綍r候結(jié)果不是期望值。 

 

在C語言的庫函數(shù)中,floor函數(shù)的語法如下:
#include
double floor( double arg );
功能: 函數(shù)返回參數(shù)不大于arg的最大整數(shù)。例如,
x = 6.04;
y = floor( x );
y的值為6.0.
與floor函數(shù)對應(yīng)的是ceil函數(shù),即上取整函數(shù)。
有趣的是,floor在英文中是地板的意思,而ceil是天花板的意思,很形象地描述了下取整和上取整的數(shù)學(xué)運(yùn)算。
說明:如果任一參數(shù)為非數(shù)值參數(shù),則 FLOOR 將返回錯誤值 #VALUE!或#NAME?。
如果 number 和 significance 符號相反,則函數(shù) FLOOR 將返回錯誤值 #NUM!。
不論 number 的正負(fù)號如何,舍入時參數(shù)的絕對值都將減小。如果 number 恰好是 significance 的倍數(shù),則無需進(jìn)行任何舍入處理。

以上為51單片機(jī)個人總結(jié)希望懂單片機(jī)的愛好者能夠指出錯誤以及建議。

關(guān)閉窗口

相關(guān)文章