一、实验目的

1、熟悉定时器T0的使用;
2、按下按键KEY1,开始计时间,在OLED显示时间;
3、熟悉中断的作用;

二、实验设备

stc8a开发板;
OLED屏幕,4脚OLED;
下载器;

三、实验原理

1、中断的概念;

在主程序中,正在运行一段程序,突然有个信号过来,告诉主程序,你先来执行我的程序,主程序就执行中断程序,执行完之后,继续允许主程序。

我正在吃饭,然后突然有个电话过来,听完电话,之后,我们继续吃饭。

类似这样。所以这个中断信号会打断我们正在执行的任务。
那么那些可以是中断信号呢?

定时器中断,定时时间到,就执行他的程序,然后继续主程序;
外部中断,外面有个按钮,别人一按按钮,就先停止你的,执行他们的;

PWM中断;
ADC中断;
串口中断;
等等。
这里有个内容,就是

中断的优先级

,如果外面一队中断信号,先执行那个呢?有个优先级,如果不设置,就是默认的顺序。
怎么设置优先级呢?这个后面有需要我们再设置看手册就好了。

2、定时器的概念;
有时候需要单片机定时到一段时间之后,再执行它的函数。处理完,再回到主程序。就需要定时器。
stc8a8k有几个定时器,比较多。我们举例定时器T0的使用。T1和T0差不多。我们循迹小车中,使用T0作为计算小车运行的时间,使用T1作为蓝牙模块的波特率发生器。
首先,我们找手册,定时器0的用法,看看有什么内部资源;一般我们是要设置几个内容:
(1)定时的模式,
有些是16位有些13位,我们要设置一下,一般都是设置16位自动重载的模式;什么是16位自动重载呢,定时计数器,就是从0—1–2-3–2^16—0–1--2,计算到2的16次方,就会反过来0–1。。这里会自动重新计算。最大是2的16次方。这就有个概念就是定时的间隔,因为这里我们设置时12T的模式计算,那么计算一次,就是1us。
(2)定时初值赋值;我们这里定时50ms。
(3)定时器中断打开;?
(4)定时器开关TR0打开?
(5)总中断打开?
当我们需要打开定时器的时候,就打开就行了,不需要,记得关闭。


3、定时器T0的使用和相关寄存器;

#include "reg51.h"
#include "intrins.h"//测试工作频率为11.0592MHzsbit    P10         =   P1^0;void TM0_Isr() interrupt 1 using 1
{P10 = !P10;                             //测试端口
}void main()
{TMOD = 0x00;TL0 = 0x66;                                 //65536-11.0592M/12/1000TH0 = 0xfc;TR0 = 1;                                    //启动定时器ET0 = 1;                                    //使能定时器中断EA = 1;while (1);
}

学习案例:
1、TMOD=0x00;==0000 0000
TMOD寄存器干什么的?
是一个模式控制的寄存器,就是让定时器按照这个模式运行。
D7----D6–D5–D4控制的是定时器T1的;
GATE=0----------------用TR1控制开关
C、T=0-------------定时模式
M1=0
M0=0----------0 0 ----------16位自动重载模式

D3----D2–D1–D0控制的是定时器T0的;
GATE=0----------------用TR0控制开关
C、T=0-------------定时模式
M1=0
M0=0----------0 0 ----------16位自动重载模式

2- 定时初值的低八位和高8位。这个怎么计算呢?我们先不自己计算,用STC自动计算。
TL0 = 0x66; //65536-11.0592M/12/1000
TH0 = 0xfc;

选择相应模式,然后自动生成代码,包括工作模式,定时器初值等,都生成了,多快。当然我们要自己掌握,比如我们一开始不打开,就TR0=0就好了。把开关关了。

ET0 = 1; /使能定时器中断
,那么ET0=0,就是关闭定时器T0的中断了。
EA = 1;打开总的开关。我们的总开关要开着,不要太自私,其他中断也是用这个总开关的。

4、定时中断的使用(注意全局变量,局部变量的定义,看书本哦)
注意这个端口号和终端号,是对的,不能随便改哦。
void TM0_Isr() interrupt 1 using 1
{
P10 = !P10; //测试端口
}

5、编程思路。
定时50ms,定时器T0,因为不能定时1秒,必须定时50ms,计算20次,就得到50ms*20=1000ms=1秒。
用ISP下载软件生成初值50ms的代码。

void Timer0Init(void)        //50毫秒@11.0592MHz
{AUXR &= 0x7F;     //定时器时钟12T模式TMOD &= 0xF0;      //设置定时器模式TL0 = 0x00;       //设置定时初值TH0 = 0x4C;        //设置定时初值TF0 = 0;       //清除TF0标志TR0 = 1;      //定时器0开始计时
}

**
用STC软件案例代码修改:

案例:一定请琢磨透彻。

