基于proteus的51单片机仿真实例五十八、定时器/计数器T1的定时实例
1、本例使用定时器1的定时中断控制2个LED实现不同的闪烁频率。
2、实现方法:通过给定时器T1设置适当的初值,实现50MS的定时中断,由于要控制两个LED以不同的频率闪烁,因而需要设置两个变量来分别计算中断次数。
3、在keil c51中新建工程ex46,编写如下程序代码,编译并生成ex46.hex文件
#include <reg51.h> //包含头文件
sbit LED1=P1^0; //端口位定义
sbit LED2=P1^1;
sbit LED2=P1^1;
unsigned char counter1,counter2; //定义全局变量,用以存储定时器的中断溢出次数
//主函数
void main(void)
{
EA = 1; //开总中断
ET1 = 1; //定时器T1中断允许
TMOD = 0x10; // 设置定时器的工作方式
TH0 = (65536-46083)/256; //定时器赋初值
TL0 = (65536-46083)%256;
TR1 = 1; //开启定时器
LED1 = 1; //关闭LED
LED2 = 1;
counter1 = 0; //中断次数初值为0
counter2 = 0;
void main(void)
{
EA = 1; //开总中断
ET1 = 1; //定时器T1中断允许
TMOD = 0x10; // 设置定时器的工作方式
TH0 = (65536-46083)/256; //定时器赋初值
TL0 = (65536-46083)%256;
TR1 = 1; //开启定时器
LED1 = 1; //关闭LED
LED2 = 1;
counter1 = 0; //中断次数初值为0
counter2 = 0;
while(1)
{
}
}
{
}
}
//定时器1的定时中断服务函数,定时时长50ms
void Time1(void) interrupt 3 using 0
{
counter1++; //中断次数加1
counter2++;
if(counter1 == 2) //如果记满2次。也即计时够100ms
{
LED1 = ~LED1; //,LED1端口取反
counter1 = 0; //计数值1清0
}
void Time1(void) interrupt 3 using 0
{
counter1++; //中断次数加1
counter2++;
if(counter1 == 2) //如果记满2次。也即计时够100ms
{
LED1 = ~LED1; //,LED1端口取反
counter1 = 0; //计数值1清0
}
if(counter2 == 8) //如果记满2次。也即计时够400ms
{
LED2 = ~LED2; // LED2端口取反
counter2 = 0; //计数值2清0
}
{
LED2 = ~LED2; // LED2端口取反
counter2 = 0; //计数值2清0
}
TH0 = (65536-46083)/256; //定时器重新赋初值
TL0 = (65536-46083)%256;
}
TL0 = (65536-46083)%256;
}
4、在proteus中新建仿真文件ex46.dsn,电路原理图如下所示:
5、将ex46.hex文件载入at89c51中,启动仿真,按动按键,观察程序运行结果,下图是某一时刻程序运行结果