定时器中断控制LED
#include <REGX52.H> #include <INTRINS.H> typedef unsigned int u16; // 对系统默认数据类型进行重定义 // 定义LED1管脚 sbit LED1 = P2 ^ 0; /* 定时器中断模式1初始化 1ms 触发 t:0 定时器0,1 定时器1 */ void timeInterruptModeOneInit(bit t) { // 选择为定时器0模式,工作方式1 |为或运算符 等同于 0x00000000 | 0x00000001 if(t==0){ TMOD |= 0X01; ET0 = 1; // 打开定时器0中断允许 TR0 = 1; // 打开定时器 }else{ TMOD |= 0X10; ET1 = 1; // 打开定时器1中断允许 TR1 = 1; // 打开定时器 } // TH0 高8位 TL0 低8位 // 0xFC=1111 1100, 给定时器赋初值,定时1ms 12HMZ的晶振一个机器周期为12*(1/12)us, // 1ms=1000us,则1111 1111=65535,初始值65535-1000+1=64536=0xFC18=1111 1100 0001 1000 经过1000个计数则触发中断 TH0 = 0XFC; TL0 = 0X18; EA=1;//打开总中断 } void main() { timeInterruptModeOneInit(0); // 定时器0中断配置 while (1) { } } void time0() interrupt 1 // 定时器0中断函数 { static u16 i; // 定义静态变量i TH0 = 0XFC; // 给定时器赋初值,定时1ms TL0 = 0X18; i++; if (i == 1000) { i = 0; LED1 = !LED1; } }
鲸之声为您拼命加载中...