单片机学习7——定时器/计数器编程

cpp 复制代码
#include<reg52.h>
 
unsigned char a, num;
sbit LED1 = P1^0;
 
void main()
{
	num=0;
	EA=1;
	ET0=1;
	//IT0=0;

	//设置TMOD的工作模式
	TMOD=0x01;
	//给定时器装初值,50000,50ms中断20次,就得到1s
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	
	TR0=1;	// 定时器/计数器启动

	while(1)
	{
		if(20==num)
		{
			num=0;
			LED1=~LED1;	 //取反,也就是闪烁
		}
	}
}
 
//中断服务程序
void ext0() interrupt 1	 // 1 表示的是定时器1
{
    //重新设置预装数值
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	//循环次数加1
	num++;	
}

初始化程序完成如下工作:

1、对TMOD赋值,以确定T0和T1的工作方式:

我们使用的是定时器/计数器0,那么高4位是0,低4位中GATE=0,C/T位为0,M1和M2的值是01,我们正常采用的是16位定时/计数器。所以各位的值是00000001,十六进制是0x01。

那么:

TMOD=0x01

2、计算初值,将其写入TH0、TL0或TH1、TL1:

TH0=(65536-50000)/ 256;

TL0=(65536-50000)%256;

这个可以得到50ms。

我们在代码中再使用num进行计数循环20次,就得到1s。

3、使用TR0或者TR1置位,启动定时/计数器定时或者计数。

TR0=1

说明:在TCON中,TR0是运行控制位。TR0置1的时候,启动定时/计数器。

4、中断方式时,则对IE进行赋值,开放中断。

EA=1

ET0=1

两个值打开即可,跟IT0什么的没有关系,只要顺着红线看过去即可。

相关推荐
_muffinman2 小时前
LED点阵8*8驱动开发笔记(Ai8051U单片机)
驱动开发·笔记·单片机
LCMICRO-133108477462 小时前
长芯微LDC64115完全P2P替代AD4115,是一款低功耗、低噪声、24位、Σ-Δ(Σ-Δ)模数转换器(ADC)
stm32·单片机·嵌入式硬件·fpga开发·硬件工程·模数转换器
busideyang2 小时前
数据手册和参考手册区别
stm32·单片机·嵌入式硬件·嵌入式
逐步前行3 小时前
STM32_时钟树_寄存器操作
stm32·单片机·嵌入式硬件
三佛科技-134163842123 小时前
FT8440E 与FT8440S-RT非隔离12V/18V 200MA开关电源芯片区别与联系?
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
同年紀3 小时前
C8051 U-EC6 keil无法连接下载器解决办法
单片机·嵌入式硬件
LCG元3 小时前
STM32项目开发:基于HC-SR04的超声波测距与倒车雷达系统
stm32·单片机·嵌入式硬件
我不是程序猿儿4 小时前
【嵌入式】外部中断的学习小坑记录
单片机·嵌入式硬件·学习
学嵌入式的小杨同学4 小时前
STM32 进阶封神之路(十三):空气质量传感器实战 ——KQM6600 模块从协议到代码(串口通信 + 数据解析)
c++·stm32·单片机·嵌入式硬件·架构·硬件架构·嵌入式实时数据库
2302_813806224 小时前
【单片机】—— 中断
单片机·嵌入式硬件·51单片机