配色: 字号:
定时器控制单只LED闪烁
2012-12-11 | 阅:  转:  |  分享 
  
//-----------------------------------------------------------------

//名称:定时器控制单只LED闪烁

//网站:www.taobai.cc

//说明:LED在定时器中断例程下控制不断闪烁

//-----------------------------------------------------------------

//=================================================================

//声明区

//=================================================================

#include //定义8051寄存器的头文件

//宏定义

#defineucharunsignedchar //定义无符号字符型(0——255)

#defineuintunsignedint //定义无符号整型(0——65535)

//位定义

sbitLED=P0^0; //声明LED为P1.0端口



ucharT_Count=0; //声明全局变量T_Count,范围:0——255



//-------------------------------------------------------------------

//主程序

//-------------------------------------------------------------------

voidmain() //主程序开始

{

TMOD=0X00; //定时器/计数器方式寄存器TMOD,定时器T0,工作于模式0

//方式:Mode0,位数:13位,计数范围:0——8191

TH0=(8192-5000)/32; //5ms定时高4位

TL0=(8192-5000)%32; //低4位

IE=0X82; //中断使能寄存器IE,相当于EA=1;ET0=1;

TR0=1; //定时器/计数器控制寄存器TCON,Timer0的启动开关

while(1); //无穷循环

} //主程序结束



//-------------------------------------------------------------

//T0中断函数

//--------------------------------------------------------------

voidLED_Flash()interrupt1

{ //中断子程序开始

uchary; //声明无符号字符型变量y

TH0=(8192-5000)/32; //5ms

TL0=(8192-5000)%32;

//由于在13位模式下,最大定时不到9ms,因此仅使定时寄存器无法实现更长的定时设置

//所以添加累加全局变量T_Count

// if(++T_Count==100) //5ms100=500ms,实现0.5s定时开关LED

// { //T_count先加后判断

// LED=!LED; //LED闪烁

//T_Count=0; //使if语句中的T_count从零开始

// }



if(++y==100)

{

LED=!LED; //!的名称或含义:逻辑非,优先级:2,结合方向:右到左

y=0;

}

} //中断子程序结束



//对于模式0、1、3,如果希望定时器能按设定的某固定时间间隔不断触发,

//还需要在定时器中断例程内再次设置定时寄存器初值(TH0/TL0或TH1/TL1),

//对于模式2则不需要,因为该模式下定时寄存器低字节(TL0或TL1)独平完

//成计数工作,定时寄存器高字节(TH0或TH1)的值会自动重新赋给低字节,

//高字节的值在整个过程中保持不变。

//使用定时器主要有两种方法:

//1.使用定时中断技术,计时溢出时触发中断,预先设计的中断子程序将被自动调用

//2.使用查询检查是否出现计时溢出,溢出时执行指定代码

//上述方法中使用得较多的是第一种

//本例使用的是定时中断技术,该技术需要完成以下几项工作:

//1.设置定时器工作模式(设置TMOD)

//2.设置定时器初值(设置TH0/TL1或TH1/TL1)

//3.允许定时器中断(设置IE,或单独设置EA,ET0/ET1)

//4.启动定时器(设置TCON或单独设置TR0/TR1)



献花(0)
+1
(本文系图购网首藏)