STC12C5A60S2系列1T 8051单片机管脚图
STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置
STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍
STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块的结构
STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块的各种不同工作模式介绍
基于STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块的特殊功能寄存器列表
基于STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块的PWM(脉冲宽度调制)模块用到的特殊功能寄存器
STC12C5A60S2系列1T 8051单片机辅助寄存器AUXR
PCA辅助寄存器AUXR1
作用:用来设置STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块的单片机引脚
PCA工作模式寄存器CMOD
作用:用来设置STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块以下功能
(1)、空闲情况下是否停止CCP/PCA/PWM模块计数
(2)、CCP/PCA/PWM模块计数脉冲时钟源选择 (3)、CCP/PCA/PWM模块计数溢出中断使能
PCA工作模式寄存器CCON
作用:用来设置STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块以下功能
(1)、CCP/PCA/PWM模块计数溢出标志位
(2)、CCP/PCA/PWM模块运行
(3)、CCP/PCA/PWM模块0中断标志位
(4)、CCP/PCA/PWM模块1中断标志位
PCA比较/捕获寄存器CCAPM0和CCAPM1
作用:用来设置STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块以下功能
(1)、CCP/PCA/PWM模块0允许比较器功能控制
(2)、CCP/PCA/PWM模块0上升沿捕获控制
(3)、CCP/PCA/PWM模块0下降沿捕获控制
(4)、CCP/PCA/PWM模块0匹配工作模式寄存器CCON中断标志位控制
(5)、CCP/PCA/PWM模块0匹配CCPn寄存器引脚电平翻转控制
(6)、CCP/PCA/PWM模块0脉冲宽度调制模式
(7)、CCP/PCA/PWM模块0使能工作模式寄存器CCON中断标志位控制
(8)、CCP/PCA/PWM模块1允许比较器功能控制
(9)、CCP/PCA/PWM模块1上升沿捕获控制
(10)、CCP/PCA/PWM模块1下降沿捕获控制
(11)、CCP/PCA/PWM模块1匹配工作模式寄存器CCON中断标志位控制
(12)、CCP/PCA/PWM模块1匹配CCPn寄存器引脚电平翻转控制
(13)、CCP/PCA/PWM模块1脉冲宽度调制模式
(14)、CCP/PCA/PWM模块1使能工作模式寄存器CCON中断标志位控制
PCA的16位定时器/计数器 —— 高八位CH和低八位CL
作用:作为CCP/PCA/PWM模块0或CCP/PCA/PWM模块1的计数器进行脉冲计数
PCA捕获/比较寄存器高八位CCAPnH和低八位CCAPnL
作用:作为捕获或比较时 用于CCP/PCA/PWM模块0或CCP/PCA/PWM模块1的计数器进行脉冲计数 作为脉冲宽度调制时 用于CCP/PCA/PWM模块0或CCP/PCA/PWM模块1的高八位CCAPnH脉冲计数重载给低八位CCAPnL进行脉冲计数控制脉冲宽度调制
PCA的PWM寄存器PCA_PWM0和PCA_PWM1
作用:组成CCP/PCA/PWM模块0或CCP/PCA/PWM模块1的PWM寄存器内部累计计数的9位数据文章来源:https://www.toymoban.com/news/detail-717453.html
利用晶振频率为12MHz的STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块0从P1.3引脚输出频率为200Hz且占空比为40%的矩形波 可根据以下CCP/PCA/PWM模块的脉冲宽度调制模式来编写程序
文章来源地址https://www.toymoban.com/news/detail-717453.html
#include <STC12C5A60S2.h>
void PortModeSet();//端口模式设置函数
void PcaInit();//CCP/PCA/PWM模块初始化函数
void Timer0Init();//定时0初始化函数
void main()//主函数
{
PortModeSet();//端口模式设置函数
PcaInit();//CCP/PCA/PWM模块初始化函数
Timer0Init();//定时0初始化函数
while(1);
}
void PortModeSet()//端口模式设置函数
{
P0M1 = 0x00;
P0M0 = 0x00;
P1M1 = 0x00;
P1M0 = 0x00;
P2M1 = 0x00;
P2M0 = 0x00;
P3M1 = 0x00;
P3M0 = 0x00;
P4M1 = 0x00;
P4M0 = 0x00;
}
void PcaInit()//CCP/PCA/PWM模块初始化函数
{
CMOD = 0x04 ;//CCP/PCA/PWM模块空闲模式下CCP/PCA/PWM模块计数器继续工作 选定时器T0溢出脉冲作为CCP/PCA/PWM模块时钟源 禁止CCP/PCA/PWM模块溢出中断使能
CCON = 0x00;//CCP/PCA/PWM模块计数溢出标志位清0 运行位清0 中断标志位清0
CCAPM0 = 0x42;//CCP/PCA/PWM模块0允许比较器功能控制 不允许边沿捕获控制 不匹配工作模式寄存器CCON中断标志位控制 不匹配CCPn寄存器引脚电平翻转控制 输出脉冲宽度调制模式 不使能工作模式寄存器CCON中断标志位控制
CH = 0x00;//CCP/PCA/PWM模块16位计数器高八位计数寄存器脉冲计数清0
CL = 0x00;//CCP/PCA/PWM模块16位计数器低八位计数寄存器脉冲计数清0
CCAP0H = 0x00;//CCP/PCA/PWM模块高八位捕获/比较寄存器清0
CCAP0L = 0x00;//CCP/PCA/PWM模块低八位捕获/比较寄存器清0
CR = 1;//启动CCP/PCA/PWM模块16计数器
}
/*****关于通过特殊功能寄存器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
指令周期:单片机取出一条指令且执行完这条指令所需的时间
以上三者间的关系:指令周期>机器周期>时钟周期
一、通过特殊功能寄存器AUXR设定定时器/计数器模式为12T模式需12分频8051系列单片机定时器初值(定时计数初值)计算步骤如下(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
0、计算nT单片机机器周期T公式:T=n*(1/晶振频率)=几us
1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us
2、定时时间=定时计数*一个机器周期 1ms=定时计数*1us 定时计数=1ms/1us=1000us/1us=1000次
3、定时器初值(定时计数初值)=2^n-定时计数 n为几位定时器 此处n=16 则定时器初值(定时计数初值)=2^16-1000=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256 低八位放TL0=0x18或(65536-64536)%256
二、以下是通过特殊功能寄存器AUXR设定定时器/计数器模式为1T或12T模式不需分频或需12分频8051系列单片机定时器初值(定时计数初值)计算步骤如下(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
1、综合公式:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/12/1KHz)=2^16-(12*10^6)Hz/12/1000Hz)=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256或Value >> 8 低八位放TL0=0x18或(65536-64536)%256或=Value
2、TH0 = Value >> 8;TL0 = Value;该两句代码解释如下:
(1)、TH0 = Value >> 8相当于TH0 = (65536-10000)/256=55536/256=216.9375 分析:65536-10000=55536转化成二进制为11011000 11110000 55536/256=216.9375转化成二进制为11011000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000右移8位就可以得到55536/256=216.9375的二进制数11011000
(2)、TL0 = Value相当于TL0 = (65536-时器初值的另外一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
(一)、以下是8051单片机定时器用12分频计算定时器初值:
定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲(相当于定时1ms) 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/12/1KHz)=2^16-(12*10^6)Hz/12/1000Hz)=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256或Value >> 8 低八位放TL0=0x18或(65536-64536)%256或=Value
(二)、以下是8051单片机定时器不用分频计算定时器初值:
定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲(相当于定时1ms) 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/1/1KHz)=2^16-(12*10^6)Hz/1/1000Hz)=65536-12000=53536 把53536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xd1或(65536-53536)/256或Value >> 8 低八位放TL0=0x20或(65536-53536)%256或=Value
(三)、TH0 = Value >> 8;TL0 = Value;该两句代码解释如下:
1、TH0 = Value >> 8相当于TH0 = (65536-10000)/256=55536/256=216.9375 分析:65536-10000=55536转化成二进制为11011000 11110000 55536/256=216.9375转化成二进制为11011000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000右移8位就可以得到55536/256=216.9375的二进制数11011000
2、TL0 = Value相当于TL0 = (65536-10000)%256=55536%256=240 分析:65536-10000=55536转化成二进制为11011000 11110000 55536%256=240转化成二进制为11110000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000取低8位就可以得到55536%256=240的二进制数11110000
(四)、由定时器定时初值(定时计数初值)推导出定时器定时时间步骤如下:
1、如果定时器定时初值(定时计数初值)是拆开成高八位和低八位赋值形式 如:TH0=0xfc TL0=0x18 先把高八位和低八位赋值组成一个十六位数据0xfc18 转化成十进制数据64536 用2^n-64536算出每秒产生的脉冲数 其中n为几位定时器 再根据公式计算定时时间 如:由公式:每秒产生的脉冲数=晶振频率/几分频/定时频率 转换成:每秒产生的脉冲数=晶振频率x定时频率/几分频 可求:定时频率=(每秒产生的脉冲数x几分频)/晶振频率 进而求出:定时时间=1/定时频率=1/[(每秒产生的脉冲数x几分频)/晶振频率] 转换成:晶振频率/(每秒产生的脉冲数x几分频)=定时时间
2、如果定时器定时初值(定时计数初值)是十进制数据 如:64536 直接用2^n-64536算出每秒产生的脉冲数 其中n为几位定时器 再根据公式计算定时时间 如:由公式:每秒产生的脉冲数=晶振频率/几分频/定时频率 转换成:每秒产生的脉冲数=晶振频率x定时频率/几分频 可求:定时频率=(每秒产生的脉冲数x几分频)/晶振频率 进而求出:定时时间=1/定时频率=1/[(每秒产生的脉冲数x几分频)/晶振频率] 转换成:晶振频率/(每秒产生的脉冲数x几分频)=定时时间
****/
void Timer0Init()//定时器0的8位自动重装模式2不用分频初始化函数 晶振为12MHz
{
AUXR |= 0x80;//将定时器/计数器设置为1T模式 不用分频
TMOD &= 0xf0;//设定定时器/计数器工作模式清0
TMOD = 0x02;//选定时器/计数器为定时器0 工作模式为模式2的8位自动重装计数 即溢出时将TH0存放的脉冲计数自动装入TL0
TH0 = 0x16;//由于选定时器/计数器为1T模式不用分频定时器0 工作模式为模式2的8位自动重装计数 因此先根据PWM频率=CCP/PCA/PWM模块时钟源频率/256求出CCP/PCA/PWM模块时钟源频率 即200Hz=CCP/PCA/PWM模块时钟源频率/256 求CCP/PCA/PWM模块时钟源频率=51200Hz 再根据定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)求出定时器初值(定时计数初值) 即定时器初值(定时计数初值)=2^8-(12MHz/1/51200Hz)=256-(12000000Hz/51200Hz)=256-234=22=0x16
TL0 = 0x16;//同上
EA = 1;//打开定时器中断总开关
TR0 = 1;//启动定时器0
}
利用晶振频率为12MHz的STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块0从P1.3引脚输出频率为200Hz且占空比可调的矩形波 可根据以下CCP/PCA/PWM模块的脉冲宽度调制模式来编写程序
#include <STC12C5A60S2.h>
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
#define KeyPressDeshakeTime 10//自定义按键按下消抖时间为10ms
#define KeyLongPressDelayTime 500//自定义按键长按延时时间为500ms
#define KeyLongPressIntervalChangeTime 25//自定义按键长按间隔变化时间为25ms
uchar AddKeyLockFlag;//声明增加按键锁定标志位变量
uchar DecKeyLockFlag;//声明减少按键锁定标志位变量
uchar KeyNumber = 0;//定义按键键值为0
uchar AddKeyLongPressAddIntervalTime;//声明增加按键长按连增间隔时间变量
uchar DecKeyLongPressDecIntervalTime;//声明减少按键长按连减间隔时间变量
uchar PwmValue;//声明脉宽调制值变量
uint AddKeyPressDelayTime;//声明增加按键按下延时时间变量
uint DecKeyPressDelayTime;//声明减少按键按下延时时间变量
sbit AddKey = P2^0;//位定义增加按键为单片机P2.0引脚
sbit DecKey = P2^1;//位定义减少按键为单片机P2.1引脚
void PortModeSet();//端口模式设置函数
void KeyScan();//按键扫描函数
void PcaInit();//CCP/PCA/PWM模块初始化函数
void Timer0Init();//定时器0初始化函数
void Timer1Init();//定时器1初始化函数
void PwmDutyCycleSet();//脉冲宽度占空比设置函数
void main()//主函数
{
PortModeSet();//端口模式设置函数
PcaInit();//CCP/PCA/PWM模块初始化函数
Timer0Init();//定时器0初始化函数
Timer1Init();//定时器1初始化函数
while(1)
{
PwmDutyCycleSet(
到了这里,关于基于STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块的PWM(脉冲宽度调制)应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!