计数器实验(Proteus 与Keil uVision联合仿真)

一、参数设置

实验要求: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的中断标志,通知主程序发生了中断
}

五 实验结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值