//******************************************************************************/
#include "stc8a8k.h"
#include "oled.h"
#include "stdio.h"//显示浮点数的sprintf函数,需要
sbit key0=P3^4;
void delay_tms(unsigned int ms)
{unsigned int i,j;for(i=ms;i>0;i--)for(j=0;j<1100;j++);
}unsigned int count=0;//全局变量
unsigned int sec=0;//全局变量秒
//定时器0中断函数,不需要声明,直接就能用。
void TM0_Isr() interrupt 1 using 1
{count++;if(count==20) //到20次,就是1秒{sec++;count=0;}}void main()
{AUXR &= 0x7F;     //定时器时钟12T模式TMOD &= 0xF0;      //设置定时器模式TL0 = 0x00;       //设置定时初值50msTH0 = 0x4C;        //设置定时初值50msTF0 = 0;       //清除TF0标志//TR0 = 1;           //启动定时器ET0 = 1;         //使能定时器中断EA = 1;OLED_Init();           //初始化OLED OLED_Clear() ; while (1){//按下开关,开启定时器T0if(key0==0){delay_tms(15);if(key0==0){TR0=1;//开启定时器T0}}OLED_ShowNum(5*8,2,sec,5,16);// 显示定时时间,1秒1秒加起来   }
}

**

实例7:stc8a8k定时器0,定时50ms,进入中断之后,加数20次到1秒,计算时间。相关推荐

  1. 12- 定时器介绍和定时器0定时1ms

    定时器介绍和定时器0定时1ms 文章目录 定时器介绍和定时器0定时1ms 1. 定时/计数器的概念 2. 定时/计数器的模式 3. 任务:定时1ms 3.1 细谈原理 3.2 代码实现过程: 3.2. ...

  2. 51单片机用定时器0实现流水灯

    51单片机用定时器0实现流水灯的代码如下,用P1口接led灯,代码如下都有注释就不具体解释了,英语不怎么好,有的地方将就一下喽,本次主要讲一下P1口怎么赋值.原先写的都是用查表来移位的,个人感觉不怎么 ...

  3. 定时器中断实验 编写程序使定时器0或者定时器1工作在方式1,定时50ms触发蜂鸣器。

    编写程序使定时器0或者定时器1工作在方式1,定时50ms触发蜂鸣器. 程序: #include<reg51.h> sbit fm=P2^3; unsigned char cnt; int ...

  4. 定时器0工作方式2,定时1s

    定时器0工作方式2,定时1s

  5. 定时器0工作方式1,定时1s

    定时器0工作方式1,定时1s.

  6. 定时器中断实验 编写程序使定时器0或者定时器1工作在方式2,自动重装载模式,定时500ms使两位数码管从00、01、02……98、99每间隔500ms加1显示。

    编写程序使定时器0或者定时器1工作在方式2,自动重装载模式,定时500ms使两位数码管从00.01.02--98.99每间隔500ms加1显示. 程序: #include <reg51.h> ...

  7. 定时器中断实验 编写程序使定时器0或者定时器1工作在方式1,定时500ms使两位数码管从00、01、02……98、99每间隔500ms加1显示。

    编写程序使定时器0或者定时器1工作在方式1,定时500ms使两位数码管从00.01.02--98.99每间隔500ms加1显示. 程序: #include <reg51.h> #defin ...

  8. EJB3.0定时发送jms(发布/定阅)方式

    EJB3.0定时发送jms(发布/定阅)方式 介绍: 定时器分为两种:single-action Timer(单动定时器)和interval  Timer(间隔定时器). 为了使用定时服务,1.ent ...

  9. 单片机定时器精准定时_8051单片机(STC89C52)定时器实现10ms精准定时

    8051内部集成了2个16bits的计数器, 可以根据需要将其作为定时器使用. 这时, 定时器的计数频率为系统CLK/12. 如果CPU的晶振频率为12MHz, 那么定时器信号源的频率固定为12MHz ...

最新文章

  1. Design Pattern Explained 读书笔记二——设计模式序言
  2. 数据结构 —— 为结构体内变量赋值
  3. MySQL自动建立集合自动分片_1.mongodb初步使用总结
  4. 数据那点事001---集合
  5. 谷歌修复多个严重的安卓 RCE 漏洞
  6. DataGrid与SQL Server 2000数据绑定
  7. 第七章 (四)BFS(路径寻找问题)
  8. 熊猫烧香病毒专杀下载
  9. python 英语词典下载_Python 字典(Dictionary)
  10. 常见视频输出接口类型
  11. 新手怎么在GitHub上传代码?----最新教程
  12. linux的ffmpeg转换视频为mp4,使用开源软件FFmpeg将各种格式视频转换成MP4视频格式(最简单方法)...
  13. 到此一游︱2022 Google 开发者大会
  14. k8s常见故障排查一点通
  15. Pytorch实现CT图像正投影(FP)与反投影(FBP)的模块
  16. 制作 img系统镜像的详细方法
  17. 移动浏览器市场份额之争
  18. Android开发,实现摇一摇功能
  19. 关于示波器是否必须要接地线的疑问
  20. 【Cmake】初识CMake(一)

热门文章

  1. 个人网站博客完美添加谷歌广告增加收入详细步骤
  2. 浅谈润乾报表与QlikView对比
  3. UnicodeDecodeError ‘gbk‘ codec can‘t decode byte 0x93 in position 6325 illegal multibyte sequence
  4. Mac 升级 Bash 到最新版本
  5. composer设置国内源
  6. ESP8266-SPI通讯连接显示屏
  7. 如何修改 gitlab 的项目名称
  8. 「图像处理」使用Python+Openface实现人脸识别与关键点(landmarks)检测
  9. 用python画分段函数图像_使用Python的matplotlib画出一个分段函数的图像
  10. 《DEEP GRADIENT COMPRESSION:REDUCING THE COMMUNICATION BANDWIDTH FOR DISTRIBUTED TRAINING》精读