STC15单片机-LED闪烁(定时器)
LED闪烁(定时器)
定时器
STC15L2K32S2有3个定时器/计数器
定时器/计数器0、定时器/计数器1、定时器/计数器2
寄存器配置方法跟89C52的差不多,具体可看手册
工作流程:通过寄存器配置定时器的工作模式。设定定时值。定时器启动后,定时器在时钟源的驱动下开始做加1计算,当计数到 65536时,中断标志位 TF0 置位,触发定时器中断,此时可以重新设定时值或自动重装定时值,重新计数,周而复始。 如果定时器中断开启了,CPU 会停下手头的工作,转而去运行定时器中断函数,中断函数运行完之后,CPU 继续干手头的工作。
中断存在的意义:为了提高 CPU 快速处理紧急事件的能力,比如按键中断、 定时任务、故障报警、接口通信等。
程序
在LED闪烁(面向对象编程结构)的工程上添加Timer0.c和Timer0.h文件
Timer0.c:
定时器每隔5ms进入一次中断处理函数,Timer0.usMCU_Run_Timer变量++,加100次时,说明经过了500ms,就让指示灯翻转
定时器在满足要求的情况下,定时时间越长越好,中断过于频繁的话,会影响 CPU 的效率。
/* Includes ------------------------------------------------------------------*/
#include <main.h>/* Private define-------------------------------------------------------------*//* Private variables----------------------------------------------------------*/
static void Timer0_Init();
/* Public variables-----------------------------------------------------------*/
Timer0_t Timer0 =
{0,Timer0_Init
};
/* Private function prototypes------------------------------------------------*//*
* @name Timer0_Init
* @brief 定时器0初始化
* @param None
* @retval None
*/
static void Timer0_Init() //5毫秒@11.0592MHz
{AUXR &= 0x7F; //定时器时钟12T模式TMOD &= 0xF0; //设置定时器模式TL0 = 0x00; //设置定时初值TH0 = 0xEE; //设置定时初值TF0 = 0; //清除TF0标志TR0 = 1; //定时器0开始计时
}/*
* @name Timer0_isr
* @brief 定时器0中断处理函数(5ms中断一次)
* @param None
* @retval None
*/
void Timer0_isr() interrupt 1
{Timer0.usMCU_Run_Timer++;if(Timer0.usMCU_Run_Timer >= Timer0_500ms){Timer0.usMCU_Run_Timer = 0;Run_LED.Run_LED_Flip();}
}
/********************************************************End Of File
********************************************************/
Timer0.h:
头文件里定义枚举类型,提供不同的定时时间选择,也可以用#define来宏定义;结构体里的变量记得在Timer0.c文件中初始化
#ifndef __TIMER0_H_
#define __TIMER0_H_//定义枚举类型,提供不同的定时时间
typedef enum
{Timer0_50ms = (uint16_t)10,Timer0_100ms = (uint16_t)20,Timer0_500ms = (uint16_t)100,Timer0_1s = (uint16_t)200
}Timer0_Value_t;//定义结构体类型
typedef struct
{uint16_t volatile usMCU_Run_Timer;void (*Timer0_Init)();
}Timer0_t;/* extern variables-----------------------------------------------------------*/
extern Timer0_t Timer0;
/* extern function prototypes-------------------------------------------------*/ #endif
/********************************************************End Of File
********************************************************/
Sys_Init.c:
系统初始化函数Sys_Init中分别调用GPIO、上电指示、定时器0和中断初始化函数,其中上电延时是从产品角度上为了让硬件系统稳定,不要一上电就立马开始处理数据,上电指示是为了在调试过程中如果单片机重启了,会有个提示,有利于我们知道哪一步造成重启,进行排错
/* Includes ------------------------------------------------------------------*/
#include <main.h>/* Private define-------------------------------------------------------------*//* Private variables----------------------------------------------------------*/
static void GPIO_Init();
static void Power_ON_Indication();
static void Sys_Init();
static void IE_Init();
/* Public variables-----------------------------------------------------------*/
Hardware_Init_t Hardware_Init =
{GPIO_Init,Power_ON_Indication,Sys_Init,IE_Init
};
/* Private function prototypes------------------------------------------------*//*
* @name GPIO_Init
* @brief GPIO初始化
* @param None
* @retval None
*/
static void GPIO_Init()
{//M1 M0//0 0 准双向口//0 1 推挽输出//1 0 高阻输入//1 1 开漏//P34、P35设置为推挽输出P3M1 = 0x00; //0000 0000P3M0 = 0x30; //0011 0000P34 = 0; //关闭运行指示灯P35 = 0; //关闭PWM灯//P5P5M1 = 0x00; //0000 0000P5M0 = 0xFF; //1111 1111//M2415为高电平,打开PMOS开关,为外设供电P54 = 1;
}/*
* @name Power_ON_Indication
* @brief 上电指示
* @param None
* @retval None
*/
static void Power_ON_Indication()
{uint8_t i = 5;while(i--){//LED灯亮Run_LED.Run_LED_ON();//延时100毫秒Public.Delay_ms(100);//LED灯灭Run_LED.Run_LED_OFF();//延时100毫秒Public.Delay_ms(100); }
}/*
* @name IE_Init
* @brief 初始化中断
* @param None
* @retval None
*/
static void IE_Init()
{ET0 = 1; //开启定时器0中断EA = 1; //开启总中断
}/*
* @name Sys_Init
* @brief 系统初始化
* @param None
* @retval None
*/
static void Sys_Init()
{Public.Delay_ms(10); //上电后先等待硬件稳定Hardware_Init.GPIO_Init(); //GPIO口初始化Hardware_Init.Power_ON_Indication(); //上电指示Timer0.Timer0_Init(); //定时器0初始化Hardware_Init.IE_Init(); //中断初始化
}
/********************************************************End Of File
********************************************************/
main.c:
主函数里调用系统初始化函数,开启定时器定时
/******************************************************************************* @file main.c * @author * @version V1.0* @date 2022-xx-xx* @Conpany * @project STC15实战项目
*******************************************************************************//* Includes ------------------------------------------------------------------*/
#include <main.h>/* Private define-------------------------------------------------------------*//* Private variables----------------------------------------------------------*//* Public variables-----------------------------------------------------------*//* Private function prototypes------------------------------------------------*//*
* @name main
* @brief 主函数
* @param void
* @retval int
*/
int main(void)
{ //系统初始化Hardware_Init.Sys_Init();//系统主循环while(1){}
}
/********************************************************End Of File
********************************************************/
STC15单片机-LED闪烁(定时器)相关推荐
- STC15单片机-LED闪烁(面向对象程序结构)
LED闪烁(面向对象程序结构) 将LED闪烁(延时等待)的程序修改为面向对象的程序结构,C语言面向对象主要由结构体和函数指针实现 以后也都采用这种程序设计方法 面向对象知识 面向对象是软件开发方法,是 ...
- 义隆单片机c语言例程,简单的义隆单片机LED闪烁C程序
简单的义隆单片机LED闪烁C程序 fxhfxh 1726 10 朋友要求做一个由15个发光二极管并联组成的闪烁发光装置,要求价格尽量低,用3V纽扣电池供电,没有开关,只有一个按键.找来找去,目前只发现 ...
- 单片机led闪烁代码_单片机、555实现LED闪烁电路
有朋友在后台发消息,希望设计一个LED闪烁电路,闪烁频率为2Hz,想了解LED闪烁的电路原理是什么,下面解答一下,看看有没有写的很通俗易懂.要设计一个闪烁电路,闪烁频率为2Hz,即500ms亮灭交替. ...
- 单片机led闪烁代码_单片机驱动LED发光二极管的电路以及编程
一.单片机驱动单个发光二极管 1.电路 代码: 1.点亮单个LED二极管 #include<reg51.h> sbit LED1=P1^0:void main(void){LED1=1:w ...
- 基于STC15W4K32单片机仿真《定时器0实现LED闪烁》
1. 编 程 软 件:keil5版本 2.仿 真 软 件:Proteus8.12 3.单片机选型:STC15W4K32S4 4.学 习 目 标:学习定时器0 的使用 5.程 序 文 件 : /**** ...
- STC15单片机-GPIO模式介绍以及LED灯闪烁
GPIO 1.说明 GPIO,英文全称 General-purpose input/output,即通用型输入输出,是单片机中最常用的外设之一. 2.设置模式 STC15系列单片机最多有62个I/ ...
- Proteus:单片机定时器中断(LED闪烁)
题目概述: 单片机定时器中断(LED闪烁). 编程: #include <reg51.h> #define uchar unsigned char #define uint unsigne ...
- c语言控制led闪烁次数,单片机C语言程序设计之定时器控制4个LED滚动闪烁
描述 通过单片机课程设计,熟练掌握C语言的编程方法,将理论联系到实践中去,提高我们的动脑和动手的能力.通过定时器控制4只LED滚动闪烁系统的设计,掌握定时/计数器的使用方法,和简单程序的编写,最终提高 ...
- 51单片机实验 LED半秒闪烁 定时器0方式2 中断实现
51单片机实验 LED半秒闪烁 定时器0方式2 中断实现 实验目的: P1.0接一个发光管,实现亮半秒灭半秒, 要求使用定时器0工作方式2,中断实现. C语言代码: #include "at ...
- STC89C52单片机 LED灯闪烁
LED闪烁 循环语句 循环语句 (1)while(条件表达式){语句} 只有当 while 后面圆括号内条件表达式的值为真时,程序才会重复执行花括号内语句,当条件表达式为假时则不执行花括号内语句. ( ...
最新文章
- kalilinux安装VMware Tools(水文)
- RDKit | 基于RDKit和化学信息学探索化学空间
- Delphi中流对象 TStream
- 汇编中的length(返回利用dup定义的数组中的元素个数,即重复操作符dup前的count值)
- java文件编译_【java】javac编译多个有依赖关系的java文件为class文件
- Git Bash的一些命令和配置
- android include 点击事件,Android编程之include文件的使用方法
- 判断系统大小端方法分析与总结
- 一加7 Pro详细配置规格曝光:售价妥妥破5000
- Java中的关键字volatile解析
- mysql客户sqlyog_MySQL客户端工具 SQLyog
- uni-app 无网络图标不显示问题解决
- C++源文件的编译流程简介
- ListView适配器
- ajax谷歌浏览器提示等待超时,调用谷歌浏览器爬虫,selenium webdriver等设置等待时间和超时时间...
- 第一天:外企面试英语口语常用语
- Roberts、Prewitt、Sobel、Laplacian、LoG 和 Canny 边缘检测算子(MATLAB自写函数实现)
- Linux学习-28-用户间切换相关命令
- 如何将PDF制作成电子书
- 关于jquery md5插件的使用问题