使用定時器實現LED每隔一秒閃爍

參考鏈接:https://zhidao.baidu.com/question/434042328102999604.html
和https://wenku.baidu.com/view/fe63fc0a6d175f0e7cd184254b35eefdc9d31558.html
1.使用定時器實現LED每隔一秒閃爍需要具備的知識:
瞭解中斷允許寄存器IE和定時器/計數器工作模式寄存器TMOD並且知道如何對定時器及中斷寄存器做初始化設置,瞭解機器週期並知道如何計算定時器的初值。
1)中斷允許寄存器IE
在這裏插入圖片描述
中斷允許寄存器ie結構——

中斷允許控制寄存器分爲兩層結構,第一級結構爲中斷允許總控制EA,只 有當EA處於中斷允許狀態,中斷源中斷請求才能夠得到允許;當EA處於不允許狀態時,無論IE寄存器中其他位處於什麼狀態,中斷源中斷請求都不會得到允許。

第二級結構爲5箇中斷允許控制位,分別對應5箇中斷源的中斷請求,當對應中斷允許控制位爲1時,中斷源中斷請求得到允許。

使用方法——

整體賦值:IE=0x81;(開啓全局中斷,打開外部中斷0)。

單獨賦值:EA=1;EX0=1;(開啓全局中斷,打開外部中斷0)。

2)定時器/計數器工作模式寄存器TMOD
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

3)機器週期
單片機的機器週期=12秒/晶振頻率,一個機器週期包含六個狀態週期(用S表示)。一個狀態週期有兩個節拍(用P1、P2表示)。8051系列單片機的一個機器週期同6 個S週期(狀態週期)組成。
也就是說一個機器週期=6個狀態週期=12個振盪週期(即時鐘週期(時鐘週期=振盪週期,等於單片機晶振頻率的倒數,如常見的外接12M晶振,那它的時鐘週期=1/12M。))。

4)計算定時器的初值
(1)可以按定時時間的計算公式, 計算出定時器的時間常數X:
定時時間T=(2的N次方-X)12/單片機晶振頻率
(2)N爲定時器的工作方式:
方式0時,N=13
方式1時,N=16
方式2時,N=8
(3)根據定時時間和工作方式,計算出時間常數X
把X轉換成二進制數,高8位送給TH1,低8位送給TL1,就可以啓動定時器開始定時了。
例如: 工作在方式1,定時時間爲1000微秒 晶振頻率=12MHZ
則 定時時間T=(2的16次方-X)12/12MHZ=1000 解出 X=64536=FC18H

2.以下是使用定時器實現LED每隔一秒閃爍的代碼:

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1=P1^0;
uchar num;
void main()
{
	TMOD=0x01; //設置定時器0位工作模式1(M1, M0位0,1)	
	TH0=(65536-45872)/256; //初值高位,先計算初值,使用11.0592M晶振,定時50ms數爲45872
	TL0=(65536-45872)%256;//初值低位
	EA=1; //開總中斷
	ET0=1; //開定時器0中斷
	TR0=1; //啓動定時器0
	while(1)
	{
	 	if(num==20) //如果到了20次,說明到了1秒時間
		{
		  LED1=~LED1; //讓發光管狀態取反,亮時轉滅,滅時轉亮
		  num=0; 
		}
	
	}
}
void T0_time()interrupt 1 
{ 
	TH0=(65536-45872)/256; //中斷之後重新裝載初值 
	TL0=(65536-45872)%256; 
	num++; 
}

之前看到TH0=(65536-45872)/256; 和TL0=(65536-45872)%256;時也有點懵逼,在這裏我就簡單地提一下吧。
這裏的“/”代表除法,運算結果是被除數除以除數得到的商的整數。
"%"表示“求於運算”,運算結果是被除數除以除數後的餘數。
256剛好是2的八次方。
/256表示被除數除以256後取整,得到的是被除數寫成16位二進制數的高八位。
%256表示被除數除以256後取餘數,得到的是被除數寫成16位二進制數的低八位。
TH0=(65536-45872)/256;將先求括號內的差,然後取這個差的高八位(通過除以2的八次方得到,除以一次2相當於右移一位)
TL0=(65536-45872)%256;將先求括號內的差,然後取這個差的低八位,即低字節放入TL0

以上就是使用定時器實現LED每隔一秒閃爍所涉及的知識要點和代碼啦,希望你可以有所收穫哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章