物联网-定时器实验

2024-01-29 23:25:07 浏览数 (1)

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腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

0 人点赞