51单片机的定时器深入讲解
生活随笔
收集整理的這篇文章主要介紹了
51单片机的定时器深入讲解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
單片機的定時器是作為片外資源,開啟定時器需要設置相關的寄存器,當然,這些寄存器是可以位尋址的,怎么位尋址?在頭文件中reg52.h中已經預定義好了。不用擔心,你只需要學會設置就好了:
TMOD=0X01; ? ?//定時器0工作在方式1(16位計數器)
TH0=0xfe;
TL0=0x33;
EA=1;
ET0=1;
TR0=1;
以上6條語句,已經將定時器設置好了,現在協議個led的項目來時間一下:
#include
#define uint unsigned int
#define uchar unsigned char
uint count=0;?
sbit led=P1^0;
?
int main()
{TMOD=0X01; ? ?//定時器0工作在方式1(16位計數器)
TH0=0xfe; ? ?//賦初值
//TH0=(65536-5000)/256; ? //假設賦初值為60536,從60536開始,每隔1微秒,計數器加1,(高8位),計滿為 ? ? ? ? ? ? ?5000微秒(5ms),之后產生中斷
TL0=0x33;
TH0=(65536-5000)%6; ? //賦初值為60536,從60536開始,每隔1微秒,計數器加1,(低8位)
EA=1; ? ? //開總中斷
ET0=1; ? ?//開T0中斷
TR0=1; ? ?//啟動T0開始計數
while(1)//大循環,循環執行里面的程序
{
if(count==20)//判斷:如果定時20*0.5=10ms,10ms亮滅一次led
{
count=0; ?//重新賦成0
led=~led; //led狀態取反一次
}
}
void timer0() interrupt 1 ?//中斷函數
{
TH0=0xfe; ? ?//,重新賦值
//TH0=(65536-5000)/256; ? //賦初值為60536,從60536開始,每隔1微秒,計數器加1,(高8位)
TL0=0x33;
TH0=(65536-5000)%6; ? //賦初值為60536,從60536開始,每隔1微秒,計數器加1,(低8位)
count++;//0.5ms的次數加1
}
注意:這里使用到了中斷,有時無需使用到中斷:
#include
#define uint unsigned int#define uchar unsigned char
uint count=0; ? ? //5000微秒的次數,用于在中斷中加1,count有多少,定時count*5ms
sbit led=P1^0;
?
int main()
{TMOD=0X01; ? ?//定時器0工作在方式1(16位計數器)
TH0=0xfe; ? ?//賦初值
//TH0=(65536-5000)/256; ? //假設賦初值為60536,從60536開始,每隔1微秒,計數器加1,(高8位),計滿為 ? ? ? ? ? ? ?5000微秒(5ms),之后產生中斷
TL0=0x33;
TH0=(65536-5000)%6; ? //賦初值為60536,從60536開始,每隔1微秒,計數器加1,(低8位)
EA=1; ? ? //開總中斷
ET0=1; ? ?//開T0中斷
TR0=1; ? ?//啟動T0開始計數
while(1)//大循環,循環執行里面的程序
{
????????? if(TF0==1)//每次產生中斷的時候,TFx(0或1)都會置位
????????? ?{
?????????????????TF0=0;
? ? ? ? ? ? ? ? ?count++;
? ? ? ? ? ?}
? ? ? ? ? if(count==20)//判斷:如果定時20*0.5=10ms,10ms亮滅一次led
{count=0; ?//重新賦成0
led=~led; //led狀態取反一次
}
}
轉載于:https://www.cnblogs.com/ifreewolf/p/9346697.html
總結
以上是生活随笔為你收集整理的51单片机的定时器深入讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Arm v8 中断处理
- 下一篇: 关于正则表达式的那些个爱恨情仇