基于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相关寄存器
- 定时器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范例程序
- 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范例程序
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//自定义无符号整数型为uintvoid 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/晶振频率)=几us1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us2、定时时间=定时计数*一个机器周期 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的二进制数110110002、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//自定义无符号整数型为uintvoid Timer0Mode0Init()//晶振为12MHz的定时器0的16位自动重装定时模式0的12分频定时1ms初始化函数
{AUXR &= 0x7f;//设定定时器/计数器模式为12TTMOD &= 0xf0;//设定定时器/计数器为定时器 工作模式为16位自动重装的定时器0模式0TH0 = 0xfc;//设定定时器0高8位初值TL0 = 0x18;//设定定时器0低8位初值TF0 = 0;//定时器0溢出中断标志位清0ET0 = 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//自定义无符号整数型为uintvoid 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/晶振频率)=几us1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us2、定时时间=定时计数*一个机器周期 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的二进制数110110002、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//自定义无符号整数型为uintvoid Timer0Mode0Init()//晶振为12MHz的定时器0的16位自动重装定时模式0的1分频定时1ms初始化函数
{AUXR &= 0x80;//设定定时器/计数器模式为1TTMOD &= 0xf0;//设定定时器/计数器为定时器 工作模式为16位自动重装的定时器0模式0TH0 = 0xd1;//设定定时器0高8位初值TL0 = 0x20;//设定定时器0低8位初值TF0 = 0;//定时器0溢出中断标志位清0ET0 = 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//自定义无符号整数型为uintvoid 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/晶振频率)=几us1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us2、定时时间=定时计数*一个机器周期 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的二进制数110110002、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//自定义无符号整数型为uintvoid Timer0Mode1Init()//晶振为12MHz的定时器0的16位不自动重装定时模式1的12分频定时1ms初始化函数
{AUXR &= 0x7f;//设定定时器/计数器模式为12TTMOD &= 0xf0;//设定定时器/计数器工作模式清0TMOD |= 0x01;//设定定时器/计数器为定时器 工作模式为16位不自动重装的定时器0模式1TH0 = 0xfc;//设定定时器0高8位初值TL0 = 0x18;//设定定时器0低8位初值TF0 = 0;//定时器0溢出中断标志位清0ET0 = 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//自定义无符号整数型为uintvoid 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/晶振频率)=几us1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us2、定时时间=定时计数*一个机器周期 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的二进制数110110002、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//自定义无符号整数型为uintvoid Timer0Mode1Init()//晶振为12MHz的定时器0的16位不自动重装定时模式1的1分频定时1ms初始化函数
{AUXR &= 0x80;//设定定时器/计数器模式为1TTMOD &= 0xf0;//设定定时器/计数器工作模式清0TMOD |= 0x01;//设定定时器/计数器为定时器 工作模式为16位不自动重装的定时器0模式1TH0 = 0xd1;//设定定时器0高8位初值TL0 = 0x20;//设定定时器0低8位初值TF0 = 0;//定时器0溢出中断标志位清0ET0 = 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//自定义无符号整数型为uintvoid 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/晶振频率)=几us1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us2、定时时间=定时计数*一个机器周期 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的二进制数110110002、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//自定义无符号整数型为uintvoid Timer0Mode2Init()//晶振为12MHz的定时器0的8位自动重装定时模式2的12分频定时0.1ms初始化函数
{AUXR &= 0x7f;//设定定时器/计数器模式为12TTMOD &= 0xf0;//设定定时器/计数器工作模式清0TMOD |= 0x02;//设定定时器/计数器为定时器 工作模式为8位自动重装的定时器0模式2TH0 = 0x9c;//设定定时器0高8位初值TL0 = 0x9c;//设定定时器0低8位初值TF0 = 0;//定时器0溢出中断标志位清0ET0 = 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//自定义无符号整数型为uintvoid 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/晶振频率)=几us1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us2、定时时间=定时计数*一个机器周期 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的二进制数110110002、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//自定义无符号整数型为uintvoid Timer0Mode2Init()//晶振为12MHz的定时器0的8位自动重装定时模式2的1分频定时0.01ms初始化函数
{AUXR &= 0x80;//设定定时器/计数器模式为1TTMOD &= 0xf0;//设定定时器/计数器工作模式清0TMOD |= 0x02;//设定定时器/计数器为定时器 工作模式为8位自动重装的定时器0模式2TH0 = 0x88;//设定定时器0高8位初值TL0 = 0x88;//设定定时器0低8位初值TF0 = 0;//定时器0溢出中断标志位清0ET0 = 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//自定义无符号整数型为uintvoid 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();//单片机端口模式设置函数Timer0Mode3Init();//晶振为12MHz的定时器0的16位自动重装不可屏蔽(就是不受EA = 1控制)定时模式3的12分频定时1ms初始化函数 while (1);
}
Timer0Mode3.c
#include "Timer0Mode3.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/晶振频率)=几us1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us2、定时时间=定时计数*一个机器周期 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的二进制数110110002、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//自定义无符号整数型为uintvoid Timer0Mode3Init()//晶振为12MHz的定时器0的16位自动重装不可屏蔽(就是不受EA = 1控制)定时模式3的12分频定时1ms初始化函数
{AUXR &= 0x7f;//设定定时器/计数器模式为12TTMOD &= 0xf0;//设定定时器/计数器工作模式清0TMOD |= 0x02;//设定定时器/计数器为定时器 工作模式为16位自动重装的定时器0模式3TH0 = 0xfc;//设定定时器0高8位初值TL0 = 0x18;//设定定时器0低8位初值TF0 = 0;//定时器0溢出中断标志位清0ET0 = 1;//打开定时器0中断开关
// EA = 1;//打开定时器中断总开关TR0 = 1;//打开定时器0开关} void Timer0Mode3() interrupt 1//晶振为12MHz的定时器0的16位自动重装不可屏蔽(就是不受EA = 1控制)定时模式3的12分频定时1ms中断函数
{LED = ~LED;//LED灯隔1ms亮灭}
Timer0Mode3.h
#ifndef _TIMER0MODE3_H
#define _TIMER0MODE3_H
#include "STC8H.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
sbit LED = P1^0;//位定义LED灯连接单片机引脚P1.0
void Timer0Mode3Init();//声明晶振为12MHz的定时器0的16位自动重装不可屏蔽(就是不受EA = 1控制)定时模式3的12分频定时1ms初始化函数
#endif
STC8H系列单片机扩展定时器0为外部下降沿计数范例程序
main.c
#include "STC8H.h"
#include "intrins.h"
#include "Timer0Count.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uintvoid 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();//单片机端口模式设置函数Timer0CountInit();//定时器0为外部下降沿计数初始化函数 while (1);
}
Timer0Count.c
#include "Timer0Count.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/晶振频率)=几us1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us2、定时时间=定时计数*一个机器周期 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的二进制数110110002、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//自定义无符号整数型为uintvoid Timer0CountInit()//定时器0为外部下降沿计数初始化函数
{TMOD |= 0x04;//设定定时器/计数器为计数器TH0 = 0xff;//设定定时器0高8位初值TL0 = 0xff;//设定定时器0低8位初值TF0 = 0;//定时器0溢出中断标志位清0ET0 = 1;//打开定时器0中断开关EA = 1;//打开定时器中断总开关TR0 = 1;//打开定时器0开关} void Timer0Count() interrupt 1//定时器0为外部下降沿计数中断函数
{LED = ~LED;//LED灯亮灭}
Timer0Count.h
#ifndef _TIMER0COUNT_H
#define _TIMER0COUNT_H
#include "STC8H.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
sbit LED = P1^0;//位定义LED灯连接单片机引脚P1.0
sbit P3.4 = P3^4;//位定义定时器0单片机引脚P3.4
void Timer0CountInit();//定时器0为外部下降沿计数初始化函数
#endif
STC8H系列单片机晶振为12MHz的定时器1的16位自动重装定时模式0的12分频定时1ms范例程序
main.c
#include "STC8H.h"
#include "intrins.h"
#include "Timer1Mode0.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uintvoid 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();//单片机端口模式设置函数Timer1Mode0Init();//晶振为12MHz的定时器1的16位自动重装定时模式0的12分频定时1ms初始化函数 while (1);
}
Timer1Mode0.c
#include "Timer1Mode0.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/晶振频率)=几us1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us2、定时时间=定时计数*一个机器周期 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的二进制数110110002、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//自定义无符号整数型为uintvoid Timer1Mode0Init()//晶振为12MHz的定时器1的16位自动重装定时模式0的12分频定时1ms初始化函数
{AUXR &= 0xbf;//设定定时器/计数器模式为12TTMOD &= 0x0f;//设定定时器/计数器为定时器 工作模式为16位自动重装的定时器1模式0TH1 = 0xfc;//设定定时器1高8位初值TL1 = 0x18;//设定定时器1低8位初值TF1 = 0;//定时器1溢出中断标志位清0ET1 = 1;//打开定时器1中断开关EA = 1;//打开定时器中断总开关TR1 = 1;//打开定时器1开关} void Timer1Mode0() interrupt 1//晶振为12MHz的定时器1的16位自动重装定时模式0的12分频定时1ms中断函数
{LED = ~LED;//LED灯隔1ms亮灭}
Timer1Mode0.h
#ifndef _TIMER1MODE0_H
#define _TIMER1MODE0_H
#include "STC8H.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
sbit LED = P1^0;//位定义LED灯连接单片机引脚P1.0
void Timer1Mode0Init();//声明晶振为12MHz的定时器1的16位自动重装定时模式0的12分频定时1ms初始化函数
#endif
STC8H系列单片机晶振为12MHz的定时器1的16位自动重装定时模式0的1分频定时1ms范例程序
main.c
#include "STC8H.h"
#include "intrins.h"
#include "Timer1Mode0.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uintvoid 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();//单片机端口模式设置函数Timer1Mode0Init();//晶振为12MHz的定时器1的16位自动重装定时模式0的1分频定时1ms初始化函数 while (1);
}
Timer1Mode0.c
#include "Timer1Mode0.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/晶振频率)=几us1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us2、定时时间=定时计数*一个机器周期 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的二进制数110110002、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//自定义无符号整数型为uintvoid Timer1Mode0Init()//晶振为12MHz的定时器1的16位自动重装定时模式0的1分频定时1ms初始化函数
{AUXR &= 0x40;//设定定时器/计数器模式为1TTMOD &= 0x0f;//设定定时器/计数器为定时器 工作模式为16位自动重装的定时器1模式0TH1 = 0xd1;//设定定时器1高8位初值TL1 = 0x20;//设定定时器1低8位初值TF1 = 0;//定时器1溢出中断标志位清0ET1 = 1;//打开定时器1中断开关EA = 1;//打开定时器中断总开关TR1 = 1;//打开定时器1开关} void Timer1Mode0() interrupt 1//晶振为12MHz的定时器1的16位自动重装定时模式0的1分频定时1ms中断函数
{LED = ~LED;//LED灯隔1ms亮灭}
Timer1Mode0.h
#ifndef _TIMER1MODE0_H
#define _TIMER1MODE0_H
#include "STC8H.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
sbit LED = P1^0;//位定义LED灯连接单片机引脚P1.0
void Timer1Mode0Init();//声明晶振为12MHz的定时器1的16位自动重装定时模式0的1分频定时1ms初始化函数
#endif
STC8H系列单片机晶振为12MHz的定时器1的16位不自动重装定时模式1的12分频定时1ms范例程序
main.c
#include "STC8H.h"
#include "intrins.h"
#include "Timer1Mode1.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uintvoid 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();//单片机端口模式设置函数Timer1Mode1Init();//晶振为12MHz的定时器1的16位不自动重装定时模式1的12分频定时1ms初始化函数 while (1);
}
Timer1Mode1.c
#include "Timer1Mode1.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/晶振频率)=几us1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us2、定时时间=定时计数*一个机器周期 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的二进制数110110002、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//自定义无符号整数型为uintvoid Timer1Mode1Init()//晶振为12MHz的定时器1的16位不自动重装定时模式1的12分频定时1ms初始化函数
{AUXR &= 0xbf;//设定定时器/计数器模式为12TTMOD &= 0x0f;//设定定时器/计数器工作模式清0TMOD |= 0x10;//设定定时器/计数器为定时器 工作模式为16位不自动重装的定时器1模式1TH1 = 0xfc;//设定定时器1高8位初值TL1 = 0x18;//设定定时器1低8位初值TF1 = 0;//定时器1溢出中断标志位清0ET1 = 1;//打开定时器1中断开关EA = 1;//打开定时器中断总开关TR1 = 1;//打开定时器1开关} void Timer1Mode1() interrupt 1//晶振为12MHz的定时器1的16位不自动重装定时模式1的12分频定时1ms中断函数
{TH1 = 0xfc;//重装设定定时器1高8位初值TL1 = 0x18;//重装设定定时器1低8位初值LED = ~LED;//LED灯隔1ms亮灭}
Timer1Mode1.h
#ifndef _TIMER1MODE1_H
#define _TIMER1MODE1_H
#include "STC8H.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
sbit LED = P1^0;//位定义LED灯连接单片机引脚P1.0
void Timer1Mode1Init();//声明晶振为12MHz的定时器1的16位不自动重装定时模式1的12分频定时1ms初始化函数
#endif
STC8H系列单片机晶振为12MHz的定时器1的16位不自动重装定时模式1的1分频定时1ms范例程序
main.c
#include "STC8H.h"
#include "intrins.h"
#include "Timer1Mode1.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uintvoid 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();//单片机端口模式设置函数Timer1Mode1Init();//晶振为12MHz的定时器1的16位不自动重装定时模式1的1分频定时1ms初始化函数 while (1);
}
Timer1Mode1.c
#include "Timer1Mode1.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/晶振频率)=几us1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us2、定时时间=定时计数*一个机器周期 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的二进制数110110002、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//自定义无符号整数型为uintvoid Timer1Mode1Init()//晶振为12MHz的定时器1的16位不自动重装定时模式1的1分频定时1ms初始化函数
{AUXR &= 0x40;//设定定时器/计数器模式为1TTMOD &= 0x0f;//设定定时器/计数器工作模式清0TMOD |= 0x10;//设定定时器/计数器为定时器 工作模式为16位不自动重装的定时器1模式1TH1 = 0xd1;//设定定时器1高8位初值TL1 = 0x20;//设定定时器1低8位初值TF1 = 0;//定时器1溢出中断标志位清0ET1 = 1;//打开定时器1中断开关EA = 1;//打开定时器中断总开关TR1 = 1;//打开定时器1开关} void Timer1Mode1() interrupt 1//晶振为12MHz的定时器1的16位不自动重装定时模式1的1分频定时1ms中断函数
{TH1 = 0xd1;//重装设定定时器1高8位初值TL1 = 0x20;//重装设定定时器1低8位初值LED = ~LED;//LED灯隔1ms亮灭}
Timer1Mode1.h
#ifndef _TIMER1MODE1_H
#define _TIMER1MODE1_H
#include "STC8H.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
sbit LED = P1^0;//位定义LED灯连接单片机引脚P1.0
void Timer1Mode1Init();//声明晶振为12MHz的定时器1的16位不自动重装定时模式1的1分频定时1ms初始化函数
#endif
STC8H系列单片机晶振为12MHz的定时器1的8位自动重装定时模式2的12分频定时0.1ms范例程序
main.c
#include "STC8H.h"
#include "intrins.h"
#include "Timer1Mode2.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uintvoid 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();//单片机端口模式设置函数Timer1Mode2Init();//晶振为12MHz的定时器1的8位自动重装定时模式2的12分频定时0.1ms初始化函数 while (1);
}
Timer1Mode2.c
#include "Timer1Mode2.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/晶振频率)=几us1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us2、定时时间=定时计数*一个机器周期 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的二进制数110110002、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//自定义无符号整数型为uintvoid Timer1Mode2Init()//晶振为12MHz的定时器1的8位自动重装定时模式2的12分频定时0.1ms初始化函数
{AUXR &= 0xbf;//设定定时器/计数器模式为12TTMOD &= 0x0f;//设定定时器/计数器工作模式清0TMOD |= 0x20;//设定定时器/计数器为定时器 工作模式为8位自动重装的定时器1模式2TH1 = 0x9c;//设定定时器1高8位初值TL1 = 0x9c;//设定定时器1低8位初值TF1 = 0;//定时器1溢出中断标志位清0ET1 = 1;//打开定时器1中断开关EA = 1;//打开定时器中断总开关TR1 = 1;//打开定时器1开关} void Timer1Mode2() interrupt 1//晶振为12MHz的定时器1的8位自动重装定时模式2的12分频定时0.1ms中断函数
{LED = ~LED;//LED灯隔0.1ms亮灭}
Timer1Mode2.h
#ifndef _TIMER1MODE2_H
#define _TIMER1MODE2_H
#include "STC8H.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
sbit LED = P1^0;//位定义LED灯连接单片机引脚P1.0
void Timer1Mode2Init();//声明晶振为12MHz的定时器1的8位自动重装定时模式2的12分频定时0.1ms初始化函数
#endif
STC8H系列单片机晶振为12MHz的定时器1的8位自动重装定时模式2的1分频定时0.01ms范例程序
main.c
#include "STC8H.h"
#include "intrins.h"
#include "Timer1Mode2.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uintvoid 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();//单片机端口模式设置函数Timer1Mode2Init();//晶振为12MHz的定时器1的8位自动重装定时模式2的1分频定时0.01ms初始化函数 while (1);
}
Timer1Mode2.c
#include "Timer1Mode2.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/晶振频率)=几us1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us2、定时时间=定时计数*一个机器周期 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的二进制数110110002、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//自定义无符号整数型为uintvoid Timer1Mode2Init()//晶振为12MHz的定时器1的8位自动重装定时模式2的1分频定时0.01ms初始化函数
{AUXR &= 0x40;//设定定时器/计数器模式为1TTMOD &= 0x0f;//设定定时器/计数器工作模式清0TMOD |= 0x20;//设定定时器/计数器为定时器 工作模式为8位自动重装的定时器1模式2TH1 = 0x88;//设定定时器1高8位初值TL1 = 0x88;//设定定时器1低8位初值TF1 = 0;//定时器1溢出中断标志位清0ET1 = 1;//打开定时器1中断开关EA = 1;//打开定时器中断总开关TR1 = 1;//打开定时器1开关} void Timer1Mode2() interrupt 1//晶振为12MHz的定时器1的8位自动重装定时模式2的1分频定时0.01ms中断函数
{LED = ~LED;//LED灯隔0.01ms亮灭}
Timer1Mode2.h
#ifndef _TIMER1MODE2_H
#define _TIMER1MODE2_H
#include "STC8H.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
sbit LED = P1^0;//位定义LED灯连接单片机引脚P1.0
void Timer1Mode2Init();//声明晶振为12MHz的定时器1的8位自动重装定时模式2的1分频定时0.01ms初始化函数
#endif
STC8H系列单片机扩展定时器1为外部下降沿计数范例程序
main.c
#include "STC8H.h"
#include "intrins.h"
#include "Timer1Count.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uintvoid 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();//单片机端口模式设置函数Timer0CountInit();//定时器1为外部下降沿计数初始化函数 while (1);
}
Timer1Count.c
#include "Timer1Count.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/晶振频率)=几us1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us2、定时时间=定时计数*一个机器周期 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的二进制数110110002、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//自定义无符号整数型为uintvoid Timer1CountInit()//定时器1为外部下降沿计数初始化函数
{TMOD |= 0x04;//设定定时器/计数器为计数器TH1 = 0xff;//设定定时器1高8位初值TL1 = 0xff;//设定定时器1低8位初值TF1 = 0;//定时器1溢出中断标志位清0ET1 = 1;//打开定时器1中断开关EA = 1;//打开定时器中断总开关TR1 = 1;//打开定时器1开关} void Timer1Count() interrupt 1//定时器1为外部下降沿计数中断函数
{LED = ~LED;//LED灯亮灭}
Timer1Count.h
#ifndef _TIMER1COUNT_H
#define _TIMER1COUNT_H
#include "STC8H.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
sbit LED = P1^0;//位定义LED灯连接单片机引脚P1.0
sbit P3.5 = P3^5;//位定义定时器0单片机引脚P3.5
void Timer1CountInit();//定时器1为外部下降沿计数初始化函数
#endif
STC8H系列单片机扩展定时器1的16位自动重装定时模式0作为串口1波特率发生器范例程序
main.c
#include "STC8H.h"
#include "intrins.h"
#include "Uart1.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uintvoid 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();//单片机端口模式设置函数Uart1Init();//串口1初始化函数 Uart1SendString("Uart1 Test !\r\n");while (1){if (SendNumber != ReceiveNumber)//如果发送数量不等于接收数量{Uart1Send(CacheDataArray[SendNumber++]);//串口1发送数据函数SendNumber &= 0x0f;//只能发送16个数量}}
}
Uart1…c
#include "Uart1.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/晶振频率)=几us1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us2、定时时间=定时计数*一个机器周期 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的二进制数110110002、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//自定义无符号整数型为uintvoid Uart1Init()//串口1初始化函数
{AUXR = 0x40;//定时器1的1分频计时SCON = 0x50;//设置串口1工作模式为模式1 允许串口接收数据TMOD = 0x00;//设置晶振为11.0592MHz的定时器1的16位自动重装定时模式0TL1 = Baudrate;//设定定时器1低8位初值TH1 = Baudrate >> 8;//设定定时器1高8位初值TR1 = 1;//打开定时器1开关ES = 1;//打开串口中断允许位开关EA = 1;//打开定时器中断总开关ReceiveNumber = 0x00;//接收数量变量清0SendNumber = 0x00;//发送数量变量清0Busy = 0;//忙变量清0} void Uart1Send(uchar Data)//串口1发送数据函数
{while (Busy);//当忙标志位变量等于1 一直停在此 不执行以下程序 否则跳出 执行以下函数Busy = 1;//标志位变量1SBUF = Data;//把变量Data含有的数据赋给串口缓存数据寄存器}void Uart1SendString(uchar *p)//串口1发送字符串函数
{while (*p)//当条件一直大于0 一直执行以下函数 否则跳出 不执行以下函数{Uart1Send(*p++);//串口1发送数据函数}
}void Uart1() interrupt 1//串口1中断函数
{if(TI)//判断发送数据标志位变量是否为1 为1表示已经发送完数据{TI = 0;//发送数据标志位变量清0Busy = 0;//忙标志位变量清0}if(RI)//判断接收数据标志位变量是否为1 为1表示已经接收完数据
{RI = 0;//接收数据标志位变量清0CacheDataArray[ReceiveNumber++] = SBUF;//把接收数据存储器存储的数据赋给缓存数据数组ReceiveNumber &= 0x0f;//只能接收16个数量}
}
Uart1.h
#ifndef _UART1_H
#define _UART1_H
#include "STC8H.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
#define Frequency 11059200UL//声明频率变量
#define Baudrate (65536 - Frequency / 115200 / 4)//声明波特率变量
bit Busy;//声明忙变量
extern uchar ReceiveNumber;//声明接收数量变量
extern uchar SendNumber;//声明发送数量变量
extern uchar CacheDataArray[16];//声明缓存数据数组变量
void Uart1Init();//串口1初始化函数
void Uart1Send(uchar Data);//串口1发送数据函数
Uart1SendString(uchar *p);//串口1发送字符串函数
#endif
STC8H系列单片机扩展定时器1的8位自动重装定时模式2作为串口1波特率发生器范例程序
main.c
#include "STC8H.h"
#include "intrins.h"
#include "Uart1.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uintvoid 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();//单片机端口模式设置函数Uart1Init();//串口1初始化函数 Uart1SendString("Uart1 Test !\r\n");while (1){if (SendNumber != ReceiveNumber)//如果发送数量不等于接收数量{Uart1Send(CacheDataArray[SendNumber++]);//串口1发送数据函数SendNumber &= 0x0f;//只能发送16个数量}}
}
Uart1…c
#include "Uart1.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/晶振频率)=几us1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us2、定时时间=定时计数*一个机器周期 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的二进制数110110002、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//自定义无符号整数型为uintvoid Uart1Init()//串口1初始化函数
{AUXR = 0x40;//定时器1的1分频计时SCON = 0x50;//设置串口1工作模式为模式1 允许串口接收数据TMOD = 0x20;//设置晶振为11.0592MHz的定时器1的8位自动重装定时模式2TL1 = Baudrate;//设定定时器1低8位初值TH1 = Baudrate;//设定定时器1高8位初值TR1 = 1;//打开定时器1开关ES = 1;//打开串口中断允许位开关EA = 1;//打开定时器中断总开关ReceiveNumber = 0x00;//接收数量变量清0SendNumber = 0x00;//发送数量变量清0Busy = 0;//忙变量清0} void Uart1Send(uchar Data)//串口1发送数据函数
{while (Busy);//当忙标志位变量等于1 一直停在此 不执行以下程序 否则跳出 执行以下函数Busy = 1;//标志位变量1SBUF = Data;//把变量Data含有的数据赋给串口缓存数据寄存器}void Uart1SendString(uchar *p)//串口1发送字符串函数
{while (*p)//当条件一直大于0 一直执行以下函数 否则跳出 不执行以下函数{Uart1Send(*p++);//串口1发送数据函数}
}void Uart1() interrupt 1//串口1中断函数
{if(TI)//判断发送数据标志位变量是否为1 为1表示已经发送完数据{TI = 0;//发送数据标志位变量清0Busy = 0;//忙标志位变量清0}if(RI)//判断接收数据标志位变量是否为1 为1表示已经接收完数据
{RI = 0;//接收数据标志位变量清0CacheDataArray[ReceiveNumber++] = SBUF;//把接收数据存储器存储的数据赋给缓存数据数组ReceiveNumber &= 0x0f;//只能接收16个数量}
}
Uart1.h
#ifndef _UART1_H
#define _UART1_H
#include "STC8H.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
#define Frequency 11059200UL//声明频率变量
#define Baudrate (256 - Frequency / 115200 / 32)//声明波特率变量
bit Busy;//声明忙变量
extern uchar ReceiveNumber;//声明接收数量变量
extern uchar SendNumber;//声明发送数量变量
extern uchar CacheDataArray[16];//声明缓存数据数组变量
void Uart1Init();//串口1初始化函数
void Uart1Send(uchar Data);//串口1发送数据函数
Uart1SendString(uchar *p);//串口1发送字符串函数
#endif
STC8H系列单片机晶振为12MHz的定时器2的16位自动重装定时模式0的12分频定时1ms范例程序
main.c
#include "STC8H.h"
#include "intrins.h"
#include "Timer2Mode0.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uintvoid 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();//单片机端口模式设置函数Timer2Mode0Init();//晶振为12MHz的定时器2的16位自动重装定时模式0的12分频定时1ms初始化函数 while (1);
}
Timer2Mode0.c
#include "Timer2Mode0.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/晶振频率)=几us1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us2、定时时间=定时计数*一个机器周期 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的二进制数110110002、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//自定义无符号整数型为uintvoid Timer2Mode0Init()//晶振为12MHz的定时器2的16位自动重装定时模式0的12分频定时1ms初始化函数
{AUXR &= 0x7f;//设定定时器/计数器模式为12TTMOD &= 0xf0;//设定定时器/计数器为定时器 工作模式为16位自动重装的定时器0模式0TH0 = 0xfc;//设定定时器0高8位初值TL0 = 0x18;//设定定时器0低8位初值TF0 = 0;//定时器0溢出中断标志位清0ET0 = 1;//打开定时器0中断开关EA = 1;//打开定时器中断总开关TR0 = 1;//打开定时器0开关} void Timer2Mode0() interrupt 1//晶振为12MHz的定时器2的16位自动重装定时模式0的12分频定时1ms中断函数
{LED = ~LED;//LED灯隔1ms亮灭}
Timer2Mode0.h
#ifndef _TIMER2MODE0_H
#define _TIMER2MODE0_H
#include "STC8H.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
sbit LED = P1^0;//位定义LED灯连接单片机引脚P1.0
void Timer2Mode0Init();//声明晶振为12MHz的定时器2的16位自动重装定时模式0的12分频定时1ms初始化函数
#endif