|
定时器控制单只LED闪烁 |
|
|
//-----------------------------------------------------------------
//名称:定时器控制单只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)
|
|
|
|
|
|
|
|
|
|
|