【51单片机STC89C52】定时器(中断)控制LED

目录

         一、定时器/计数器T0

        1、定时器/计数器的相关寄存器

        2、定时器/计数器控制寄存器TCON

        3、定时器/计数器工作模式寄存器TMOD

二、配置相关寄存器

        1、使用STC-ISP工具

        2、配置寄存器

        设置定时器模式(16位定时器)

        设置定时器初值

        清除TF0标志

        定时器0开始计时

三、定时器控制LED

        四、定时器中断方式控制

        1、中断寄存器

         ​2、定时器中断控制LED


一、定时器/计数器T0

1、定时器/计数器的相关寄存器

2、定时器/计数器控制寄存器TCON

TCON格式如下:

3、定时器/计数器工作模式寄存器TMOD

模式选择:

 

二、配置相关寄存器

1、使用STC-ISP工具

 2、配置寄存器

设置定时器模式(16位定时器)

配寄存器推荐使用按位操作:

需要清零的位与等于0,不清零的位与等于

需要置1的位或等于1,不需要置一的位或等于0

	TMOD &= 0xF0;		//清零低四位、高四位不变
	TMOD |= 0x01;		//低四位的bit0置1

设置定时器初值

	TL0=0x00;            //低八位、需要计算
	TH0=0xDC;            //高八位、需要计算

89C52的晶振频率是 11.0592MHz
机器周期 = 12 x 时钟周期 =12 x ( 1 /  时钟频率  ) s   = 1.085us
TH0 TL0 寄存器中计数 最多能计数2^16= 65536 ,累计计时大约 71ms
如何算出 10ms 定时器的初值?
        10ms需要数 9216 下,就配置寄存器从 65536-9126=56320 16 进制表示为 0xDC00)开始计数。这样TL0=0x00 TH0=0xDC

清除TF0标志

    TF0 = 0;

不使用中断时,必须软件清零

定时器0开始计时

    TRO = 1;

三、定时器控制LED

#include "reg52.h"

sbit led = P3^6;

void delay10ms()
{
	//1. 配置定时器0工作模式为16位计数
	TMOD = 0x01;
	//2. 定10ms的初值
	TL0=0x00;
	TH0=0xDC;
	//3. 开始计时
	TR0 = 1;
	TF0 = 0;
}


void main()
{
	int cnt = 0;
	led = 1;
	
	delay10ms();
	
	while(1){
		if(TF0 == 1)//当最高位产生溢出时,由硬件置1 
		{
			TF0 = 0;//不使用中断时,必须软件清零
			cnt++;  //统计溢出的次数
			//重新给初值
			TL0=0x00;
			TH0=0xDC;
			if(cnt == 100){//当溢出100次,经过了1s
				cnt = 0;  //cnt重新计数
				led = !led;//每经过1s,翻转led的状态
			}
		}
	}
}

四、定时器中断方式控制

1、中断寄存器

EA  :总中断允许控制位。EA=1,CPU开放中断

ET0:T0的溢出中断允许位。ET0=1,允许T0中断

硬件内部设计逻辑如下图:

 

2、定时器中断控制LED

定时器中断控制LED1每秒亮灭一次,主函数里LED2每300ms亮灭一次

#include "reg52.h"

sbit led1 = P3^6;
sbit led2 = P3^7;
int cnt = 0;

void Time0Init()
{
	//1. 配置定时器0工作模式为16位
	TMOD = 0x01;
	//2. 定10ms的初值
	TL0 = 0x00;
	TH0 = 0xDC;
	//3. 开始计时
	TR0 = 1;
	TF0 = 0;
	//4. 打开定时器0中断
	ET0 = 1;
	//5. 打开总中断EA
	EA = 1;
}

void Delay300ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	i = 3;
	j = 26;
	k = 223;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	led1 = 1;
	Time0Init();
	while(1){
		led2 = 0;
		Delay300ms();
		led2 = 1;
		Delay300ms();
	}
}

