当前位置:文档之家› 定时-计数器编程实例

定时-计数器编程实例

#include "reg51.h" sbit P1_0=P1^0; unsigned char i; void main (void) { TMOD=0x01;
void TIMER0_ISR (void) interrupt 1
{ TH0=(65536-250)/256; TL0=(65536- 250)%256; i++; if(i < = 3) { P1_0=1; } if(I = = 4) { P1_0=0; i=0; }
定时/计数器编程实例
数码管显示实验 “实现数值0~65535的变化显 示” 问题:如何使数值变化的速 度减慢?(如每隔1秒数值 加1)
方法一? 方法二?
定时/计数器
void main(void) { unsigned char i,j; unsigned int uiTemp = 0; while(1) { convert(uiTemp); for(i=0;i<6;i++) { P2=LED_seg[i]; //送段码 P0=LED_bit[i]; //送位码 delay1ms(5); //5ms延迟 } j ++; if ( j == 33 ) //约1秒 { uiTemp++; j = 0; } } }
长定时的实现
思路:定时间隔为1秒,使用T0无法直接得到1秒 的定时。因此,需要使用多次定时复合的方法来得 到较长时间的定时。
方法二 仅使用一个定时/计数器实现
使用方法一时需要使用两个定时器和两个IO引脚,资源消 耗比较多。如何使用较少的资源实现同样的定时功能?
#include < reg51.h> void main( ) sbit WAVE = P1^7; { unsigned char glucCounter; WAVE = 0; void Timer0( ) interrupt 1 using 1 TMOD = 0x01; 100ms定时 { TH0 = (65536 – 50000) / 256; TH0 = (65536 – 50000) / 256; TL0 = (65536 – 50000) % 256; TL0 = (65536 – 50000) % 256; EA = 1; glucCounter ++ ; ET0 = 1; if ( glucCounter == 10 ) TR0 = 1; 定义一个全局 glucCounter = 0; { 变量,实现计 WAVE = ! WAVE; while(1) { ; } 数功能。 glucCounter = 0; } } }
TH0=(65536- 250)/256;
TL0=(65536- 250)%256; ET0=1; EA=1; TR0=1; i = 0; P1_0 = 1; while (1) { ; }
}
}
2-3、定时/计数器的应用实例
例3:设单片机fosc=6MHz,要求在P2.0引脚上输出周期为2ms,占空 比为75%的矩形波。在例2基础上应作何修改?
TH0=(65536- 250)/256;
TL0=(65536- 250)%256; ET0=1; EA=1; TR0=1; i = 0; P1_0 = 1; while (1) { ; }
}
}
2-3、定时/计数器的应用实例
例3:设单片机fosc=6MHz,要求在P2.0引脚上输出周期为2ms,占空 比为65%的矩形波。在例2基础上应作何修改?
2-3、定时/计数器的使用
例2:设晶振频率fosc=6MHz,要求在P2.0脚上输出周期为 2ms的方波。
解:采用定时器T0的方式1进行编程 思路:采用定时间隔1ms,每次时间到P2.0取反并且启动下一 次定时,从而实现2ms周期的方波。 定时所需计数次数n=1000us/2us=500 由于计数器递增计数,为得到500个计数之后的定时器溢出, 必须给定时器置初值65536-500。
2-3、定时/计数器的应用实例
例3:设单片机fosc=6MHz,要求在P2.0引脚上输出周期为 2ms,占空比为75%的矩形波。在例2基础上应作何修改?
P2.0
1ms 1ms
2ms,占空比50%
MCU
1.5ms
0.5ms
2ms,占空比75%
2-3、定时/计数器的应用实例
例3:设单片机fosc=6MHz,要求在P2.0引脚上输出周期为 2ms,占空比为75%的矩形波。在例2基础上应作何修改?
精度?
使用查询方式进行编程:
#include <reg51.h> sbit P2_0=P2^0; void main(void) { TMOD=0x01; //T0工作在定时器方式l TH0= (65536-500)/256; //计数初值 TL0=(65536-500)%256; TR0=1; //启动T0 while(1) { TH0= (65536-500)/256; //计数初值 TL0=(65536-500)%256; while (!TF0); 查询TF0是否为‘1’, P2_0 = ! P2_0; 如果为‘1’则说明溢 TF0 = 0; 出(定时时间到) } }
TH0=(65536- 50)/256;
TL0=(65536- 50)%256; ET0=1; EA=1; TR0=1; i = 0; P1_0 = 1; while (1) { ; }
}
}
2-3、定时/计数器的应用实例
例4:设晶振频率fosc=6MHz,要求在P2.0脚上输出周期为2s的 方波。(同例1)
#include "reg51.h" sbit P1_0=P1^0; unsigned char i; void main (void) { TMOD=0x01;
void TIMER0_ISR (void) interrupt 1
{ TH0=(65536-250)/256; TL0=(65536- 250)%256; i++; if(i = = 3) { P1_0=0; } if(I = = 4) { P1_0=1; i=0; }
P2.0
2ms
MCU
使用中断方式进行编程: #include <reg51.h> sbit P2_0=P2^0; void T0_ISR() interrupt 1 using 1 //T0中断服务程序入口 { TH0= (65536-500)/ 256; //计数初值重载 TL0=(65536-500)% 256; P2_0=!P2_0; //P2.0取反 } void main(void) { TMOD=0x01; //T0工作在定时器方式l TH0=(65536-500)/256; //计数初值 TL0=(65536-500)%256; ET0=1; EA=1; //中断使能 TR0=1; //启动T0 while(1); }
解:采用定时器T0的方式1进行编程

思路:采用定时间隔0.5ms,并设置一个全局变量i对定时器 的中断次数进行计数,小于等于3时输出高电平,等于4时输 出低电平,以此循环。
0.5ms i=1
0.5ms i=2
0.5ms i=3
0.5ms i=4
2ms,占空比75%
2-3、定时/计数器的应用实例
例3:设单片机fosc=6MHz,要求在P2.0引脚上输出周期为 2ms,占空比为75%的矩形波。在例2基础上应作何修改?
#include "reg51.h" sbit P1_0=P1^0; unsigned char i; void main (void) { TMOD=0x01;
void TIMER0_ISR (void) interrupt 1
{ TH0=(65536-50)/256; TL0=(65536- 50)%256; i++; if(i = = 7) { P1_0=0; } if(I = = 20) { P1_0=1; i=0; }
void main(void) { unsigned char i,j; gluiTemp = 0; TMOD = 0x01; TH0 = (65536 – 50000) / 256; TL0 = (65536 – 50000) % 256; ET0 = 1; EA = 1; TR0 = 1; while(1) { convert(gluiTemp); for(i=0;i<6;i++) { P2=LED_seg[i]; //送段码 P0=LED_bit[i]; //送位码 delay1ms(5); //5ms延迟 P0=0; } } }
gluiTemp ++ ;
}
例1:实现数值0~65535的变 化显示,每隔1s数值加1。 ( 设晶振频率为12MHz)
void main(void) { unsigned char i,j; gluiTemp = 0; glucCounter = 0; TMOD = 0x01; TH = (65536 – 50000) / 256; #include < reg51.h> TL = (65536 – 50000) % 256; unsigned char glucCounter ; ET0 = 1; unsigned int gluiTemp ; 定义一个全局 EA = 1; void Timer0( ) interrupt 1 using 1变量,实现计 TR0 = 1; while(1) 数功能。 { { TH0 = (65536 – 50000) / 256; convert(gluiTemp); TL0 = (65536 – 50000) % 256; for(i=0;i<6;i++) glucCounter ++ ; { P2=LED_seg[i]; //送段码 if ( glucCounter == 20 ) P0=LED_bit[i]; //送位码 { delay1ms(5); //5ms延迟 gluiTemp ++ ; P0=0; glucCounter = 0; } } } } }
相关主题