89C52RC定时器(自用复习笔记)

一、定时器作用

(1)用于计时系统,可实现软件计时,或者使用程序每隔一固定时间完成一项操作。

(2)替代长时间的Delay,提高CPU的运行效率和处理速度。

(3)...操作系统任务切换,多任务执行。

二、定时器资源

定时器个数:3个(T0、T1、T2),T0,T1与传统51单片机兼容。

三、定时器工作原理

定时器在单片机内部像小时钟一样,根据输出的时钟信号,每隔一秒,计数单元的数值就增加一,当技术单元数值增加到“设定的时间”时(一般加到最大值溢出中断),计数单元向中断系统发起中断申请,产生“响铃提醒”,使程序跳转到中断服务函数程序。

3.1定时器工作模式

89C52RC的T0和T1均有四种工作模式:

模式0:13位定时器/计数器(几乎不用)

模式1:16位定时器/计数器(常用)

模式2:8位自动重装模式(少用)

模式3:两个8位计数器(几乎不用)

在此只看模式1,红框部分是时钟,蓝色框是计数单元。

3.2定时器工作原理

1)SYsclk:系统时钟,晶振周期,在89C52RC上是的晶振是12MHZ。

        进行分频,有12和6,此时用12的分频后为1MHZ,一周期就是1us。

        C/t选择开关=0时定时器,=1时就是计数器。

2)由左边的时钟通过分频后给予的脉冲使计数单位加1然后TL0和TL0一共16位,可以计数到65535,到65535后溢出产生一个型号TF0/1然后申请进入中断系统。

四、中断系统

1)中断系统是为使CPU具有外界紧急事件的实时处理能力而设置的。处理完以后再回到原来被中断的地方,继续原来的工作。cpu允许有多个中断源,当几个中断源同时向cpu请求中断,要求服务时,优先处理最紧急的中断请求源,规定每一个中断源有一个优先级别,cpu总响应优先级别最高的中断请求。(谁权力大等级高,先为谁办事)

2)中断(优先级低)时又来个中断(优先级高),先去处理优先级高的后,再回来低中断中继续处理。

中断源个数:8个(外部中断0,定时器0中断,外部中断1,定时器中断,串口中断,外部中断2,外部中断3)

中断优先级个数:4个

中断号:如图

五、定时器和中断系统

定时器和中断系统连接,此处使用的中断系统原理图是传统51的因为有向下兼容的原因,所以都是可以用的。

六、通过控制定时器的相关寄存器

寄存器是连接软硬件的媒介,通过对寄存器的配置操控硬件,根据数据手册!

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要使用STC89C52RC单片机来显示时间,你需要一个实时时钟模块,例如DS1302或DS3231,并将其连接到单片机的GPIO口。然后,你需要编写代码来读取实时时钟模块的时间并将其显示在你选择的显示设备上,例如LCD显示屏或LED数码管。 以下是一个基本的示例程序,可以让你开始: ```c #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit SCLK=P3^6; //定义时钟线 sbit DSIO=P3^5; //定义数据线 sbit RST=P3^4; //定义复位线 uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管显示表 void delay(uint z) //延时函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void write_byte(uchar dat) //写入一个字节数据 { uchar i; for(i=0;i<8;i++) { DSIO=dat&0x01; dat>>=1; SCLK=0; SCLK=1; } } uchar read_byte() //读取一个字节数据 { uchar i,dat=0; for(i=0;i<8;i++) { dat>>=1; if(DSIO) dat|=0x80; SCLK=0; SCLK=1; } return dat; } void init_ds1302() //初始化DS1302时钟模块 { RST=0; delay(1); RST=1; delay(1); write_byte(0x8e); //写入控制命令,允许写入数据 write_byte(0x00); //写入秒计数器 write_byte(0x80); //写入时钟启动命令,关闭写保护 } void write_ds1302(uchar dat,uchar addr) //向DS1302时钟模块写入数据 { write_byte(0xbe); //写入控制命令,允许读取数据 write_byte(addr); //写入地址 write_byte(dat); //写入数据 write_byte(0x80); //写入时钟启动命令,关闭写保护 } uchar read_ds1302(uchar addr) //从DS1302时钟模块读取数据 { uchar dat; write_byte(0xbf); //写入控制命令,允许读取数据 write_byte(addr); //写入地址 dat=read_byte(); //读取数据 write_byte(0x81); //写入时钟启动命令,关闭写保护 return dat; } void display_time() //显示当前时间 { uchar sec,min,hour; sec=read_ds1302(0x81); //读取秒 min=read_ds1302(0x83); //读取分 hour=read_ds1302(0x85); //读取时 P0=table[sec%10]; //显示秒的个位数 P1=table[sec/10]; //显示秒的十位数 P2=table[min%10]; //显示分的个位数 P3=table[min/10]; //显示分的十位数 P4=table[hour%10]; //显示时的个位数 P5=table[hour/10]; //显示时的十位数 } void main() { init_ds1302(); //初始化DS1302时钟模块 while(1) { display_time(); //显示当前时间 delay(100); //延时100毫秒 } } ``` 上述代码实现了通过DS1302时钟模块读取当前时间,并将其显示在六位数码管上。你可以根据你的需要修改代码,例如更换显示设备、添加按钮控制等功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值