void Time0Handler() interrupt 1
{
	cnt++;  					//统计溢出的次数
	//重新给初值
	TL0=0x00;
	TH0=0xDC;
	if(cnt == 100){				//当溢出100次,经过了1s
		cnt = 0;  				
		led1 = !led1;			//每经过1s,翻转led的状态
	}		
}

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
/*******************说明:************************** 单片机进入掉电模式后,外部时钟停振, CPU/定时器/串口全部停止工作,只有外部中断处于工作状态 使单片机进入掉电模式的方法是:将PCON寄存器的PD位置1 -------------------------------------------------- 实验现象:系统复位后,P0口所有LED被点亮,无闪烁.说明 单片机进入了掉电模式,按下中断按键INT0后,所有LED 闪烁,说明单片机从掉电模式中被唤醒 -------------------------------------------------- 相关资料请参考STC89C51RC.pdf第78页 -------------------------------------------------- 基于开发板ZS001编写 开发板购买地址: http://shop60591679.taobao.com/ QQ:284083167 Email:[email protected] 对此程序有任何疑问可QQ或者邮件联系 **************************************************/ #include <reg52.h> #define uchar unsigned char #define uint unsigned int //功能:延时1毫秒 //入口参数:x //出口参数:无 //说明:当晶振为12M时,j<112;当晶振为11.0592M时,j<122 void Delay_xms(uint x) { uint i; uchar j; for(i=0;i<x;i++) for(j=0;j<112;j++); } //外部中断0函数,中断方式:下降沿中断 void INT0_L(void) interrupt 0 { PCON|=0x02; //进入掉电模式 } void INT1_fall(void) interrupt 3 { //PCON|=0x02; //进入掉电模式 } //主函数 void main(void) { Delay_xms(50);//等待系统稳定 EA=0; //关总中断 IT0=1; //下降沿中断 EX0=1; //开INT0中断 IT1=1; //下降沿中断 EX1=1; //开INT1中断 EA=1; //开总中断 P0=0x00; //点亮所有LED //PCON|=0x02; //进入掉电模式 while(1) { P0=0x00; //点亮P0口所有LED Delay_xms(1000); P0=0xff; //关闭P0口所有LED Delay_xms(1000); } }
### 回答1: stc89c51和stc89c52是两种不同的单片机芯片。 stc89c51是一种基于8051的单片机芯片,具有8位数据总线、4096字节的程序存储器、256字节的数据存储器、5组8位的可编程定时器/计数器、一个串口和一个外部中断stc89c52是一种基于8052的单片机芯片,与stc89c51相比,它具有更高的处理能力和更大的程序存储器(8K字节)和数据存储器(384字节)。 ### 回答2: STC89C51和STC89C52都是基于8051架构的单片机,二者的区别主要在于存储器容量和外设接口。 首先,STC89C51只有32KB的Flash存储器,而STC89C52则有8KB更多的Flash存储器,达到40KB。这意味着STC89C52可以运行更大程序,同时还可以存储更多的数据。 其次,STC89C52中的扩展IO口数量比STC89C51多6个。STC89C51只有32个扩展IO口,而STC89C52则有38个。这意味着STC89C52可以连接更多的外部设备,例如传感器、马达、LED等等。 此外,STC89C52还具有更快的工作频率。STC89C51最高频率为33MHz,而STC89C52则可以达到40MHz。这意味着STC89C52可以更快地执行指令,从而提高系统性能。 在使用上,因为STC89C52具有更多的存储器和IO口,因此可以支持更复杂的应用。而STC89C51则适合于一些较简单的应用。 总之,STC89C51和STC89C52虽然在硬件方面存在区别,但它们都是8051单片机,都可以用于控制系统。具体选用哪一个主要取决于应用场景和需求。 ### 回答3: STC89C51和STC89C52都是以8051内核为基础的单片机芯片,但它们在某些方面有一些不同之处。 首先,STC89C51和STC89C52的主频不同。STC89C51的主频为11.0592MHz,而STC89C52的主频为22.1184MHz。这意味着STC89C52可以处理更多的指令,速度也更快,而STC89C51则具有更好的兼容性。 其次,STC89C51和STC89C52的存储容量也有所不同。STC89C51具有64KB闪存和1KB RAM,而STC89C52具有8KB闪存和1KB RAM。虽然STC89C52闪存容量较低,但它可以通过外部存储器进行扩展。此外,STC89C52还可以通过ISP接口进行在线编程,而STC89C51则需要通过并行端口进行编程。 最后,STC89C51和STC89C52的功耗也有所不同。STC89C52采用更低的功率设计,能够更好地满足低功耗应用,而STC89C51的功耗相对较高。 综上所述,STC89C52相对于STC89C51来说在性能、存储和功耗方面都有优势,但是STC89C51在可靠性和兼容性方面更好。因此,选择哪种型号需要根据具体需求进行权衡。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值