強制類型轉換
a = 0x0000; b = 0xaa55;(uint16)
a = (uint8)(b);
a = 0x55;
a = 0x00; b = 0x10;
a = (bit)(表達式);
中斷響應條件
一、中斷源有中斷請求;
二、此中斷源的中斷允許位為1;
三、CPU開中斷(即EA=1);
以上三個條件同時滿足時,CPU才有可能響應中斷。
EA =1;開總中斷
EX0=1;開外部中斷0 都是IE寄存器
觸發方式 電平與跳變沿
IT0 = 0; 跳邊沿觸發由于單片機上電所有寄存器就是0 可以不用設置
電平觸發方式不好,會始終不走了停在中斷當中,所以應該采用跳變沿方式
IT1 =1;跳變沿方式 或TCON =0X01 就是IT0 =1;
中斷處理函數原型(中斷服務程序原型) 記住中斷函數不需要聲明
void timer1() interrupt 0 using 0
timer1() 函數名
interrupt 表示是中斷處理函數
0 表示是第幾個中斷源的處理函數
using 0 表示是使用第幾組工作寄存器一般在C語言里面編譯器屏蔽了會自動分配程序員一般不用關心。
注意:如果在中斷處理函數中進行處理數據不能處理的數據量太大,因為定時器時間已到它就會又進入下一個中斷處理函數,也就是這個中斷處理函數還沒有處理完下一個中斷又來了。這樣會造成結果錯誤或異常。
定時器:
定時器內部是有2個8位的寄存器控制,里面裝一些數沒來一個機器周期這個數自動加1或減1(大部分是加1 STC就是加1因為好做)到2個字節加滿減滿為止它會觸發一次中斷進入中斷函數。定時器的實質是加1計數器(16位),由高8位和低8位兩個寄存器組成。一個是TMOD 用于選擇定時器、計數器 T0,T1的工作模式和工作方式。另一個是TCON 用于控制TO,T1的啟動和停止,同時包含了T0,T1的狀態,這2個寄存器在單片機復位時候所有位都被清0.
TMOD 是不能位尋址的,因為它的地址是89H不能被8整除。只能賦值或者 進行 與 或 運算進行賦值 ,其中有位是C/T 是把它配置成定時器還是計數器 0 表示是定時器 M0,M1 這2位進行是定時器的模式幾共4種模式其中方式1為16 高8位 TH0,低8位在 TL0 (65536-50000)/256 這就是高8位 (65536-50000)%6 放入低8位 是大約50毫秒 前提是晶振為12兆赫。凡是用11.0592 的晶振是因為單片機要進行 串口通訊因為實現標準的波特率 4800 2400 115200 好計算。才選用11.0592的晶振。單片機的晶振可以選12兆一下的晶振都可以。12兆算是最快的速度了。當然不排除其他高速的單片級,可能達到更高運算速度。定時器最高一次定時為65535的數字,也就是大概65毫秒,因為是16位 高8位低8位。所以如果用定時器長時間定時可以 設置多次定時然后在main里面判斷。實現長時間定時。定時器是一個加1的寄存器。初值最小為0 。最大65535 ,單片機做延時不占用MCU的資源比用 while 或 for循環好,能提高效率,當時浪費一個I/O口,所以用時綜合考慮。
在一般情況下都是定時器與中斷一起使用的,如:定時器時間到發生中斷,一般都是IE TMOD TCON 三個寄存器聯合使用 TCON 控制TR0 TR1 運行與停止 TMOD 控制工作模式 IE 控制總中斷 與 對應的那個中斷的開關如 IE =1 ET0 =1 .
最重要的是定時器的啟動與停止 直接控制 TR0 TR1這2位 置1 置0就可以了。
也就是是說中斷里可以 把它置為0 置為1 ,或者有初值自加的也清0.
還有就是全局變量名與局部變量名不能相同如果相同,局部變量會改變全局變量的值。到時候結果不是期望值。
在C語言的庫函數中,floor函數的語法如下:
#include
double floor( double arg );
功能: 函數返回參數不大于arg的最大整數。例如,
x = 6.04;
y = floor( x );
y的值為6.0.
與floor函數對應的是ceil函數,即上取整函數。
有趣的是,floor在英文中是地板的意思,而ceil是天花板的意思,很形象地描述了下取整和上取整的數學運算。
說明:如果任一參數為非數值參數,則 FLOOR 將返回錯誤值 #VALUE!或#NAME?。
如果 number 和 significance 符號相反,則函數 FLOOR 將返回錯誤值 #NUM!。
不論 number 的正負號如何,舍入時參數的絕對值都將減小。如果 number 恰好是 significance 的倍數,則無需進行任何舍入處理。
以上為51單片機個人總結希望懂單片機的愛好者能夠指出錯誤以及建議。