51单片机002:利用定时/计数器T0从P1^0输出周期为1s的方波,让发光二极管以1HZ闪烁,设晶振频率为12MHZ

        题目解析:

        让发光二极管以1HZ闪烁,周期为频率的倒数,也就是发光二极管以1s为周期闪烁。闪0.5s,灭0.5s。

        思路解析:

        1、选择一个发光二极管体现实验现象。

        2、要用到定时器,肯定要写定时器初始化函数中断服务函数,定时器初始化函数要配置相关寄存器和参数,定时器中断服务函数描述中断具体执行的任务。

        定时器初始化函数:
        主要配置寄存器有:TCON、TMOD、高八位寄存器(定时器0:TH0;定时器1:TH1)、低八位寄存器(定时器0:TL0;定时器1:TL1)
。TMOD不同的是TMOD寄存器不可位寻址,因此对TMOD的配置需要对这个8bit寄存器整体赋值。根据具体的情况对相应寄存器赋值即可,如选择定时器0模并选择工作方式1,TMOD寄存器就为0000 0001,所以对TMOD赋值为0x01。

     

  中断服务函数:

        1、如果TMOD工作模式未选择自动重装,则需要对TH0和TL0寄存器重新赋值。        

        2、进行计数变量的累加

        3、执行简单的中断任务

完整代码:

#include "reg52.h"

typedef unsigned int u16;	//对系统默认数据类型进行重定义
typedef unsigned char u8;

//定义LED1管脚
sbit LED1=P2^0;

void time0_init(void)
{
	TMOD|=0X01;               //选择为定时器0模式,工作方式1
	TH0=(65535-50000)/256;    //50ms定时20次
	TL0=(65535-50000)%256;
	ET0=1;                    //打开定时器0中断允许
	EA=1;                     //打开总中断
	TR0=1;                    //打开定时器		
}

void main()
{	
	time0_init();//定时器0中断配置

	while(1)
	{			
							
	}		
}

void time0() interrupt 1 //定时器0中断函数
{
	static u16 i;             //定义静态变量i
	TH0=(65535-50000)/256;    //50ms定时20次
	TL0=(65535-50000)%256;
	i++;
	if(i==10)
	{
		i=0;
		LED1=!LED1;	
	}						
}


 

posted @ 2023-11-09 22:09  Flying3080  Views(149)  Comments(0Edit  收藏  举报  来源