基于proteus的51单片机仿真实例五十八、定时器/计数器T1的定时实例

时间:2024-04-08 20:31:57
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;
 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;
 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
 }
 if(counter2 == 8)   //如果记满2次。也即计时够400ms
 {
   LED2 = ~LED2;     // LED2端口取反
  counter2 = 0;     //计数值2清0
 }
 TH0 = (65536-46083)/256;    //定时器重新赋初值
 TL0 = (65536-46083)%256;
 }
 
4、在proteus中新建仿真文件ex46.dsn,电路原理图如下所示:
基于proteus的51单片机仿真实例五十八、定时器/计数器T1的定时实例
 
5、将ex46.hex文件载入at89c51中,启动仿真,按动按键,观察程序运行结果,下图是某一时刻程序运行结果
基于proteus的51单片机仿真实例五十八、定时器/计数器T1的定时实例