一、参数设置
实验要求:T1采用计数模式,方式1中断,计数输入引脚T1(P3.5)上外接按钮开关,作为计数信号输入。按4次按钮开关后,P1口的8只LED闪烁不停。
(1)设置TMOD寄存器
T1工作在方式1,应使TMOD的M1、M0=01;设置C/T*=1,为计数器模式;对T0运行控制仅由TR0来控制,应使GATE0=0。定时器T0不使用,各相关位均设为0。所以,TMOD寄存器应初始化为0x50。
(2)计算定时器T1的计数初值
由于每按1次按钮开关,计数1次,按4次后,P1口的8只LED闪烁不停。因此计数器初值为65 536−4=65 532,将其转换成十六进制后为0xfffc,所以,TH0=0xff,TL0=0xfc。
(3)设置IE寄存器
本例由于采用T1中断,因此需将IE寄存器的EA、ET1位置1。
(4)启动和停止定时器T1
将寄存器TCON中TR1=1,则启动T1计数;TR1=0,则停止T1计数。
二、分析计数器中断触发的条件。
在main函数中,通过设置EA = 1和ET1 = 1,打开了全局中断允许和定时器1的中断允许。这意味着当定时器1溢出时,如果TF1被置位,单片机会响应这个中断请求,跳转到中断服务函数执行。
三、设计硬件电路原理图,画出实际接线图。
四、根据实验任务设计出相应的程序。
#include <reg51.h>
char T1_IntF=0;
void Delay(unsigned int i)
{
unsigned int j; // 定义一个无符号整数变量j,用于延时循环
for(;i>0;i--) // 外层循环,直到i减到0为止
for(j=0;j<125;j++) // 内层循环,重复125次空操作,形成延时
{;} // 空操作,仅用于消耗CPU周期,实现延时效果
}
void main( )
{
TMOD=0x50; // 设置定时器1的工作方式为模式1(8位自动重装载),定时器0未使用
TH1=0xff; // 设置定时器1的高8位初值
TL1=0xfc; // 设置定时器1的低8位初值,这两个值共同决定了定时器1的溢出时间
EA=1; // 打开全局中断允许位,允许所有中断
ET1=1; // 允许定时器1的中断
TR1=1; // 启动定时器1
while(1) // 进入无限循环
{
if(T1_IntF) // 检查定时器1的中断标志是否被设置
{
T1_IntF=0; // 清除中断标志
while(1)
{
P1=0xff; // 设置P1端口的所有引脚为高电平(假设为输出模式)
Delay(500); // 延时一段时间,这里假设是500个单位时间
P1=0; // 设置P1端口的所有引脚为低电平
Delay(500); // 再次延时一段时间
P1=0xff; // 再次设置P1端口的所有引脚为高电平
}
}
}
}
// 定时器1的中断服务函数,当定时器1溢出时,CPU会跳转到这个函数执行
void T1_int(void) interrupt 3
{
TH1=0xff; // 重新设置定时器1的高8位初值
TL1=0xfc; // 重新设置定时器1的低8位初值
T1_IntF=1; // 设置定时器1的中断标志,通知主程序发生了中断
}