CH559L单片机定时器0-自动重装载模式下控制led闪烁
Posted perseverance52
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CH559L单片机定时器0-自动重装载模式下控制led闪烁相关的知识,希望对你有一定的参考价值。
【CH559L单片机】定时器0-自动重装载模式下控制led闪烁
-
📍 设示例资源WCH官方:
https://www.wch.cn/products/CH559.html
-
🔖采用内部12MHz晶振测试。
-
📢从测试数据来看,时间有一定的波动。
-
🎉从定时器计数值来看,比大部分STC型号速度要快。(CH559 芯片是一款兼容 MCS51 指令集的增强型 E8051 内核单片机,其 79%的指令是单字节单周期指令,平均指令速度比标准 MCS51 快 8~15 倍。),感觉写的没有STC那么夸张,这是实打实。
📖CH559 定时器 Timer 0
和1
📝Timer0/1 是 2 个 16 位定时/计数器,通过 TCON 和 TMOD 来配置 Timer0 和 Timer1,TCON 用于定时/计数器 T0 和 T1 的启动控制与溢出中断以及外部中断控制。每个定时器都是由 2 个 8 位寄存器组成的 16 位定时单元。定时器 0 的高字节计数器是 TH0,低字节是 TL0;定时器 1 的高字节计数器是TH1,低字节是 TL1。定时器 1 还可以作为 UART0 的波特率发生器。
- 🌿相关寄存器
- 🌿定时/计数器 0/1 控制寄存器(TCON):
- 🌿 定时/计数器 0/1 方式寄存器(TMOD):
⛳测试代码
🔖当定时器0计数达到指定数值时,将P12引脚电平状态翻转。
/********************************** (C) COPYRIGHT *******************************
* File Name : Timer0.C
* Author : WCH
* Version : V1.3
* Date : 2016/06/24
* Description : CH559 Timer0接口函数
*******************************************************************************/
#include "..\\DEBUG.C" //调试信息打印
#include "..\\DEBUG.H"
//#define FOSC 24000000uL
#define T1MS (65536-FREQ_SYS*50/12/1000) //12T模式50ms定时
sbit led =P1^2;
UINT16 CNT =0;
#pragma NOAREGS
//CH559 Timer0时钟选择
//bTMR_CLK同时影响Timer0&1&2,使用时要注意
#define mTimer0ClkFsys( ) (T2MOD |= bTMR_CLK | bT0_CLK) //定时器,时钟=Fsys
#define mTimer0Clk4DivFsys( ) (T2MOD &= ~bTMR_CLK;T2MOD |= bT0_CLK) //定时器,时钟=Fsys/4
#define mTimer0Clk12DivFsys( ) (T2MOD &= ~(bTMR_CLK | bT0_CLK)) //定时器,时钟=Fsys/12
#define mTimer0CountClk( ) (TMOD |= bT0_CT) //计数器,T0引脚的下降沿有效
//CH559 Timer0 开始(SS=1)/结束(SS=0)
#define mTimer0RunCTL( SS ) (TR0 = SS ? START : STOP)
/*******************************************************************************
* Function Name : CH559GPIODrivCap(UINT8 Port,UINT8 Cap)
* Description : 端口0、1、2、3驱动能力设置
* Input : UINT8 Port端口选择(0、1、2、3)
UINT8 Cap驱动能力选择((0)5mA、(1)20mA(注意:P1口是10mA))
* Output : None
* Return : SUCCESS成功
FAIL失败
*******************************************************************************/
UINT8 CH559GPIODrivCap(UINT8 Port,UINT8 Cap)
if(Port >= 4)
return FAIL;
if(Cap == 0) //驱动电流最大5mA
PORT_CFG &= ~(bP0_DRV << Port);
else
PORT_CFG |= (bP0_DRV << Port); //驱动电流最大20mA
return SUCCESS;
/*******************************************************************************
* Function Name : CH559GPIOModeSelt(UINT8 Port,UINT8 Mode,UINT8 PinNum)
* Description : 端口0、1、2、3引脚模式设置
* Input : UINT8 Port端口选择(0、1、2、3)
UINT8 Cap驱动方式选择(bPn_OC & Pn_DIR & Pn_PU)
0(000):仅输入,无上拉;
1(001):仅输入,带上拉;
2(01x):推挽输出,高低电平强驱动;
3(100):开漏输出,无上拉,支持输入;
4(110):开漏输出,无上拉,当转变输出由低到高时,仅驱动2个时钟的高电平
5(101):准双向(标准51模式),开漏输出,带上拉
6(111):准双向(标准51模式),开漏输出,带上拉,当转变输出由低到高时,仅驱动2个时钟的高电平
UINT8 PinNum(引脚选择0-7)
* Output : None
* Return : SUCCESS成功
FAIL失败
*******************************************************************************/
UINT8 CH559GPIOModeSelt(UINT8 Port,UINT8 Mode,UINT8 PinNum)
UINT8 Pn_DIR,Pn_PU;
if(Port >= 4)
return FAIL;
switch (Mode)
case 0: //仅输入,无上拉
PORT_CFG &= ~(bP0_OC << Port);
Pn_DIR &= ~(1<<PinNum);
Pn_PU &= ~(1<<PinNum);
break;
case 1: //仅输入,带上拉
PORT_CFG &= ~(bP0_OC << Port);
Pn_DIR &= ~(1<<PinNum);
Pn_PU |= 1<<PinNum;
break;
case 2: //推挽输出,高低电平强驱动
PORT_CFG &= ~(bP0_OC << Port);
Pn_DIR |= (1<<PinNum);
break;
case 3: //开漏输出,无上拉,支持输入
PORT_CFG |= (bP0_OC << Port);
Pn_DIR &= ~(1<<PinNum);
Pn_PU &= ~(1<<PinNum);
break;
case 4: //开漏输出,无上拉,当转变输出由低到高时,仅驱动2个时钟的高电平
PORT_CFG |= (bP0_OC << Port);
Pn_DIR |= 1<<PinNum;
Pn_PU &= ~(1<<PinNum);
break;
case 5: //弱准双向(标准51模式),开漏输出,带上拉
PORT_CFG |= (bP0_OC << Port);
Pn_DIR &= ~(1<<PinNum);
Pn_PU |= 1<<PinNum;
break;
case 6: //准双向(标准51模式),开漏输出,带上拉,当转变输出由低到高时,仅驱动2个时钟的高电平
PORT_CFG |= (bP0_OC << Port);
Pn_DIR |= 1<<PinNum;
Pn_PU |= 1<<PinNum;
break;
default:
break;
if(Port == 0)
P0_DIR = Pn_DIR;
P0_PU = Pn_PU;
if(Port == 1)
P1_DIR = Pn_DIR;
P1_PU = Pn_PU;
if(Port == 2)
P2_DIR = Pn_DIR;
P2_PU = Pn_PU;
if(Port == 3)
P3_DIR = Pn_DIR;
P3_PU = Pn_PU;
return SUCCESS;
/*******************************************************************************
* Function Name : mTimer0ModSetup(UINT8 mode)
* Description : CH559定时计数器0模式0设置
* Input : UINT8 mode,Timer0模式选择
0:模式0,13位定时器,TL0的高3位无效
1:模式1,16位定时器
2:模式2,8位自动重装定时器
3:模式3,两个8位定时器
* Output : None
* Return : None
*******************************************************************************/
void mTimer0ModSetup(UINT8 mode)
TMOD &= 0xf0;
TMOD |= mode;
/*******************************************************************************
* Function Name : mTimer0SetData(UINT16 dat)
* Description : CH559Timer0 TH0和TL0赋值
* Input : UINT16 dat;定时器赋值
* Output : None
* Return : None
*******************************************************************************/
void mTimer0SetData(UINT16 dat)
// UINT16 tmp;
// tmp = 65536 - dat;
// TL0 = tmp & 0xff;
// TH0 = (tmp>>8) & 0xff;
TL0 = dat;
TH0 = dat>>8;
/*******************************************************************************
* Function Name : mTimer0Interrupt()
* Description : CH559定时计数器0定时计数器中断处理函数
*******************************************************************************/
void mTimer0Interrupt( void ) interrupt INT_NO_TMR0 using 1 //timer0中断服务程序,使用寄存器组1
//方式3时,TH0使用Timer1的中断资源
// CAP1 = !CAP1;
// mTimer0SetData(0x2000) //非自动重载方式需重新给TH0和TL0赋值
CNT ++;
if(CNT>=60600)
led = !led; //1秒钟状态翻转
CNT=0;
printf("led");
void main( )
CfgFsys( );//CH559时钟选择配置
mDelaymS(5); //等待外部晶振稳定
mInitSTDIO();//串口0,可以用于调试,默认波特率57600bps
printf("start ...\\n");
printf("%hu",(UINT16)T1MS);
CH559GPIODrivCap(1,1);
CH559GPIOModeSelt(1,2,2);
led =0;
mTimer0ModSetup(2); //方式2,自动重载8为定时器
mTimer0ClkFsys( ); //时钟选择Fsys定时器方式
mTimer0SetData(T1MS); //定时器赋初值8995
mTimer0RunCTL( 1 ); //启动定时器
// printf("%02X %02X",(UINT16)TH0,(UINT16)TL0);
ET0 = 1; //使能定时计数器0中断
EA = 1; //使能全局中断
while(1);
串口输出信息
[2022-10-13 23:33:33.420]# RECV ASCII>
led
[2022-10-13 23:33:34.404]# RECV ASCII>
led
[2022-10-13 23:33:35.404]# RECV ASCII>
led
[2022-10-13 23:33:36.394]# RECV ASCII>
led
[2022-10-13 23:33:37.378]# RECV ASCII>
led
[2022-10-13 23:33:38.362]# RECV ASCII>
led
[2022-10-13 23:33:39.347]# RECV ASCII>
led
[2022-10-13 23:33:40.347]# RECV ASCII>
led
[2022-10-13 23:33:41.336]# RECV ASCII>
led
[2022-10-13 23:33:42.321]# RECV ASCII>
led
[2022-10-13 23:33:43.305]# RECV ASCII>
led
[2022-10-13 23:33:44.290]# RECV ASCII>
led
[2022-10-13 23:33:45.274]# RECV ASCII>
led
[2022-10-13 23:33:46.263]# RECV ASCII>
led
[2022-10-13 23:33:47.263]# RECV ASCII>
led
[2022-10-13 23:33:48.248]# RECV ASCII>
led
以上是关于CH559L单片机定时器0-自动重装载模式下控制led闪烁的主要内容,如果未能解决你的问题,请参考以下文章