实例7:stc8a8k定时器0,定时50ms,进入中断之后,加数20次到1秒,计算时间。
一、实验目的
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秒,计算时间。相关推荐
- 12- 定时器介绍和定时器0定时1ms
定时器介绍和定时器0定时1ms 文章目录 定时器介绍和定时器0定时1ms 1. 定时/计数器的概念 2. 定时/计数器的模式 3. 任务:定时1ms 3.1 细谈原理 3.2 代码实现过程: 3.2. ...
- 51单片机用定时器0实现流水灯
51单片机用定时器0实现流水灯的代码如下,用P1口接led灯,代码如下都有注释就不具体解释了,英语不怎么好,有的地方将就一下喽,本次主要讲一下P1口怎么赋值.原先写的都是用查表来移位的,个人感觉不怎么 ...
- 定时器中断实验 编写程序使定时器0或者定时器1工作在方式1,定时50ms触发蜂鸣器。
编写程序使定时器0或者定时器1工作在方式1,定时50ms触发蜂鸣器. 程序: #include<reg51.h> sbit fm=P2^3; unsigned char cnt; int ...
- 定时器0工作方式2,定时1s
定时器0工作方式2,定时1s
- 定时器0工作方式1,定时1s
定时器0工作方式1,定时1s.
- 定时器中断实验 编写程序使定时器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> ...
- 定时器中断实验 编写程序使定时器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 ...
- EJB3.0定时发送jms(发布/定阅)方式
EJB3.0定时发送jms(发布/定阅)方式 介绍: 定时器分为两种:single-action Timer(单动定时器)和interval Timer(间隔定时器). 为了使用定时服务,1.ent ...
- 单片机定时器精准定时_8051单片机(STC89C52)定时器实现10ms精准定时
8051内部集成了2个16bits的计数器, 可以根据需要将其作为定时器使用. 这时, 定时器的计数频率为系统CLK/12. 如果CPU的晶振频率为12MHz, 那么定时器信号源的频率固定为12MHz ...
最新文章
- Design Pattern Explained 读书笔记二——设计模式序言
- 数据结构 —— 为结构体内变量赋值
- MySQL自动建立集合自动分片_1.mongodb初步使用总结
- 数据那点事001---集合
- 谷歌修复多个严重的安卓 RCE 漏洞
- DataGrid与SQL Server 2000数据绑定
- 第七章 (四)BFS(路径寻找问题)
- 熊猫烧香病毒专杀下载
- python 英语词典下载_Python 字典(Dictionary)
- 常见视频输出接口类型
- 新手怎么在GitHub上传代码?----最新教程
- linux的ffmpeg转换视频为mp4,使用开源软件FFmpeg将各种格式视频转换成MP4视频格式(最简单方法)...
- 到此一游︱2022 Google 开发者大会
- k8s常见故障排查一点通
- Pytorch实现CT图像正投影(FP)与反投影(FBP)的模块
- 制作 img系统镜像的详细方法
- 移动浏览器市场份额之争
- Android开发,实现摇一摇功能
- 关于示波器是否必须要接地线的疑问
- 【Cmake】初识CMake(一)
热门文章
- 个人网站博客完美添加谷歌广告增加收入详细步骤
- 浅谈润乾报表与QlikView对比
- UnicodeDecodeError ‘gbk‘ codec can‘t decode byte 0x93 in position 6325 illegal multibyte sequence
- Mac 升级 Bash 到最新版本
- composer设置国内源
- ESP8266-SPI通讯连接显示屏
- 如何修改 gitlab 的项目名称
- 「图像处理」使用Python+Openface实现人脸识别与关键点(landmarks)检测
- 用python画分段函数图像_使用Python的matplotlib画出一个分段函数的图像
- 《DEEP GRADIENT COMPRESSION:REDUCING THE COMMUNICATION BANDWIDTH FOR DISTRIBUTED TRAINING》精读