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