51单片机实验03-定时器T0来实现流水灯从左到右再从右到左

目录

一、实验目的

二、实验说明

[1、51单片机有两个16位内部计数器/定时器(C/T, Counter/Timer)。](#1、51单片机有两个16位内部计数器/定时器(C/T, Counter/Timer)。)

2、模式寄存器TMOD

1) M1M0工作模式控制位; M1M0工作模式控制位;)

2) C/T定时器或计数器选择位: C/T定时器或计数器选择位:)

3)GATE定时器/计数器运行门控位:

3、控制寄存器TCON

4、定时器T0的应用

5、定时器T0工作于模式1时初值的计算示例

三、电路原理图

四,实现效果及代码

1,思路

1)对应电子书的内容

2)TR0=1

2,效果

3,代码


一、实验目的

1.学习51单片机内部定时/计数器的使用和编程方法;

2.掌握单片机控制数码管进行数字和字母显示的方法。

二、实验说明

1、51单片机有两个16位内部计数器/定时器(C/T, Counter/Timer)。

若是对内部晶振驱动时钟进行计数,则是定时器;若是对8051的输入引脚的脉冲信号进行计数,则它是计数器。定时器实际上也是工作在计数方式下,只不过是对固定频率的脉冲计数。由于脉冲周期固定,则由计数值可以计算出相应时间,即定时功能。

定时器有关的寄存器有模式寄存器TMOD和控制寄存器TCON。TMOD用于设置定时器/计数器的工作模式0-3,并确定用于定时还是用于计数。TCON主要功能是为定时器在溢出时设定标志位,并控制定时器的运行或停止等。

2、模式寄存器TMOD

1) M1M0工作模式控制位;

2) C/T定时器或计数器选择位:

C/T=1时,为计数器; C/T =0时,为定时器。

3)GATE定时器/计数器运行门控位:

当GATE=1时, C/T的启动受双重控制,即要求INT0 (或INT1)引脚为高电平且TR0(或TR1 )置 1 时, 相应的C/T才被选通工作。

若GATE=0, C/T的启动仅受TR0 (或 TR1)控制,即置1, C/T就被选通, 而不管 INT0 (或 INT1)的电平是高还是低。

3、控制寄存器TCON

TF0、TF1分别是定时器/计数器T0、 T1 的溢出中断标志位, 加法计数器溢出时置1, 申请中断, 在中断响应后自动复0。TF产生的中断申请是否被接受, 还需要由中断是否开放来决定。TR1、TR0 分别是定时器/计数器T1、T0的运行控制位,通过软件置1 后, 定时器/计数器才开始工作,在系统复位时被清0。

4、定时器T0的应用

在使用51系列单片机的C/T前,应对它进行编程初始化,主要是对TCON和TMOD编程,还需要计算和装载C/T的计数初值。

一般地,定时器T0的使用需完成以下4个步骤:

第一步:设置特殊功能寄存器TMOD,配置好工作模式;

第二步:设置计数寄存器TH0和TL0的初值;

第三步:设置TCON,通过TR0置1来让定时器开始计数;

第四步:判断TCON寄存器的TF0位,监测定时器溢出情况。

5、定时器T0工作于模式1时初值的计算示例

写程序之前,要先学会计算如何用定时器定时时间。假如定时20ms:

对于标准架构下的51单片机,晶振是11.0592M时,则时钟周期就是(1/11059200)s,机器周期是(12/11059200)s。

现需要定时20ms,也就是0.02 秒。假设要经过x个机器周期得到0.02 秒,下面来具体计算一下:

x*12/11059200=0.02,得到 x= 18432。16 位定时器的溢出值是65536(因65535 再加1才是溢出),于是我们就可以这样操作,先给TH0 和TL0一个初始值,让它们经过18432个机器周期后刚好达到65536,也就是溢出,溢出后可以通过检测TF0的值得知,就刚好是0.02秒。

那么初值y = 65536-18432=47104,转成十六进制就是0xB800,也就是 TH0 = 0xB8,TL0 = 0x00。

三、电路原理图

四,实现效果及代码

1,思路

1)对应电子书的内容

2)TR0=1

因为这里我使用的是定时器0-TR0,因此就需要TR0=1;来让定时器0开始定时。

之后剩下的定时器模式,初始值,可参考电子书👇,如果还不懂,评论区或者是私信我。

2,效果

定时器t0控制流水灯

3,代码

cpp 复制代码
#include<reg52.h>
sbit enled=P1^4;  
sbit addr3=P1^3;
sbit addr2=P1^2;
sbit addr1=P1^1;
sbit addr0=P1^0;
void  main(){
     unsigned char ind=0;
     unsigned char cou_f=0;
	 unsigned char cou_m=0;
     	enled=0;
		addr3=1;
		addr2=1;
		addr1=1;
		addr0=0;
		TMOD=0x01;   // 使用定时器0的模式1
		TH0=0xB8;
		TL0=0x00;    // 设置初值
		TR0=1;      // 让定时器开始运行
		while(1){ 
		if(TF0==1){
		TF0=0;
		TH0=0xB8;
		TL0=0x00;
		cou_f++;
		if(cou_f==50){   // 1s
		cou_f=0;
	    if(cou_m<8){ 
		P0=~(0x80>>cou_m);  //到了1s之后,让小灯开始移动
		}
		else if(cou_m>=8  && cou_m<14 ){
		P0=~(0x01<<(cou_m-7));
		} 
		cou_m++;
		if(cou_m==14){
		cou_m=0;
		}
		}
		}
		}
		}

关于138译码器及使用软件延时小灯的相关代码注释请参考前一篇文章👇

51单片机实验01-点亮LED小灯-CSDN博客

有问题请在评论区留言或者是私信我,一天8h在线。

相关推荐
清风6666661 天前
基于单片机的螺旋藻生长大棚PH智能控制设计
单片机·嵌入式硬件·毕业设计·课程设计
ting_zh1 天前
微控制器(Micro Controller Unit, MCU)基础整理
单片机·嵌入式硬件
清风6666661 天前
基于单片机的图书馆智能座位管理平台
数据库·单片机·嵌入式硬件·毕业设计·课程设计
得单片机的运1 天前
STM32的以太网的搭建
stm32·单片机·嵌入式硬件·物联网·以太网·iot·w5500
酷飞飞1 天前
RTC和看门狗基于GD32F407VE的天空星的配置
stm32·单片机·嵌入式硬件·mcu
WD137298015571 天前
WD5030A,24V降5V,15A 大电流,应用于手机、平板、笔记本充电器
stm32·单片机·嵌入式硬件·智能手机·汽车·电脑·51单片机
日更嵌入式的打工仔1 天前
GPIO 中断通用配置指南
stm32·单片机·嵌入式硬件
平凡灵感码头1 天前
基于 STM32 的智能门锁系统,系统界面设计
stm32·单片机·嵌入式硬件
Truffle7电子1 天前
STM32理论 —— 存储、中断
stm32·嵌入式硬件·嵌入式·存储·中断
报错小能手1 天前
linux学习笔记(32)网络编程——UDP
单片机·嵌入式硬件