volatile unsigned int data TimerCounter=0;
/********************************************/ /* 定时器 0 中断服务 */ /* 说明: 100us 中断一次, 优先级最高 */ /********************************************/
void Timer0_Int(void) interrupt 1 using 1 //自动reload方式 { MCU_IR_PWM=~MCU_IR_PWM; TimerCounter++; //32bit int 65536*65536*0.1/1000/3600/24 = 4.971026962962963 天 //16bit int 65536*0.1/1000 = 6.5536000000000001 大约6.6s }
void delay1ms(void) { unsigned int data OldTimerCounter; OldTimerCounter = TimerCounter; while((TimerCounter-OldTimerCounter)<=10*1) // 28.9*1000/256 = 112.890625 { //如果调试,请把1换成不同到值,1是延时1ms,误差很小
} }
关键点: IP=0x02; //Timer0 is first level of interrupt /********************************************** IP(0B8H) 7 6 5 4 3 2 1 0 PT2 PS PT1 PX1 PT0 PX0 中断优先级控制位=1 定义为高优先级中断 中断优先级控制位=0 定义为低优先级中断 IP.6 PPC PCA中断优先级控制位 IP.5 PT2 定时器2 中断优先级控制位 IP.4 PS 串行口中断优先级控制位 IP.3 PT1 定时器1 中断优先级控制位 IP.2 PX1 外部中断1 中断优先级控制位 IP.1 PT0 定时器0 中断优先级控制位 IP.0 PX0 外部中断0 中断优先级控制位 ************************************************/ TMOD=0x22; //T0,T1 8 bit auto Reload /*********************************************** TMOD 地址:89H 不可位寻址 复位值:00H 7 6 5 4 3 2 1 0 GATE C/T M1 M0 GATE C/T M1 M0 定时器1 定时器0 位符号 功能 TMOD.7/ GATE TMOD.7 控制定时器1,置1 时只有在INT1 脚为高及TR1 控制位置1 时才可打开定时器/ 计数器1。 TMOD.3/ GATE TMOD.3 控制定时器0,置1 时只有在INT0 脚为高及TR0 控制位置1 时才可打开定时器/ 计数器0。 TMOD.6/ C/T TMOD.6 控制定时器1 用作定时器或计数器,清零则用作定时器(从内部系统时钟输入), 置1 用作计数器(从T1/P3.5 脚输入) TMOD.2/ C/T TMOD.2 控制定时器0 用作定时器或计数器,清零则用作定时器(从内部系统时钟输入),置1 用作计数器(从T0/P3.4 脚输入) TMOD.5/TMOD.4 M1、M0 定时器定时器/计数器1模式选择 0 0 13位定时器/ 计数器,兼容8048 定时器模式,TL1 只用低5 位参与分频,TH1 整个8 位全用。 0 1 16位定时器/ 计数器,TL1、TH1 全用 1 0 8 位自动重装载定时器,当溢出时将TH1 存放的值自动重装入TL1。 1 1 定时器/ 计数器1 此时无效(停止计数)。 TMOD.1/TMOD.0 M1、M0 定时器/ 计数器0 模式选择 0 0 13位定时器/ 计数器,兼容8048 定时器模式,TL0 只用低5 位参与分频,TH0 整个8 位全用。 0 1 16位定时器/ 计数器,TL0、TH0 全用 1 0 8位自动重装载定时器,当溢出时将TH0 存放的值自动重装入TL0。 1 1 定时器0 此时作为双8 位定时器/ 计数器。TL0 作为一个8 位定时器/ 计数器,通过标准定时器0 的控制位控制。TH0 仅作为一个8 位定时器,由定时器1 的控制位控制。
REN=1; //enable serial receive TH0=0; TL0=0; // 1S 中产生的溢出和中断的次数:28636000/256.0/12=9321.6145833333339 // 大约107us(107.27755273082832) 本程序不需要精确定时,差不多就行可以当作100us用 // if TH=256-239 则周期为:0.10015365274479675 TH0=256-243;//1000000/(29.08*1000*1000/256/12)=105.63961485557083 TL0=256-243;//1000000/(29.08*1000*1000/243/12)=100.27510316368638 // TH0=256-256; //28.9*1000/256/2 =56.4453125 // TL0=256-256; TR0=1; TR1=1; //TCON=0x50;//0B01010000; //Timer1 enable Timer0 enable,No external INT ET0=1; //enable Timer0 interupt // ET1=1; //enable Timer1 interupt ES=1; //enable serial interupt EA=1; //enable interupt
|