前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >物联网-定时器实验

物联网-定时器实验

原创
作者头像
会洗碗的CV工程师
发布2024-01-29 23:25:07
1860
发布2024-01-29 23:25:07
举报
文章被收录于专栏:LongJava学习资料

1. 实验目的

学习STC12C5A单片机定时器知识。

2. 实验原理

STC12C5A16S2系列单片机有4个定时器,其中定时器0和定时器1两个16位定时器,与 传统8051的定时器完全兼容,也可以设置为1T模式,当在定时器1做波特率发生器时,定时 器0可以当两个8位定时器用(另外2路PCA/PWM可以再实现2个16位定时器)。

STC12C5A16S2系列单片机内部设置的两个16位定时器/计数器T0和T1都具有计数方式和 定时方式两种工作方式。对每个定时器/计数器(T0和T1),在特殊功能寄存器TMOD中都有一个 控制位——C/T来选择T0或T1为定时器还是计数器。定时器/计数器的核心部件是一个加法(也 有减法)的计数器,其本质是对脉冲进行计数。只是计数脉冲来源不同:如果计数脉冲来自系统 时钟,则为定时方式,此时定时器/计数器每12个时钟或者每1个时钟得到一个计数脉冲,计 数值加1;如果计数脉冲来自单片机外部引脚(T0为P3_4,T1为P3_5),则为计数方式,每来一 个脉冲加1。当定时器/计数器工作在定时模式时,特殊功能寄存器AUXR中的T0x12和T1x12 分别决定是系统时钟/12还是系统时钟/1(不分频)后让T0和T1执行计数。当定时器/计数 器 工作在计数模式时,对外部脉冲计数不分频。

定时器/计数器0有4种工作模式:

模式0(13位定时器/计数器),

模式1(16位定时器/计数器模式),

模式2(8位自动重装模式),

模式3(两个8位定时器/计数器)。

定时器/计数器1除模式3外,其工作模式与定时器/计数器0相同,T1在模式3时无效,停 止计时。

3. 主要仪器设备

硬件:IOT-L01-05型物联网综合实验箱1台,串口线。

软件:Keil u Vision4编译软件,STC下载软件STC_ISP_V479。

4. 实验内容及步骤

4.1.1 编译工程文件,生成可执行Timer.hex文件。

4.1.2  使用串口线将电脑与物联网综合实验箱中带有STC单片机的底板连接,拨打好串口控制开关。

4.1.3 将可执行Timer.hex文件通过STC_ISP串口下载软件下载进STC单片机中。

4.1.4 将下载完程序的开发板从新上电。

4.1.5  修改代码,使得LED灯每隔一秒亮灭一次,

修改后的代码如下:

代码语言:c
复制
/**********************************************************
*  晶振频率    :选取用RC 11.0592MHz
*  文件名      :Timer.c
*  功能说明    :STC12C5A16S2单片机的定时器操作演示实验
*  MCU一上电开始定时,定时时间是1000uS,那么5000次之后就是5s
*  同时LED灯实现5s的亮灭交替变化。
*  制作        :www.frotech.com
*  变更记录    :2013.5.3
*  变更内容    :新建造
************************************************************/
#include<reg51.h>
/************* 本地常量声明 **************/
#define Main_Fosc   11059200UL     //定义外部晶振频率
#define TIME        (65536-Main_Fosc/5000)  //定义定时器时间溢出数
/************* 特殊寄存器声明 **************/
sfr AUXR=0x8E;         //辅助寄存器AUXR声明
sfr WAKE_CLKO=0x8F;        //时钟输出和掉电唤醒寄存器声明
/************* 特殊位声明 **************/
sbit  P1_0=P1^0;        //LED灯的控制管脚P1_0声明
/************* 本地变量声明 **************/
unsigned int count;        //普通计数变量声明
void main()
{
 AUXR=0x80;         //定时器0工作在1T模式下
  TMOD=0x01;         //定时器0工作在模式1(16位定时器/计数器)下 
 TL0=TIME;         //计数值低8位装入定时器低计数寄存器中
 TH0=TIME>>8;        //计数值高8位装入定时器高计数
 TR0=1;          //允许定时器0开始计数
 ET0=1;          //开定时器0中断
 P1_0=1;          //将P1的第0管脚设置为输出,这时LED灯亮
 EA=1;          //开中断
 count=0;         //初始化计数值
 while(1)
   ;
}
/*******************************************************
*  函数名:timer0_out()
*  输入:无
*  输出:无
*  功能描述:定时0溢出终端处理函数。每隔1us产生溢出中断,这时候count的值由5000减1
*            当count值减为0时,改变LED灯状态,同时又从5000开始计数。 
******************************************************/
void timer0_out()  interrupt 1
{
  TL0=TIME;
 TH0=TIME>>8;
 if(count-- ==0)
   {
      count=5000;
   P1_0=~P1_0;
   }
}

4.1.6  重复4.1.1-4.1.4的步骤。使得程序重新加载到试验箱中。

4.1.7  观察实验效果,是否符合要求。

6. 问题与讨论

MCU一上电开始定时,定时时间是1000uS,那么5000次之后就是5s,从这里我们推测1000us应该就是TIME变量那个分母,如果我们让他5000次后变1s,那么也就是200us,因此分母修改为5000即可实现效果。

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档