单片机定时报警C语言程序,51单片机 定时器 中断程序 (C语言)
EA ????是 中斷總開關, 不管是定時器,串口還是外部中斷,都需要打開 EA 才能觸發中斷;
ET0???是 定時器0 的專用中斷開關, 也就是說: 打開了EA.而不打開ET0,定時器0是無法觸發中斷的;
TR0???是 啟動定時器開始定時計數 的開關,如果打開 EA 和 ET0, 就代表允許定時器 0 觸發中斷, 但是定時器0 何時開始觸發,由 TR0 來啟動和停止.
51 單片機 12 分頻,
一個 機器周期 = 12/nHz?? //(n指 晶振頻率)
如要定時的時間為 M
初值? = M / 機器周期;
TH0 = (65536 - 初值) % 256;?// 高 8 位;
TL0 = (65536 - 初值) / 256;? ?// 低 8 位;
案例:
12M 晶振 做 1ms 定時計算
1. 機器周期: = 12 /(12*10^6)=1us(微秒)
2. 定時初值:(1*10^-3)/(1*10^-6) = 1ms/1us = 1000; (倍率)
將 高 位 與 低位 進行分離;轉化成 16進制 數據;
3. TH0 = (65536 - 1000) % 256 = 64536 % 256 (10 進制數) --> 0xFC
3. TL0 = (65536 - 1000) / 256 = 64536 / 256 (10 進制數) --> 0x18
每次內部 自加 1bit 時,耗費 1us; 所以,要累加 1000 次,形成 1ms 中斷溢出;
//定時器 初始化函數
void Init_Timer()
{
count = 0;????????????????????????????????// 用于 中斷后 計數,判斷;
TMOD = 0x01; ???????????????????????????//T0 工作方式 1;16位 計數器;
TH0=(65536-50000)/256;? ????????// 初值高 8 位 走 1000 次,每次 1us :晶振 12MHz;
TL0=(65536-50000)%256;?????????// 初值低 8 位 走 1000 次,每次 1us :晶振 12MHz;
TR0? = 1;??????????????????????????????????// 開啟 T0 定時器;
ET0? = 1;??????????????????????????????????// 允許 T0 定時器中斷;
EA?? = 1; ????????????????????????????????// 開啟 總中斷 允許;
}
// 中斷函數;
void Timer0(void) interrupt 1 using 1
{
TH0 = (65536-50000)/256;?? ?// 中斷后,賦初值;
TL0 = (65536-50000)%256;
count++;? ?????// 每次中斷,計數 累加 1;
if(count >=某個值時)
{
count = 0; //?計數值 清0 ;
// 控制體;
}
}
總結
以上是生活随笔為你收集整理的单片机定时报警C语言程序,51单片机 定时器 中断程序 (C语言)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kafka linux客户端,kafka
- 下一篇: c语言周传生教材答案,C语言程序设计与实