基于STC8H系列单片机的定时器系统
- STC8H4K64TL单片机介绍
- STC8H4K64TL单片机管脚图(48个引脚)
- STC8H4K64TL单片机串口仿真与串口通信
- STC8H4K64TL单片机管脚图(32个引脚)
- STC8H4K64TL单片机管脚图(20个引脚)
- STC8H系列单片机管脚说明
- STC8H系列单片机I/O口
- STC8H系列单片机I/O口相关寄存器
- STC8H系列单片机配置I/O口
- STC8H系列单片机I/O口结构图
- STC8H系列单片机如何设置I/O口对外输出速度
- STC8H系列单片机如何设置I/O口电流驱动能力
- STC8H系列单片机如何降低I/O口对外辐射能力
- STC8H系列单片机的定时器系统介绍
- STC8H系列单片机的定时器3/4功能脚切换
- STC8H系列单片机的定时器相关寄存器
- STC8H系列单片机的定时器0/1相关寄存器
- STC8H系列单片机的定时器2(24位定时器 8位预分频+16位定时)相关寄存器
- STC8H系列单片机的定时器3/4(24位定时器 8位预分频+16位定时)相关寄存器
- STC8H系列单片机的定时器T11(24位定时器 8位预分频+16位定时)相关寄存器
- STC-ISP定时器计数器工具
- STC8H系列单片机晶振为12MHz的定时器0的16位自动重装定时模式0的12分频定时1ms范例程序
- STC8H系列单片机晶振为12MHz的定时器0的16位自动重装定时模式0的1分频定时1ms范例程序
- STC8H系列单片机晶振为12MHz的定时器0的16位不自动重装定时模式1的12分频定时1ms范例程序
- STC8H系列单片机晶振为12MHz的定时器0的16位不自动重装定时模式1的1分频定时1ms范例程序
- STC8H系列单片机晶振为12MHz的定时器0的8位自动重装定时模式2的12分频定时0.1ms范例程序
- STC8H系列单片机晶振为12MHz的定时器0的8位自动重装定时模式2的1分频定时0.01ms范例程序
- STC8H系列单片机晶振为12MHz的定时器0的16位自动重装不可屏蔽(就是不受EA = 1控制)定时模式3的12分频定时1ms范例程序
- STC8H系列单片机扩展定时器0为外部下降沿计数范例程序
- STC8H系列单片机晶振为12MHz的定时器1的16位自动重装定时模式0的12分频定时1ms范例程序
- STC8H系列单片机晶振为12MHz的定时器1的16位自动重装定时模式0的1分频定时1ms范例程序
- STC8H系列单片机晶振为12MHz的定时器1的16位不自动重装定时模式1的12分频定时1ms范例程序
- STC8H系列单片机晶振为12MHz的定时器1的16位不自动重装定时模式1的1分频定时1ms范例程序
- STC8H系列单片机晶振为12MHz的定时器1的8位自动重装定时模式2的12分频定时0.1ms范例程序
- STC8H系列单片机晶振为12MHz的定时器1的8位自动重装定时模式2的1分频定时0.01ms范例程序
- STC8H系列单片机扩展定时器1为外部下降沿计数范例程序
- STC8H系列单片机扩展定时器1的16位自动重装定时模式0作为串口1波特率发生器范例程序
- STC8H系列单片机扩展定时器1的8位自动重装定时模式2作为串口1波特率发生器范例程序
- STC8H系列单片机晶振为12MHz的定时器2的16位自动重装定时模式0的12分频定时1ms范例程序
- STC8H系列单片机晶振为12MHz的定时器2的16位自动重装定时模式0的1分频定时1ms范例程序
- STC8H系列单片机扩展定时器2为外部下降沿计数范例程序
- STC8H系列单片机扩展定时器2的16位自动重装定时模式0作为串口1波特率发生器范例程序
- STC8H系列单片机扩展定时器2的16位自动重装定时模式0作为串口2波特率发生器范例程序
- STC8H系列单片机扩展定时器2的16位自动重装定时模式0作为串口3波特率发生器范例程序
- STC8H系列单片机扩展定时器2的16位自动重装定时模式0作为串口4波特率发生器范例程序
- STC8H系列单片机晶振为12MHz的定时器3的16位自动重装定时模式0的12分频定时1ms范例程序
- STC8H系列单片机晶振为12MHz的定时器3的16位自动重装定时模式0的1分频定时1ms范例程序
- STC8H系列单片机晶振为12MHz的定时器3为外部下降沿计数范例程序
- STC8H系列单片机扩展定时器3的16位自动重装定时模式0作为串口3波特率发生器范例程序
- STC8H系列单片机晶振为12MHz的定时器4的16位自动重装定时模式0的12分频定时1ms范例程序
- STC8H系列单片机晶振为12MHz的定时器4的16位自动重装定时模式0的1分频定时1ms范例程序
- STC8H系列单片机晶振为12MHz的定时器4为外部下降沿计数范例程序
- STC8H系列单片机扩展定时器4的16位自动重装定时模式0作为串口4波特率发生器范例程序
STC8H4K64TL单片机介绍
STC8H4K64TL单片机管脚图(48个引脚)
STC8H4K64TL单片机串口仿真与串口通信
STC8H4K64TL单片机管脚图(32个引脚)
STC8H4K64TL单片机管脚图(20个引脚)
STC8H系列单片机管脚说明
STC8H系列单片机I/O口
STC8H系列单片机I/O口相关寄存器
STC8H系列单片机配置I/O口
STC8H系列单片机I/O口结构图
STC8H系列单片机如何设置I/O口对外输出速度
STC8H系列单片机如何设置I/O口电流驱动能力
STC8H系列单片机如何降低I/O口对外辐射能力
STC8H系列单片机的定时器系统介绍
STC8H系列单片机的定时器3/4功能脚切换
STC8H系列单片机的定时器相关寄存器
STC8H系列单片机的定时器0/1相关寄存器
定时器0/1控制寄存器(TCON)
定时器0/1模式寄存器(TMOD)
定时器0模式0(16位自动重装模式)
定时器0模式1(16位不可重装模式)
定时器0模式2(8位自动重装模式)
定时器0模式3(不可屏蔽中断16位自动重装 实时操作节拍器)
定时器1模式0(16位自动重装模式)
定时器1模式1(16位不可重装模式)
定时器1模式2(8位自动重装模式)
定时器0计数寄存器(TL0 TH0)
定时器1计数寄存器(TL1 TH1)
辅助寄存器1(AUXR)
中断与时钟输出控制寄存器(INTCLKO)
定时器0计算公式
定时器1计算公式
STC8H系列单片机的定时器2(24位定时器 8位预分频+16位定时)相关寄存器
辅助寄存器1(AUXR)
中断与时钟输出控制寄存器(INTCLKO)
定时器2计数寄存器(T2L T2H)
定时器2预分频寄存器(TM2PS)
定时器2工作模式
定时器2计算公式
STC8H系列单片机的定时器3/4(24位定时器 8位预分频+16位定时)相关寄存器
定时器3/4控制寄存器(T4T3M)
定时器3计数寄存器(T3L T3H)
定时器4计数寄存器(T4L T4H)
定时器3的8位预分频寄存器(T3M3PS)
定时器4的8位预分频寄存器(T4M3PS)
定时器3工作模式
定时器4工作模式
定时器3计算公式
定时器4计算公式
STC8H系列单片机的定时器T11(24位定时器 8位预分频+16位定时)相关寄存器
定时器T11控制寄存器(T11CR)
定时器T11的8位预分频寄存器(T11PS)
定时器T11的8位计数寄存器(T11L T11H)
定时器T11工作模式
定时器T11计算公式
STC-ISP定时器计数器工具
STC8H系列单片机晶振为12MHz的定时器0的16位自动重装定时模式0的12分频定时1ms范例程序
main.c
#include "STC8H.h"
#include "intrins.h"
#include "Timer0Mode0.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
void PortModeSet()//单片机端口模式设置函数
{
P_SW2 |= 0x80;//允许访问XSFR(扩展特殊功能寄存器)
P0M0 = 0x00;//设置P0.0~P0.3为准双向口
P0M1 = 0x00;//设置P0.4~P0.7为准双向口
P1M0 = 0x00;//设置P1.0~P1.3为准双向口
P1M1 = 0x00;//设置P1.4~P1.7为准双向口
P2M0 = 0x00;//设置P2.0~P2.3为准双向口
P2M1 = 0x00;//设置P2.4~P2.7为准双向口
P3M0 = 0x00;//设置P3.0~P3.3为准双向口
P3M1 = 0x00;//设置P3.4~P3.7为准双向口
P4M0 = 0x00;//设置P4.0~P4.3为准双向口
P4M1 = 0x00;//设置P4.4~P4.7为准双向口
P5M0 = 0x00;//设置P5.0~P5.3为准双向口
P5M1 = 0x00;//设置P5.4~P5.7为准双向口
}
void main()
{
PortModeSet();//单片机端口模式设置函数
Timer0Mode0Init();//晶振为12MHz的定时器0的16位自动重装定时模式0的12分频定时1ms初始化函数
while (1);
}
Timer0Mode0.c
#include "Timer0Mode0.h"
/*****关于通过特殊功能寄存器AUXR设定定时器/计数器模式为1T或12T模式不需分频或需12分频8051系列单片机定时器初值(定时计数初值)计算的知识点*****/
/****
时钟周期(又称振荡周期):单片机晶振频率的倒数 例:单片机晶振频率12MHz 则时钟周期=[1/(12*10^6)Hz]s=0.000000083s=0.000083ms=0.083us
机器周期:单片机执行一条指令过程中需要完成一个基本操作(如:取指、译码、执行等基本操作)所需的时间 8051系列单片机的一个机器周期由6个S周期(状态周期)组成 一个时钟周期定义为一个节拍(用P表示) 二个节拍定义为一个状态周期(用S表示) 那么8051单片机的机器周期由6个状态周期组成 也就是说一个机器周期=6个状态周期=12个时钟周期=[12x[1/(12*10^6)Hz]s]s=0.000001s=0.001ms=1us
指令周期:单片机取出一条指令且执行完这条指令所需的时间
以上三者间的关系:指令周期>机器周期>时钟周期
一、以下是8051单片机定时器用12分频计算定时器初值的一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
0、计算nT单片机机器周期T公式:T=n*(1/晶振频率)=几us
1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us
2、定时时间=定时计数*一个机器周期 1ms=定时计数*1us 定时计数=1ms/1us=1000us/1us=1000次
3、定时器初值(定时计数初值)=2^n-定时计数 n为几位定时器 此处n=16 则定时器初值(定时计数初值)=2^16-1000=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256 低八位放TL0=0x18或(65536-64536)%256
二、以下是8051单片机定时器用12分频或不分频计算定时器初值的另外一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
1、综合公式:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/12/1KHz)=2^16-(12*10^6)Hz/12/1000Hz)=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256或Value >> 8 低八位放TL0=0x18或(65536-64536)%256或=Value
2、TH0 = Value >> 8;TL0 = Value;该两句代码解释如下:
(1)、TH0 = Value >> 8相当于TH0 = (65536-10000)/256=55536/256=216.9375 分析:65536-10000=55536转化成二进制为11011000 11110000 55536/256=216.9375转化成二进制为11011000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000右移8位就可以得到55536/256=216.9375的二进制数11011000
(2)、TL0 = Value相当于TL0 = (65536-时器初值的另外一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
(一)、以下是8051单片机定时器用12分频计算定时器初值:
定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲(相当于定时1ms) 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/12/1KHz)=2^16-(12*10^6)Hz/12/1000Hz)=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256或Value >> 8 低八位放TL0=0x18或(65536-64536)%256或=Value
(二)、以下是8051单片机定时器不用分频计算定时器初值:
定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲(相当于定时1ms) 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/1/1KHz)=2^16-(12*10^6)Hz/1/1000Hz)=65536-12000=53536 把53536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xd1或(65536-53536)/256或Value >> 8 低八位放TL0=0x20或(65536-53536)%256或=Value
(三)、TH0 = Value >> 8;TL0 = Value;该两句代码解释如下:
1、TH0 = Value >> 8相当于TH0 = (65536-10000)/256=55536/256=216.9375 分析:65536-10000=55536转化成二进制为11011000 11110000 55536/256=216.9375转化成二进制为11011000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000右移8位就可以得到55536/256=216.9375的二进制数11011000
2、TL0 = Value相当于TL0 = (65536-10000)%256=55536%256=240 分析:65536-10000=55536转化成二进制为11011000 11110000 55536%256=240转化成二进制为11110000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000取低8位就可以得到55536%256=240的二进制数11110000
(四)、由定时器定时初值(定时计数初值)推导出定时器定时时间步骤如下:
1、如果定时器定时初值(定时计数初值)是拆开成高八位和低八位赋值形式 如:TH0=0xfc TL0=0x18 先把高八位和低八位赋值组成一个十六位数据0xfc18 转化成十进制数据64536 用2^n-64536算出每秒产生的脉冲数 其中n为几位定时器 再根据公式计算定时时间 如:由公式:每秒产生的脉冲数=晶振频率/几分频/定时频率 转换成:每秒产生的脉冲数=晶振频率x定时频率/几分频 可求:定时频率=(每秒产生的脉冲数x几分频)/晶振频率 进而求出:定时时间=1/定时频率=1/[(每秒产生的脉冲数x几分频)/晶振频率] 转换成:晶振频率/(每秒产生的脉冲数x几分频)=定时时间
2、如果定时器定时初值(定时计数初值)是十进制数据 如:64536 直接用2^n-64536算出每秒产生的脉冲数 其中n为几位定时器 再根据公式计算定时时间 如:由公式:每秒产生的脉冲数=晶振频率/几分频/定时频率 转换成:每秒产生的脉冲数=晶振频率x定时频率/几分频 可求:定时频率=(每秒产生的脉冲数x几分频)/晶振频率 进而求出:定时时间=1/定时频率=1/[(每秒产生的脉冲数x几分频)/晶振频率] 转换成:晶振频率/(每秒产生的脉冲数x几分频)=定时时间
****/
/*****关于8051系列单片机定时器溢出率和定时器初值(定时计数初值)之间计算的知识点*****/
/****
一、定时器溢出率计算公式
1、定时器溢出率:定时器每秒溢出的次数
2、定时器溢出率计算公式表
定时方式 分频方式 公式
方式1:16位定时器 12分频(即12T 默认值) Ft=晶振频率/12/(65536-定时器初值)
方式2:8位定时器 12分频(即12T 默认值) Ft=晶振频率/12/(256-定时器初值)
方式1:16位定时器 1分频(即1T) Ft=晶振频率/1/(65536-定时器初值)
方式2:8位定时器 1分频(即1T) Ft=晶振频率/1/(256-定时器初值)
二、定时器初值(定时计数初值)计算公式
定时方式 分频方式 公式
方式1:16位定时器 12分频(即12T 默认值) 定时器初值(定时计数)=65536-晶振频率/12*定时时间
方式2:8位定时器 12分频(即12T 默认值) 定时器初值(定时计数)=256-晶振频率/12*定时时间
方式1:16位定时器 1分频(即1T) 定时器初值(定时计数)=65536-晶振频率*定时时间
方式2:8位定时器 1分频(即1T) 定时器初值(定时计数)=256-晶振频率*定时时间
****/
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
void Timer0Mode0Init()//晶振为12MHz的定时器0的16位自动重装定时模式0的12分频定时1ms初始化函数
{
AUXR &= 0x7f;//设定定时器/计数器模式计时速度为12T
TMOD &= 0xf0;//设定定时器/计数器为定时器 工作模式为16位自动重装的定时器0模式0
TH0 = 0xfc;//设定定时器0高8位初值
TL0 = 0x18;//设定定时器0低8位初值
TF0 = 0;//定时器0溢出中断标志位清0
ET0 = 1;//打开定时器0中断开关
EA = 1;//打开定时器中断总开关
TR0 = 1;//打开定时器0开关
}
void Timer0Mode0() interrupt 1//晶振为12MHz的定时器0的16位自动重装定时模式0的12分频定时1ms中断函数
{
LED = ~LED;//LED灯隔1ms亮灭
}
Timer0Mode0.h
#ifndef _TIMER0MODE0_H
#define _TIMER0MODE0_H
#include "STC8H.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
sbit LED = P1^0;//位定义LED灯连接单片机引脚P1.0
void Timer0Mode0Init();//声明晶振为12MHz的定时器0的16位自动重装定时模式0的12分频定时1ms初始化函数
#endif
STC8H系列单片机晶振为12MHz的定时器0的16位自动重装定时模式0的1分频定时1ms范例程序
main.c
#include "STC8H.h"
#include "intrins.h"
#include "Timer0Mode0.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
void PortModeSet()//单片机端口模式设置函数
{
P_SW2 |= 0x80;//允许访问XSFR(扩展特殊功能寄存器)
P0M0 = 0x00;//设置P0.0~P0.3为准双向口
P0M1 = 0x00;//设置P0.4~P0.7为准双向口
P1M0 = 0x00;//设置P1.0~P1.3为准双向口
P1M1 = 0x00;//设置P1.4~P1.7为准双向口
P2M0 = 0x00;//设置P2.0~P2.3为准双向口
P2M1 = 0x00;//设置P2.4~P2.7为准双向口
P3M0 = 0x00;//设置P3.0~P3.3为准双向口
P3M1 = 0x00;//设置P3.4~P3.7为准双向口
P4M0 = 0x00;//设置P4.0~P4.3为准双向口
P4M1 = 0x00;//设置P4.4~P4.7为准双向口
P5M0 = 0x00;//设置P5.0~P5.3为准双向口
P5M1 = 0x00;//设置P5.4~P5.7为准双向口
}
void main()
{
PortModeSet();//单片机端口模式设置函数
Timer0Mode0Init();//晶振为12MHz的定时器0的16位自动重装定时模式0的1分频定时1ms初始化函数
while (1);
}
Timer0Mode0.c
#include "Timer0Mode0.h"
/*****关于通过特殊功能寄存器AUXR设定定时器/计数器模式为1T或12T模式不需分频或需12分频8051系列单片机定时器初值(定时计数初值)计算的知识点*****/
/****
时钟周期(又称振荡周期):单片机晶振频率的倒数 例:单片机晶振频率12MHz 则时钟周期=[1/(12*10^6)Hz]s=0.000000083s=0.000083ms=0.083us
机器周期:单片机执行一条指令过程中需要完成一个基本操作(如:取指、译码、执行等基本操作)所需的时间 8051系列单片机的一个机器周期由6个S周期(状态周期)组成 一个时钟周期定义为一个节拍(用P表示) 二个节拍定义为一个状态周期(用S表示) 那么8051单片机的机器周期由6个状态周期组成 也就是说一个机器周期=6个状态周期=12个时钟周期=[12x[1/(12*10^6)Hz]s]s=0.000001s=0.001ms=1us
指令周期:单片机取出一条指令且执行完这条指令所需的时间
以上三者间的关系:指令周期>机器周期>时钟周期
一、以下是8051单片机定时器用12分频计算定时器初值的一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
0、计算nT单片机机器周期T公式:T=n*(1/晶振频率)=几us
1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us
2、定时时间=定时计数*一个机器周期 1ms=定时计数*1us 定时计数=1ms/1us=1000us/1us=1000次
3、定时器初值(定时计数初值)=2^n-定时计数 n为几位定时器 此处n=16 则定时器初值(定时计数初值)=2^16-1000=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256 低八位放TL0=0x18或(65536-64536)%256
二、以下是8051单片机定时器用12分频或不分频计算定时器初值的另外一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
1、综合公式:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/12/1KHz)=2^16-(12*10^6)Hz/12/1000Hz)=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256或Value >> 8 低八位放TL0=0x18或(65536-64536)%256或=Value
2、TH0 = Value >> 8;TL0 = Value;该两句代码解释如下:
(1)、TH0 = Value >> 8相当于TH0 = (65536-10000)/256=55536/256=216.9375 分析:65536-10000=55536转化成二进制为11011000 11110000 55536/256=216.9375转化成二进制为11011000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000右移8位就可以得到55536/256=216.9375的二进制数11011000
(2)、TL0 = Value相当于TL0 = (65536-时器初值的另外一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
(一)、以下是8051单片机定时器用12分频计算定时器初值:
定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲(相当于定时1ms) 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/12/1KHz)=2^16-(12*10^6)Hz/12/1000Hz)=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256或Value >> 8 低八位放TL0=0x18或(65536-64536)%256或=Value
(二)、以下是8051单片机定时器不用分频计算定时器初值:
定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲(相当于定时1ms) 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/1/1KHz)=2^16-(12*10^6)Hz/1/1000Hz)=65536-12000=53536 把53536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xd1或(65536-53536)/256或Value >> 8 低八位放TL0=0x20或(65536-53536)%256或=Value
(三)、TH0 = Value >> 8;TL0 = Value;该两句代码解释如下:
1、TH0 = Value >> 8相当于TH0 = (65536-10000)/256=55536/256=216.9375 分析:65536-10000=55536转化成二进制为11011000 11110000 55536/256=216.9375转化成二进制为11011000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000右移8位就可以得到55536/256=216.9375的二进制数11011000
2、TL0 = Value相当于TL0 = (65536-10000)%256=55536%256=240 分析:65536-10000=55536转化成二进制为11011000 11110000 55536%256=240转化成二进制为11110000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000取低8位就可以得到55536%256=240的二进制数11110000
(四)、由定时器定时初值(定时计数初值)推导出定时器定时时间步骤如下:
1、如果定时器定时初值(定时计数初值)是拆开成高八位和低八位赋值形式 如:TH0=0xfc TL0=0x18 先把高八位和低八位赋值组成一个十六位数据0xfc18 转化成十进制数据64536 用2^n-64536算出每秒产生的脉冲数 其中n为几位定时器 再根据公式计算定时时间 如:由公式:每秒产生的脉冲数=晶振频率/几分频/定时频率 转换成:每秒产生的脉冲数=晶振频率x定时频率/几分频 可求:定时频率=(每秒产生的脉冲数x几分频)/晶振频率 进而求出:定时时间=1/定时频率=1/[(每秒产生的脉冲数x几分频)/晶振频率] 转换成:晶振频率/(每秒产生的脉冲数x几分频)=定时时间
2、如果定时器定时初值(定时计数初值)是十进制数据 如:64536 直接用2^n-64536算出每秒产生的脉冲数 其中n为几位定时器 再根据公式计算定时时间 如:由公式:每秒产生的脉冲数=晶振频率/几分频/定时频率 转换成:每秒产生的脉冲数=晶振频率x定时频率/几分频 可求:定时频率=(每秒产生的脉冲数x几分频)/晶振频率 进而求出:定时时间=1/定时频率=1/[(每秒产生的脉冲数x几分频)/晶振频率] 转换成:晶振频率/(每秒产生的脉冲数x几分频)=定时时间
****/
/*****关于8051系列单片机定时器溢出率和定时器初值(定时计数初值)之间计算的知识点*****/
/****
一、定时器溢出率计算公式
1、定时器溢出率:定时器每秒溢出的次数
2、定时器溢出率计算公式表
定时方式 分频方式 公式
方式1:16位定时器 12分频(即12T 默认值) Ft=晶振频率/12/(65536-定时器初值)
方式2:8位定时器 12分频(即12T 默认值) Ft=晶振频率/12/(256-定时器初值)
方式1:16位定时器 1分频(即1T) Ft=晶振频率/1/(65536-定时器初值)
方式2:8位定时器 1分频(即1T) Ft=晶振频率/1/(256-定时器初值)
二、定时器初值(定时计数初值)计算公式
定时方式 分频方式 公式
方式1:16位定时器 12分频(即12T 默认值) 定时器初值(定时计数)=65536-晶振频率/12*定时时间
方式2:8位定时器 12分频(即12T 默认值) 定时器初值(定时计数)=256-晶振频率/12*定时时间
方式1:16位定时器 1分频(即1T) 定时器初值(定时计数)=65536-晶振频率*定时时间
方式2:8位定时器 1分频(即1T) 定时器初值(定时计数)=256-晶振频率*定时时间
****/
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
void Timer0Mode0Init()//晶振为12MHz的定时器0的16位自动重装定时模式0的1分频定时1ms初始化函数
{
AUXR |= 0x80;//设定定时器/计数器模式计时速度为1T
TMOD &= 0xf0;//设定定时器/计数器为定时器 工作模式为16位自动重装的定时器0模式0
TH0 = 0xd1;//设定定时器0高8位初值
TL0 = 0x20;//设定定时器0低8位初值
TF0 = 0;//定时器0溢出中断标志位清0
ET0 = 1;//打开定时器0中断开关
EA = 1;//打开定时器中断总开关
TR0 = 1;//打开定时器0开关
}
void Timer0Mode0() interrupt 1//晶振为12MHz的定时器0的16位自动重装定时模式0的1分频定时1ms中断函数
{
LED = ~LED;//LED灯隔1ms亮灭
}
Timer0Mode0.h
#ifndef _TIMER0MODE0_H
#define _TIMER0MODE0_H
#include "STC8H.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
sbit LED = P1^0;//位定义LED灯连接单片机引脚P1.0
void Timer0Mode0Init();//声明晶振为12MHz的定时器0的16位自动重装定时模式0的1分频定时1ms初始化函数
#endif
STC8H系列单片机晶振为12MHz的定时器0的16位不自动重装定时模式1的12分频定时1ms范例程序
main.c
#include "STC8H.h"
#include "intrins.h"
#include "Timer0Mode1.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
void PortModeSet()//单片机端口模式设置函数
{
P_SW2 |= 0x80;//允许访问XSFR(扩展特殊功能寄存器)
P0M0 = 0x00;//设置P0.0~P0.3为准双向口
P0M1 = 0x00;//设置P0.4~P0.7为准双向口
P1M0 = 0x00;//设置P1.0~P1.3为准双向口
P1M1 = 0x00;//设置P1.4~P1.7为准双向口
P2M0 = 0x00;//设置P2.0~P2.3为准双向口
P2M1 = 0x00;//设置P2.4~P2.7为准双向口
P3M0 = 0x00;//设置P3.0~P3.3为准双向口
P3M1 = 0x00;//设置P3.4~P3.7为准双向口
P4M0 = 0x00;//设置P4.0~P4.3为准双向口
P4M1 = 0x00;//设置P4.4~P4.7为准双向口
P5M0 = 0x00;//设置P5.0~P5.3为准双向口
P5M1 = 0x00;//设置P5.4~P5.7为准双向口
}
void main()
{
PortModeSet();//单片机端口模式设置函数
Timer0Mode1Init();//晶振为12MHz的定时器0的16位不自动重装定时模式1的12分频定时1ms初始化函数
while (1);
}
Timer0Mode1.c
#include "Timer0Mode1.h"
/*****关于通过特殊功能寄存器AUXR设定定时器/计数器模式为1T或12T模式不需分频或需12分频8051系列单片机定时器初值(定时计数初值)计算的知识点*****/
/****
时钟周期(又称振荡周期):单片机晶振频率的倒数 例:单片机晶振频率12MHz 则时钟周期=[1/(12*10^6)Hz]s=0.000000083s=0.000083ms=0.083us
机器周期:单片机执行一条指令过程中需要完成一个基本操作(如:取指、译码、执行等基本操作)所需的时间 8051系列单片机的一个机器周期由6个S周期(状态周期)组成 一个时钟周期定义为一个节拍(用P表示) 二个节拍定义为一个状态周期(用S表示) 那么8051单片机的机器周期由6个状态周期组成 也就是说一个机器周期=6个状态周期=12个时钟周期=[12x[1/(12*10^6)Hz]s]s=0.000001s=0.001ms=1us
指令周期:单片机取出一条指令且执行完这条指令所需的时间
以上三者间的关系:指令周期>机器周期>时钟周期
一、以下是8051单片机定时器用12分频计算定时器初值的一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
0、计算nT单片机机器周期T公式:T=n*(1/晶振频率)=几us
1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us
2、定时时间=定时计数*一个机器周期 1ms=定时计数*1us 定时计数=1ms/1us=1000us/1us=1000次
3、定时器初值(定时计数初值)=2^n-定时计数 n为几位定时器 此处n=16 则定时器初值(定时计数初值)=2^16-1000=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256 低八位放TL0=0x18或(65536-64536)%256
二、以下是8051单片机定时器用12分频或不分频计算定时器初值的另外一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
1、综合公式:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/12/1KHz)=2^16-(12*10^6)Hz/12/1000Hz)=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256或Value >> 8 低八位放TL0=0x18或(65536-64536)%256或=Value
2、TH0 = Value >> 8;TL0 = Value;该两句代码解释如下:
(1)、TH0 = Value >> 8相当于TH0 = (65536-10000)/256=55536/256=216.9375 分析:65536-10000=55536转化成二进制为11011000 11110000 55536/256=216.9375转化成二进制为11011000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000右移8位就可以得到55536/256=216.9375的二进制数11011000
(2)、TL0 = Value相当于TL0 = (65536-时器初值的另外一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
(一)、以下是8051单片机定时器用12分频计算定时器初值:
定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲(相当于定时1ms) 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/12/1KHz)=2^16-(12*10^6)Hz/12/1000Hz)=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256或Value >> 8 低八位放TL0=0x18或(65536-64536)%256或=Value
(二)、以下是8051单片机定时器不用分频计算定时器初值:
定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲(相当于定时1ms) 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/1/1KHz)=2^16-(12*10^6)Hz/1/1000Hz)=65536-12000=53536 把53536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xd1或(65536-53536)/256或Value >> 8 低八位放TL0=0x20或(65536-53536)%256或=Value
(三)、TH0 = Value >> 8;TL0 = Value;该两句代码解释如下:
1、TH0 = Value >> 8相当于TH0 = (65536-10000)/256=55536/256=216.9375 分析:65536-10000=55536转化成二进制为11011000 11110000 55536/256=216.9375转化成二进制为11011000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000右移8位就可以得到55536/256=216.9375的二进制数11011000
2、TL0 = Value相当于TL0 = (65536-10000)%256=55536%256=240 分析:65536-10000=55536转化成二进制为11011000 11110000 55536%256=240转化成二进制为11110000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000取低8位就可以得到55536%256=240的二进制数11110000
(四)、由定时器定时初值(定时计数初值)推导出定时器定时时间步骤如下:
1、如果定时器定时初值(定时计数初值)是拆开成高八位和低八位赋值形式 如:TH0=0xfc TL0=0x18 先把高八位和低八位赋值组成一个十六位数据0xfc18 转化成十进制数据64536 用2^n-64536算出每秒产生的脉冲数 其中n为几位定时器 再根据公式计算定时时间 如:由公式:每秒产生的脉冲数=晶振频率/几分频/定时频率 转换成:每秒产生的脉冲数=晶振频率x定时频率/几分频 可求:定时频率=(每秒产生的脉冲数x几分频)/晶振频率 进而求出:定时时间=1/定时频率=1/[(每秒产生的脉冲数x几分频)/晶振频率] 转换成:晶振频率/(每秒产生的脉冲数x几分频)=定时时间
2、如果定时器定时初值(定时计数初值)是十进制数据 如:64536 直接用2^n-64536算出每秒产生的脉冲数 其中n为几位定时器 再根据公式计算定时时间 如:由公式:每秒产生的脉冲数=晶振频率/几分频/定时频率 转换成:每秒产生的脉冲数=晶振频率x定时频率/几分频 可求:定时频率=(每秒产生的脉冲数x几分频)/晶振频率 进而求出:定时时间=1/定时频率=1/[(每秒产生的脉冲数x几分频)/晶振频率] 转换成:晶振频率/(每秒产生的脉冲数x几分频)=定时时间
****/
/*****关于8051系列单片机定时器溢出率和定时器初值(定时计数初值)之间计算的知识点*****/
/****
一、定时器溢出率计算公式
1、定时器溢出率:定时器每秒溢出的次数
2、定时器溢出率计算公式表
定时方式 分频方式 公式
方式1:16位定时器 12分频(即12T 默认值) Ft=晶振频率/12/(65536-定时器初值)
方式2:8位定时器 12分频(即12T 默认值) Ft=晶振频率/12/(256-定时器初值)
方式1:16位定时器 1分频(即1T) Ft=晶振频率/1/(65536-定时器初值)
方式2:8位定时器 1分频(即1T) Ft=晶振频率/1/(256-定时器初值)
二、定时器初值(定时计数初值)计算公式
定时方式 分频方式 公式
方式1:16位定时器 12分频(即12T 默认值) 定时器初值(定时计数)=65536-晶振频率/12*定时时间
方式2:8位定时器 12分频(即12T 默认值) 定时器初值(定时计数)=256-晶振频率/12*定时时间
方式1:16位定时器 1分频(即1T) 定时器初值(定时计数)=65536-晶振频率*定时时间
方式2:8位定时器 1分频(即1T) 定时器初值(定时计数)=256-晶振频率*定时时间
****/
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
void Timer0Mode1Init()//晶振为12MHz的定时器0的16位不自动重装定时模式1的12分频定时1ms初始化函数
{
AUXR &= 0x7f;//设定定时器/计数器模式计时速度为12T
TMOD &= 0xf0;//设定定时器/计数器工作模式清0
TMOD |= 0x01;//设定定时器/计数器为定时器 工作模式为16位不自动重装的定时器0模式1
TH0 = 0xfc;//设定定时器0高8位初值
TL0 = 0x18;//设定定时器0低8位初值
TF0 = 0;//定时器0溢出中断标志位清0
ET0 = 1;//打开定时器0中断开关
EA = 1;//打开定时器中断总开关
TR0 = 1;//打开定时器0开关
}
void Timer0Mode1() interrupt 1//晶振为12MHz的定时器0的16位不自动重装定时模式1的12分频定时1ms中断函数
{
TH0 = 0xfc;//重装设定定时器0高8位初值
TL0 = 0x18;//重装设定定时器0低8位初值
LED = ~LED;//LED灯隔1ms亮灭
}
Timer0Mode1.h
#ifndef _TIMER0MODE1_H
#define _TIMER0MODE1_H
#include "STC8H.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
sbit LED = P1^0;//位定义LED灯连接单片机引脚P1.0
void Timer0Mode1Init();//声明晶振为12MHz的定时器0的16位不自动重装定时模式1的12分频定时1ms初始化函数
#endif
STC8H系列单片机晶振为12MHz的定时器0的16位不自动重装定时模式1的1分频定时1ms范例程序
main.c
#include "STC8H.h"
#include "intrins.h"
#include "Timer0Mode1.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
void PortModeSet()//单片机端口模式设置函数
{
P_SW2 |= 0x80;//允许访问XSFR(扩展特殊功能寄存器)
P0M0 = 0x00;//设置P0.0~P0.3为准双向口
P0M1 = 0x00;//设置P0.4~P0.7为准双向口
P1M0 = 0x00;//设置P1.0~P1.3为准双向口
P1M1 = 0x00;//设置P1.4~P1.7为准双向口
P2M0 = 0x00;//设置P2.0~P2.3为准双向口
P2M1 = 0x00;//设置P2.4~P2.7为准双向口
P3M0 = 0x00;//设置P3.0~P3.3为准双向口
P3M1 = 0x00;//设置P3.4~P3.7为准双向口
P4M0 = 0x00;//设置P4.0~P4.3为准双向口
P4M1 = 0x00;//设置P4.4~P4.7为准双向口
P5M0 = 0x00;//设置P5.0~P5.3为准双向口
P5M1 = 0x00;//设置P5.4~P5.7为准双向口
}
void main()
{
PortModeSet();//单片机端口模式设置函数
Timer0Mode1Init();//晶振为12MHz的定时器0的16位不自动重装定时模式1的1分频定时1ms初始化函数
while (1);
}
Timer0Mode1.c
#include "Timer0Mode1.h"
/*****关于通过特殊功能寄存器AUXR设定定时器/计数器模式为1T或12T模式不需分频或需12分频8051系列单片机定时器初值(定时计数初值)计算的知识点*****/
/****
时钟周期(又称振荡周期):单片机晶振频率的倒数 例:单片机晶振频率12MHz 则时钟周期=[1/(12*10^6)Hz]s=0.000000083s=0.000083ms=0.083us
机器周期:单片机执行一条指令过程中需要完成一个基本操作(如:取指、译码、执行等基本操作)所需的时间 8051系列单片机的一个机器周期由6个S周期(状态周期)组成 一个时钟周期定义为一个节拍(用P表示) 二个节拍定义为一个状态周期(用S表示) 那么8051单片机的机器周期由6个状态周期组成 也就是说一个机器周期=6个状态周期=12个时钟周期=[12x[1/(12*10^6)Hz]s]s=0.000001s=0.001ms=1us
指令周期:单片机取出一条指令且执行完这条指令所需的时间
以上三者间的关系:指令周期>机器周期>时钟周期
一、以下是8051单片机定时器用12分频计算定时器初值的一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
0、计算nT单片机机器周期T公式:T=n*(1/晶振频率)=几us
1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us
2、定时时间=定时计数*一个机器周期 1ms=定时计数*1us 定时计数=1ms/1us=1000us/1us=1000次
3、定时器初值(定时计数初值)=2^n-定时计数 n为几位定时器 此处n=16 则定时器初值(定时计数初值)=2^16-1000=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256 低八位放TL0=0x18或(65536-64536)%256
二、以下是8051单片机定时器用12分频或不分频计算定时器初值的另外一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
1、综合公式:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/12/1KHz)=2^16-(12*10^6)Hz/12/1000Hz)=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256或Value >> 8 低八位放TL0=0x18或(65536-64536)%256或=Value
2、TH0 = Value >> 8;TL0 = Value;该两句代码解释如下:
(1)、TH0 = Value >> 8相当于TH0 = (65536-10000)/256=55536/256=216.9375 分析:65536-10000=55536转化成二进制为11011000 11110000 55536/256=216.9375转化成二进制为11011000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000右移8位就可以得到55536/256=216.9375的二进制数11011000
(2)、TL0 = Value相当于TL0 = (65536-时器初值的另外一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
(一)、以下是8051单片机定时器用12分频计算定时器初值:
定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲(相当于定时1ms) 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/12/1KHz)=2^16-(12*10^6)Hz/12/1000Hz)=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256或Value >> 8 低八位放TL0=0x18或(65536-64536)%256或=Value
(二)、以下是8051单片机定时器不用分频计算定时器初值:
定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲(相当于定时1ms) 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/1/1KHz)=2^16-(12*10^6)Hz/1/1000Hz)=65536-12000=53536 把53536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xd1或(65536-53536)/256或Value >> 8 低八位放TL0=0x20或(65536-53536)%256或=Value
(三)、TH0 = Value >> 8;TL0 = Value;该两句代码解释如下:
1、TH0 = Value >> 8相当于TH0 = (65536-10000)/256=55536/256=216.9375 分析:65536-10000=55536转化成二进制为11011000 11110000 55536/256=216.9375转化成二进制为11011000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000右移8位就可以得到55536/256=216.9375的二进制数11011000
2、TL0 = Value相当于TL0 = (65536-10000)%256=55536%256=240 分析:65536-10000=55536转化成二进制为11011000 11110000 55536%256=240转化成二进制为11110000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000取低8位就可以得到55536%256=240的二进制数11110000
(四)、由定时器定时初值(定时计数初值)推导出定时器定时时间步骤如下:
1、如果定时器定时初值(定时计数初值)是拆开成高八位和低八位赋值形式 如:TH0=0xfc TL0=0x18 先把高八位和低八位赋值组成一个十六位数据0xfc18 转化成十进制数据64536 用2^n-64536算出每秒产生的脉冲数 其中n为几位定时器 再根据公式计算定时时间 如:由公式:每秒产生的脉冲数=晶振频率/几分频/定时频率 转换成:每秒产生的脉冲数=晶振频率x定时频率/几分频 可求:定时频率=(每秒产生的脉冲数x几分频)/晶振频率 进而求出:定时时间=1/定时频率=1/[(每秒产生的脉冲数x几分频)/晶振频率] 转换成:晶振频率/(每秒产生的脉冲数x几分频)=定时时间
2、如果定时器定时初值(定时计数初值)是十进制数据 如:64536 直接用2^n-64536算出每秒产生的脉冲数 其中n为几位定时器 再根据公式计算定时时间 如:由公式:每秒产生的脉冲数=晶振频率/几分频/定时频率 转换成:每秒产生的脉冲数=晶振频率x定时频率/几分频 可求:定时频率=(每秒产生的脉冲数x几分频)/晶振频率 进而求出:定时时间=1/定时频率=1/[(每秒产生的脉冲数x几分频)/晶振频率] 转换成:晶振频率/(每秒产生的脉冲数x几分频)=定时时间
****/
/*****关于8051系列单片机定时器溢出率和定时器初值(定时计数初值)之间计算的知识点*****/
/****
一、定时器溢出率计算公式
1、定时器溢出率:定时器每秒溢出的次数
2、定时器溢出率计算公式表
定时方式 分频方式 公式
方式1:16位定时器 12分频(即12T 默认值) Ft=晶振频率/12/(65536-定时器初值)
方式2:8位定时器 12分频(即12T 默认值) Ft=晶振频率/12/(256-定时器初值)
方式1:16位定时器 1分频(即1T) Ft=晶振频率/1/(65536-定时器初值)
方式2:8位定时器 1分频(即1T) Ft=晶振频率/1/(256-定时器初值)
二、定时器初值(定时计数初值)计算公式
定时方式 分频方式 公式
方式1:16位定时器 12分频(即12T 默认值) 定时器初值(定时计数)=65536-晶振频率/12*定时时间
方式2:8位定时器 12分频(即12T 默认值) 定时器初值(定时计数)=256-晶振频率/12*定时时间
方式1:16位定时器 1分频(即1T) 定时器初值(定时计数)=65536-晶振频率*定时时间
方式2:8位定时器 1分频(即1T) 定时器初值(定时计数)=256-晶振频率*定时时间
****/
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
void Timer0Mode1Init()//晶振为12MHz的定时器0的16位不自动重装定时模式1的1分频定时1ms初始化函数
{
AUXR |= 0x80;//设定定时器/计数器模式计时速度为1T
TMOD &= 0xf0;//设定定时器/计数器工作模式清0
TMOD |= 0x01;//设定定时器/计数器为定时器 工作模式为16位不自动重装的定时器0模式1
TH0 = 0xd1;//设定定时器0高8位初值
TL0 = 0x20;//设定定时器0低8位初值
TF0 = 0;//定时器0溢出中断标志位清0
ET0 = 1;//打开定时器0中断开关
EA = 1;//打开定时器中断总开关
TR0 = 1;//打开定时器0开关
}
void Timer0Mode1() interrupt 1//晶振为12MHz的定时器0的16位不自动重装定时模式1的1分频定时1ms中断函数
{
TH0 = 0xd1;//重装设定定时器0高8位初值
TL0 = 0x20;//重装设定定时器0低8位初值
LED = ~LED;//LED灯隔1ms亮灭
}
Timer0Mode1.h
#ifndef _TIMER0MODE1_H
#define _TIMER0MODE1_H
#include "STC8H.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
sbit LED = P1^0;//位定义LED灯连接单片机引脚P1.0
void Timer0Mode1Init();//声明晶振为12MHz的定时器0的16位不自动重装定时模式1的1分频定时1ms初始化函数
#endif
STC8H系列单片机晶振为12MHz的定时器0的8位自动重装定时模式2的12分频定时0.1ms范例程序
main.c
#include "STC8H.h"
#include "intrins.h"
#include "Timer0Mode2.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
void PortModeSet()//单片机端口模式设置函数
{
P_SW2 |= 0x80;//允许访问XSFR(扩展特殊功能寄存器)
P0M0 = 0x00;//设置P0.0~P0.3为准双向口
P0M1 = 0x00;//设置P0.4~P0.7为准双向口
P1M0 = 0x00;//设置P1.0~P1.3为准双向口
P1M1 = 0x00;//设置P1.4~P1.7为准双向口
P2M0 = 0x00;//设置P2.0~P2.3为准双向口
P2M1 = 0x00;//设置P2.4~P2.7为准双向口
P3M0 = 0x00;//设置P3.0~P3.3为准双向口
P3M1 = 0x00;//设置P3.4~P3.7为准双向口
P4M0 = 0x00;//设置P4.0~P4.3为准双向口
P4M1 = 0x00;//设置P4.4~P4.7为准双向口
P5M0 = 0x00;//设置P5.0~P5.3为准双向口
P5M1 = 0x00;//设置P5.4~P5.7为准双向口
}
void main()
{
PortModeSet();//单片机端口模式设置函数
Timer0Mode2Init();//晶振为12MHz的定时器0的8位自动重装定时模式2的12分频定时0.1ms初始化函数
while (1);
}
Timer0Mode2.c
#include "Timer0Mode2.h"
/*****关于通过特殊功能寄存器AUXR设定定时器/计数器模式为1T或12T模式不需分频或需12分频8051系列单片机定时器初值(定时计数初值)计算的知识点*****/
/****
时钟周期(又称振荡周期):单片机晶振频率的倒数 例:单片机晶振频率12MHz 则时钟周期=[1/(12*10^6)Hz]s=0.000000083s=0.000083ms=0.083us
机器周期:单片机执行一条指令过程中需要完成一个基本操作(如:取指、译码、执行等基本操作)所需的时间 8051系列单片机的一个机器周期由6个S周期(状态周期)组成 一个时钟周期定义为一个节拍(用P表示) 二个节拍定义为一个状态周期(用S表示) 那么8051单片机的机器周期由6个状态周期组成 也就是说一个机器周期=6个状态周期=12个时钟周期=[12x[1/(12*10^6)Hz]s]s=0.000001s=0.001ms=1us
指令周期:单片机取出一条指令且执行完这条指令所需的时间
以上三者间的关系:指令周期>机器周期>时钟周期
一、以下是8051单片机定时器用12分频计算定时器初值的一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
0、计算nT单片机机器周期T公式:T=n*(1/晶振频率)=几us
1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us
2、定时时间=定时计数*一个机器周期 1ms=定时计数*1us 定时计数=1ms/1us=1000us/1us=1000次
3、定时器初值(定时计数初值)=2^n-定时计数 n为几位定时器 此处n=16 则定时器初值(定时计数初值)=2^16-1000=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256 低八位放TL0=0x18或(65536-64536)%256
二、以下是8051单片机定时器用12分频或不分频计算定时器初值的另外一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
1、综合公式:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/12/1KHz)=2^16-(12*10^6)Hz/12/1000Hz)=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256或Value >> 8 低八位放TL0=0x18或(65536-64536)%256或=Value
2、TH0 = Value >> 8;TL0 = Value;该两句代码解释如下:
(1)、TH0 = Value >> 8相当于TH0 = (65536-10000)/256=55536/256=216.9375 分析:65536-10000=55536转化成二进制为11011000 11110000 55536/256=216.9375转化成二进制为11011000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000右移8位就可以得到55536/256=216.9375的二进制数11011000
(2)、TL0 = Value相当于TL0 = (65536-时器初值的另外一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
(一)、以下是8051单片机定时器用12分频计算定时器初值:
定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲(相当于定时1ms) 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/12/1KHz)=2^16-(12*10^6)Hz/12/1000Hz)=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256或Value >> 8 低八位放TL0=0x18或(65536-64536)%256或=Value
(二)、以下是8051单片机定时器不用分频计算定时器初值:
定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲(相当于定时1ms) 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/1/1KHz)=2^16-(12*10^6)Hz/1/1000Hz)=65536-12000=53536 把53536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xd1或(65536-53536)/256或Value >> 8 低八位放TL0=0x20或(65536-53536)%256或=Value
(三)、TH0 = Value >> 8;TL0 = Value;该两句代码解释如下:
1、TH0 = Value >> 8相当于TH0 = (65536-10000)/256=55536/256=216.9375 分析:65536-10000=55536转化成二进制为11011000 11110000 55536/256=216.9375转化成二进制为11011000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000右移8位就可以得到55536/256=216.9375的二进制数11011000
2、TL0 = Value相当于TL0 = (65536-10000)%256=55536%256=240 分析:65536-10000=55536转化成二进制为11011000 11110000 55536%256=240转化成二进制为11110000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000取低8位就可以得到55536%256=240的二进制数11110000
(四)、由定时器定时初值(定时计数初值)推导出定时器定时时间步骤如下:
1、如果定时器定时初值(定时计数初值)是拆开成高八位和低八位赋值形式 如:TH0=0xfc TL0=0x18 先把高八位和低八位赋值组成一个十六位数据0xfc18 转化成十进制数据64536 用2^n-64536算出每秒产生的脉冲数 其中n为几位定时器 再根据公式计算定时时间 如:由公式:每秒产生的脉冲数=晶振频率/几分频/定时频率 转换成:每秒产生的脉冲数=晶振频率x定时频率/几分频 可求:定时频率=(每秒产生的脉冲数x几分频)/晶振频率 进而求出:定时时间=1/定时频率=1/[(每秒产生的脉冲数x几分频)/晶振频率] 转换成:晶振频率/(每秒产生的脉冲数x几分频)=定时时间
2、如果定时器定时初值(定时计数初值)是十进制数据 如:64536 直接用2^n-64536算出每秒产生的脉冲数 其中n为几位定时器 再根据公式计算定时时间 如:由公式:每秒产生的脉冲数=晶振频率/几分频/定时频率 转换成:每秒产生的脉冲数=晶振频率x定时频率/几分频 可求:定时频率=(每秒产生的脉冲数x几分频)/晶振频率 进而求出:定时时间=1/定时频率=1/[(每秒产生的脉冲数x几分频)/晶振频率] 转换成:晶振频率/(每秒产生的脉冲数x几分频)=定时时间
****/
/*****关于8051系列单片机定时器溢出率和定时器初值(定时计数初值)之间计算的知识点*****/
/****
一、定时器溢出率计算公式
1、定时器溢出率:定时器每秒溢出的次数
2、定时器溢出率计算公式表
定时方式 分频方式 公式
方式1:16位定时器 12分频(即12T 默认值) Ft=晶振频率/12/(65536-定时器初值)
方式2:8位定时器 12分频(即12T 默认值) Ft=晶振频率/12/(256-定时器初值)
方式1:16位定时器 1分频(即1T) Ft=晶振频率/1/(65536-定时器初值)
方式2:8位定时器 1分频(即1T) Ft=晶振频率/1/(256-定时器初值)
二、定时器初值(定时计数初值)计算公式
定时方式 分频方式 公式
方式1:16位定时器 12分频(即12T 默认值) 定时器初值(定时计数)=65536-晶振频率/12*定时时间
方式2:8位定时器 12分频(即12T 默认值) 定时器初值(定时计数)=256-晶振频率/12*定时时间
方式1:16位定时器 1分频(即1T) 定时器初值(定时计数)=65536-晶振频率*定时时间
方式2:8位定时器 1分频(即1T) 定时器初值(定时计数)=256-晶振频率*定时时间
****/
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
void Timer0Mode2Init()//晶振为12MHz的定时器0的8位自动重装定时模式2的12分频定时0.1ms初始化函数
{
AUXR &= 0x7f;//设定定时器/计数器模式计时速度为12T
TMOD &= 0xf0;//设定定时器/计数器工作模式清0
TMOD |= 0x02;//设定定时器/计数器为定时器 工作模式为8位自动重装的定时器0模式2
TH0 = 0x9c;//设定定时器0高8位初值
TL0 = 0x9c;//设定定时器0低8位初值
TF0 = 0;//定时器0溢出中断标志位清0
ET0 = 1;//打开定时器0中断开关
EA = 1;//打开定时器中断总开关
TR0 = 1;//打开定时器0开关
}
void Timer0Mode2() interrupt 1//晶振为12MHz的定时器0的8位自动重装定时模式2的12分频定时0.1ms中断函数
{
LED = ~LED;//LED灯隔0.1ms亮灭
}
Timer0Mode2.h
#ifndef _TIMER0MODE2_H
#define _TIMER0MODE2_H
#include "STC8H.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
sbit LED = P1^0;//位定义LED灯连接单片机引脚P1.0
void Timer0Mode2Init();//声明晶振为12MHz的定时器0的8位自动重装定时模式2的12分频定时0.1ms初始化函数
#endif
STC8H系列单片机晶振为12MHz的定时器0的8位自动重装定时模式2的1分频定时0.01ms范例程序
main.c
#include "STC8H.h"
#include "intrins.h"
#include "Timer0Mode2.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
void PortModeSet()//单片机端口模式设置函数
{
P_SW2 |= 0x80;//允许访问XSFR(扩展特殊功能寄存器)
P0M0 = 0x00;//设置P0.0~P0.3为准双向口
P0M1 = 0x00;//设置P0.4~P0.7为准双向口
P1M0 = 0x00;//设置P1.0~P1.3为准双向口
P1M1 = 0x00;//设置P1.4~P1.7为准双向口
P2M0 = 0x00;//设置P2.0~P2.3为准双向口
P2M1 = 0x00;//设置P2.4~P2.7为准双向口
P3M0 = 0x00;//设置P3.0~P3.3为准双向口
P3M1 = 0x00;//设置P3.4~P3.7为准双向口
P4M0 = 0x00;//设置P4.0~P4.3为准双向口
P4M1 = 0x00;//设置P4.4~P4.7为准双向口
P5M0 = 0x00;//设置P5.0~P5.3为准双向口
P5M1 = 0x00;//设置P5.4~P5.7为准双向口
}
void main()
{
PortModeSet();//单片机端口模式设置函数
Timer0Mode2Init();//晶振为12MHz的定时器0的8位自动重装定时模式2的1分频定时0.01ms初始化函数
while (1);
}
Timer0Mode2.c
#include "Timer0Mode2.h"
/*****关于通过特殊功能寄存器AUXR设定定时器/计数器模式为1T或12T模式不需分频或需12分频8051系列单片机定时器初值(定时计数初值)计算的知识点*****/
/****
时钟周期(又称振荡周期):单片机晶振频率的倒数 例:单片机晶振频率12MHz 则时钟周期=[1/(12*10^6)Hz]s=0.000000083s=0.000083ms=0.083us
机器周期:单片机执行一条指令过程中需要完成一个基本操作(如:取指、译码、执行等基本操作)所需的时间 8051系列单片机的一个机器周期由6个S周期(状态周期)组成 一个时钟周期定义为一个节拍(用P表示) 二个节拍定义为一个状态周期(用S表示) 那么8051单片机的机器周期由6个状态周期组成 也就是说一个机器周期=6个状态周期=12个时钟周期=[12x[1/(12*10^6)Hz]s]s=0.000001s=0.001ms=1us
指令周期:单片机取出一条指令且执行完这条指令所需的时间
以上三者间的关系:指令周期>机器周期>时钟周期
一、以下是8051单片机定时器用12分频计算定时器初值的一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
0、计算nT单片机机器周期T公式:T=n*(1/晶振频率)=几us
1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us
2、定时时间=定时计数*一个机器周期 1ms=定时计数*1us 定时计数=1ms/1us=1000us/1us=1000次
3、定时器初值(定时计数初值)=2^n-定时计数 n为几位定时器 此处n=16 则定时器初值(定时计数初值)=2^16-1000=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256 低八位放TL0=0x18或(65536-64536)%256
二、以下是8051单片机定时器用12分频或不分频计算定时器初值的另外一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
1、综合公式:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/12/1KHz)=2^16-(12*10^6)Hz/12/1000Hz)=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256或Value >> 8 低八位放TL0=0x18或(65536-64536)%256或=Value
2、TH0 = Value >> 8;TL0 = Value;该两句代码解释如下:
(1)、TH0 = Value >> 8相当于TH0 = (65536-10000)/256=55536/256=216.9375 分析:65536-10000=55536转化成二进制为11011000 11110000 55536/256=216.9375转化成二进制为11011000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000右移8位就可以得到55536/256=216.9375的二进制数11011000
(2)、TL0 = Value相当于TL0 = (65536-时器初值的另外一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
(一)、以下是8051单片机定时器用12分频计算定时器初值:
定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲(相当于定时1ms) 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/12/1KHz)=2^16-(12*10^6)Hz/12/1000Hz)=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256或Value >> 8 低八位放TL0=0x18或(65536-64536)%256或=Value
(二)、以下是8051单片机定时器不用分频计算定时器初值:
定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲(相当于定时1ms) 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/1/1KHz)=2^16-(12*10^6)Hz/1/1000Hz)=65536-12000=53536 把53536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xd1或(65536-53536)/256或Value >> 8 低八位放TL0=0x20或(65536-53536)%256或=Value
(三)、TH0 = Value >> 8;TL0 = Value;该两句代码解释如下:
1、TH0 = Value >> 8相当于TH0 = (65536-10000)/256=55536/256=216.9375 分析:65536-10000=55536转化成二进制为11011000 11110000 55536/256=216.9375转化成二进制为11011000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000右移8位就可以得到55536/256=216.9375的二进制数11011000
2、TL0 = Value相当于TL0 = (65536-10000)%256=55536%256=240 分析:65536-10000=55536转化成二进制为11011000 11110000 55536%256=240转化成二进制为11110000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000取低8位就可以得到55536%256=240的二进制数11110000
(四)、由定时器定时初值(定时计数初值)推导出定时器定时时间步骤如下:
1、如果定时器定时初值(定时计数初值)是拆开成高八位和低八位赋值形式 如:TH0=0xfc TL0=0x18 先把高八位和低八位赋值组成一个十六位数据0xfc18 转化成十进制数据64536 用2^n-64536算出每秒产生的脉冲数 其中n为几位定时器 再根据公式计算定时时间 如:由公式:每秒产生的脉冲数=晶振频率/几分频/定时频率 转换成:每秒产生的脉冲数=晶振频率x定时频率/几分频 可求:定时频率=(每秒产生的脉冲数x几分频)/晶振频率 进而求出:定时时间=1/定时频率=1/[(每秒产生的脉冲数x几分频)/晶振频率] 转换成:晶振频率/(每秒产生的脉冲数x几分频)=定时时间
2、如果定时器定时初值(定时计数初值)是十进制数据 如:64536 直接用2^n-64536算出每秒产生的脉冲数 其中n为几位定时器 再根据公式计算定时时间 如:由公式:每秒产生的脉冲数=晶振频率/几分频/定时频率 转换成:每秒产生的脉冲数=晶振频率x定时频率/几分频 可求:定时频率=(每秒产生的脉冲数x几分频)/晶振频率 进而求出:定时时间=1/定时频率=1/[(每秒产生的脉冲数x几分频)/晶振频率] 转换成:晶振频率/(每秒产生的脉冲数x几分频)=定时时间
****/
/*****关于8051系列单片机定时器溢出率和定时器初值(定时计数初值)之间计算的知识点*****/
/****
一、定时器溢出率计算公式
1、定时器溢出率:定时器每秒溢出的次数
2、定时器溢出率计算公式表
定时方式 分频方式 公式
方式1:16位定时器 12分频(即12T 默认值) Ft=晶振频率/12/(65536-定时器初值)
方式2:8位定时器 12分频(即12T 默认值) Ft=晶振频率/12/(256-定时器初值)
方式1:16位定时器 1分频(即1T) Ft=晶振频率/1/(65536-定时器初值)
方式2:8位定时器 1分频(即1T) Ft=晶振频率/1/(256-定时器初值)
二、定时器初值(定时计数初值)计算公式
定时方式 分频方式 公式
方式1:16位定时器 12分频(即12T 默认值) 定时器初值(定时计数)=65536-晶振频率/12*定时时间
方式2:8位定时器 12分频(即12T 默认值) 定时器初值(定时计数)=256-晶振频率/12*定时时间
方式1:16位定时器 1分频(即1T) 定时器初值(定时计数)=65536-晶振频率*定时时间
方式2:8位定时器 1分频(即1T) 定时器初值(定时计数)=256-晶振频率*定时时间
****/
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
void Timer0Mode2Init()//晶振为12MHz的定时器0的8位自动重装定时模式2的1分频定时0.01ms初始化函数
{
AUXR |= 0x80;//设定定时器/计数器模式计时速度为1T
TMOD &= 0xf0;//设定定时器/计数器工作模式清0
TMOD |= 0x02;//设定定时器/计数器为定时器 工作模式为8位自动重装的定时器0模式2
TH0 = 0x88;//设定定时器0高8位初值
TL0 = 0x88;//设定定时器0低8位初值
TF0 = 0;//定时器0溢出中断标志位清0
ET0 = 1;//打开定时器0中断开关
EA = 1;//打开定时器中断总开关
TR0 = 1;//打开定时器0开关
}
void Timer0Mode2() interrupt 1//晶振为12MHz的定时器0的8位自动重装定时模式2的1分频定时0.01ms中断函数
{
LED = ~LED;//LED灯隔0.01ms亮灭
}
Timer0Mode2.h
#ifndef _TIMER0MODE2_H
#define _TIMER0MODE2_H
#include "STC8H.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
sbit LED = P1^0;//位定义LED灯连接单片机引脚P1.0
void Timer0Mode2Init();//声明晶振为12MHz的定时器0的8位自动重装定时模式2的1分频定时0.01ms初始化函数
#endif
STC8H系列单片机晶振为12MHz的定时器0的16位自动重装不可屏蔽(就是不受EA = 1控制)定时模式3的12分频定时1ms范例程序
main.c
#include "STC8H.h"
#include "intrins.h"
#include "Timer0Mode3.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
void PortModeSet()//单片机端口模式设置函数
{
P_SW2 |= 0x80;//允许访问XSFR(扩展特殊功能寄存器)
P0M0 = 0x00;//设置P0.0~P0.3为准双向口
P0M1 = 0x00;//设置P0.4~P0.7为准双向口
P1M0 = 0x00;//设置P1.0~P1.3为准双向口
P1M1 = 0x00;//设置P1.4~P1.7为准双向口
P2M0 = 0x00;//设置P2.0~P2.3为准双向口
P2M1 = 0x00;//设置P2.4~P2.7为准双向口
P3M0 = 0x00;//设置P3.0~P3.3为准双向口
P3M1 = 0x00