基于STC8G1K08A的可调节占空比和频率的PWM应用案例
基于STC8G的可调节占空比和频率的PWM应用案例
- CSDN的小白分享
- 前言
- 一、STC8G系列的介绍
- 二、使用记录
- 1.建立工程
- 2.打开工程所需的芯片功能,及本人的函数
- 总结
CSDN的小白分享
前言
学习单片机以来,都是写了就算的态度。总结的话用TXT和WPS文档老是容易忘掉放在了哪里。而且排版也不好看,无意间发现了可以在这里面做记录,于是就开始了啦!
由于工程需要(三色灯切换同时呼吸效果),最近在研究一款比较合适用来做面板LED控制的小成本芯片:以下就是STC8G1K08A系列的开发记录,实现了可调频调占空比的PWM输出。
一、STC8G系列的介绍
STC8G是STC公司最近新出的一款产品,它性价比高,内存充足等特点,主要是价格适合,功能足,可以满足各种扩展需要。至于其他内容可以上官网自己查看,不然就有卖广告的嫌疑了~
二、使用记录
1.建立工程
本人是在KEIL中进行开发的,所以使用前需要先在STC官网下载以下它的最新ISP软件,然后在软件把最新的STC8G系列的头文件加到KEIL的INC文件夹中。
2.打开工程所需的芯片功能,及本人的函数
1.主程序中断函数如下:
//定时器0中断----------------------------------------------------------------------------------------
void Time0() interrupt 1
{WDT_CONTR=0x30;Time_Cnt();
}
void main()
{Port_Init();EA = 0;Delay_Us(1);Delay_N_Ms(1);Timer0_Init();Delay_N_Ms(10);PWM_Init();PWM_Off();Delay_N_Ms(10);Data_Init();EA = 1;while(1){On_Off_Chk();Led_Control();}
}
2.初始化函数:
void Port_Init(void)//根据芯片引脚定义,把PWM的输出脚定义为推挽输出
{ P3M1 = 0xF3;//1111 0011P3M0 = 0x0C;//0000 1100 P5M1 = 0xEF;//1110 1111P5M0 = 0x10;//0001 0000
}
//定时器0初始化--------------------------------------------------------------------------------------
void Timer0_Init(void)
{AUXR |= 0x80; //定时器时钟1T模式TMOD &= 0xF0; //设置定时器模式TL0 = 0x20; //设置定时初值TH0 = 0xD1; //设置定时初值TF0 = 0; //清除TF0标志TR0 = 1; //定时器0开始计时ET0 = 1; //使能定时器0中断PT0 = 0; //定时器0优先级置低
}
void PWM_Init(void)
{CCON = 0x00;CMOD = 0x08; //PCA时钟为系统时钟CL = 0x00; //PCA计数器初始值低8位CH = 0x00; //PCA计数器初始值高8位CCAPM0 = 0x42; //PCA模块1为PWM工作模式PCA_PWM0 = 0xc0; //PCA模块1输出10位PWMCCAP0L = 0x00;CCAP0H = 0x00;CCAPM1 = 0x42; //PCA模块1为PWM工作模式PCA_PWM1 = 0xc0; //PCA模块1输出10位PWMCCAP1L = 0x00;CCAP1H = 0x00;CCAPM2 = 0x42; //PCA模块1为PWM工作模式PCA_PWM2 = 0xc0; //PCA模块1输出10位PWMCCAP2L = 0x00;CCAP2H = 0x00;CR = 1; //启动PCA计时器
}
void Data_Init(void)
{setPWM = 1023;chaSynFlag = 0;ledUpdateColorFlag = 0;ledKeepOffFlag = 0;pwmUpdateFlag = 0;switchOnFlag = 0;countBreNMs = 0;countOffNMs = 0;
}
3.为了简化输出和方便以后修改做的自定义函数封装:
void Time_Cnt(void)//程序主要时间逻辑计算函数
{countBreNMs++;if(countBreNMs >= PWM_BREATHE_NS){pwmUpdateFlag = 1;countBreNMs = 0;}count20Ms++;if(count20Ms >= 10){count20Ms = 0;count1S++;if(count1S >= 200){count1S = 0;countOffNMs ++;countHoldNMs++;if(countOffNMs >= PWM_OFF_TIME){countOffNMs = 0;ledKeepOffFlag = 0;}else if(countHoldNMs >= PWM_HOLD_TIME){countHoldNMs = 0;ledKeepHoldFlag = 0;}}}
}
void PWM_Output_Capp0(void)
{PCA_PWM0=0x30&(setPWM>>4)|0xc0;//高两位XCCAPnH[1:0]CCAP0H = setPWM;//低8位CCAPnH[7:0]
}void PWM_Output_Capp1(void)
{PCA_PWM1=0x30&(setPWM>>4)|0xc0;//高两位XCCAPnH[1:0]CCAP1H = setPWM;//低8位CCAPnH[7:0]
}void PWM_Output_Capp2(void)
{PCA_PWM2=0x30&(setPWM>>4)|0xc0;//高两位XCCAPnH[1:0]CCAP2H = setPWM;//低8位CCAPnH[7:0]
}void PWM_Off(void)
{PCA_PWM0|=0x3F;//高两位XCCAPnH[1:0]CCAP0H = 0XFF;//低8位CCAPnH[7:0]PCA_PWM1|=0x3F;//高两位XCCAPnH[1:0]CCAP1H = 0XFF;//低8位CCAPnH[7:0]PCA_PWM2|=0x3F;//高两位XCCAPnH[1:0]CCAP2H = 0XFF;//低8位CCAPnH[7:0]
}void PWM_On(void)
{if(chaSynFlag){if(!ledKeepHoldFlag){setPWM ++;if(setPWM == 1023){chaSynFlag = 0;ledUpdateColorFlag = 1;ledKeepOffFlag = 1; } } }else{setPWM --;if(setPWM == 0){chaSynFlag = 1;ledKeepHoldFlag = 1;countHoldNMs = 0; } }Led_Select();
}void Led_Control(void)
{if((!ledKeepOffFlag)&&(switchOnFlag)){if(pwmUpdateFlag){PWM_On();pwmUpdateFlag = 0; countOffNMs = 0; }}else{PWM_Off();countBreNMs = 0;}
}void On_Off_Chk(void)
{if(!ON_OFF_SW)switchOnFlag = 1;else{setPWM = 1023;chaSynFlag = 0;ledUpdateColorFlag = 0;ledKeepOffFlag = 0;pwmUpdateFlag = 0;switchOnFlag = 0;countBreNMs = 0;countOffNMs = 0;switchOnFlag = 0;}
}void Led_Select(void)
{if(ledUpdateColorFlag){ledUpdateColorFlag = 0;ledSelectCnt ++;if(ledSelectCnt >= 35){ledSelectCnt = 0;}ledSrlectData = ledBuf[ledSelectCnt];}if(ledSrlectData == 0)PWM_Output_Capp0();else if(ledSrlectData ==1)PWM_Output_Capp1();else if(ledSrlectData == 2)PWM_Output_Capp2();else if(ledSrlectData == 3){PWM_Output_Capp0();PWM_Output_Capp1();}else if(ledSrlectData == 4){PWM_Output_Capp1();PWM_Output_Capp2();}else if(ledSrlectData == 5){PWM_Output_Capp0();PWM_Output_Capp2();}else if(ledSrlectData == 6){PWM_Output_Capp0();PWM_Output_Capp1();PWM_Output_Capp2();}
}
4.在头文件中进行变量定义和宏定义即可方便的调节呼吸和变色效果:
sbit ON_OFF_SW = P5^5;
#define MAIN_Fosc 24000000L //定义主时钟
#define PWM_BREATHE_NS 5 //一次呼吸的时间
#define PWM_OFF_TIME 3 //每次停顿的时间
#define PWM_HOLD_TIME 3 //最亮停顿的时间
//screen
bit ledUpdateColorFlag=0;
bit ledKeepHoldFlag=0;
bit ledKeepOffFlag=0;
bit pwmUpdateFlag=0;
bit switchOnFlag=0;
bit chaSynFlag = 0;
u8 ledSrlectData=0;
u8 ledSelectCnt=0;
u16 setPWM=0;//10位占空比预存变量0-1023
u8 code ledBuf[35] =
{0,1,2,3,4,5,6,4,3,1,5,0,6,2,1,2,4,6,5,0,3,6,5,4,3,2,1,0,4,3,2,6,2,0,1
};//添加该数组目的是让灯的颜色变的随机(伪随机),可以适当的增加但同时对应的选择变量也要更改条件//Timer
u8 countBreNMs;
u8 countOffNMs;
u8 countHoldNMs;
u8 count20Ms;
u8 count1S;
总结
以上是这次工程的全部函数代码,至于一些基本的头文件这里就不一一的细讲了。工程实现了可调节呼吸频率,呼吸时间的三色灯。
小白一个,期待各位大佬多多指教。同时也希望自己能保持每个工程都编写文章以做记录和反省!
基于STC8G1K08A的可调节占空比和频率的PWM应用案例相关推荐
- 记:关于输出任意占空比与频率的一种方式——基于STM32单片机
0x00前言 写下这篇文章的主要目的时总结一下最近发现的一个较方便的波形调制方式.可以一定程度脱离手工计算,支持发出任意频率.任意占空比PWM控制信号的方式,使用了较为方便的寄存器的方式进行驱动.本文 ...
- 如何使用定时器产生两路频率可调、占空比可调的PWM波
接上次的博客,上一篇博客介绍的是产生两路频率可调.占空比固定为50%的方波,但是更多情况下也需要调节占空比,这篇博客简单介绍下.其实和频率可调的输出基本上是一样的,只需要再加上一个Duty来控制CCR ...
- 【STM8】PWM 捕获实战:占空比和频率(TIM1)
1. 前言 基于<[众拳STM8 40 讲]PWM 输入捕获原理与实验(频率)>我们已经了解了利用 STM8 库函数 如何捕获和计算 PWM 的频率,但是确没有介绍占空比的捕获方法. 基于 ...
- 【STM8】PWM 捕获实战:占空比和频率(TIM2)
1. 前言 基于<[众拳STM8 40 讲]PWM 输入捕获原理与实验(频率)>我们已经了解了利用 STM8 库函数 如何捕获和计算 PWM 的频率,但是确没有介绍占空比的捕获方法. 基于 ...
- 产生频率或者占空比可调的PWM波【汇编语言】
PWM在各个编程中都非常的重要,在学习32单片机,FPGA等中都有学习到,本次文章为介绍汇编语言编写频率或占空比可调的PWM波,从更加底层的方面介绍和去了解pwm波生成的过程,基于S3C2410X/S ...
- matlab方波假频现象分析,基于MATLAB 的信号时域采样及频率混叠现象分析
龙源期刊网 http://www.doczj.com/doc/7d04774eae45b307e87101f69e3143323968f58a.html 基于MATLAB 的信号时域采样及频率混叠现象 ...
- 基于倒谱法和线性预测法估计基音频率(MATLAB和Python)
基于倒谱法和线性预测法估计基音频率(MATLAB和Python) 倒谱法基音检测在python中实现 一帧信号的基音频率估计 wlen = 256 inc = 128 pitch = [] x1, F ...
- 10. GD32F103C8T6 定时器-测量pwm的占空比和频率
一. 利用TIM2的输入通道0,通道1测量pwm的占空比和频率 1. 配置gpio void inpit_gpio_config(void) {rcu_periph_clock_enable(RCU_ ...
- PWM占空比,频率,周期之间关系
PWM占空比,频率,周期之间关系 频率所涉及的是周期,频率与周期成倒数.脉宽与占空比所涉及的是周期.脉宽是在一个周期内高电平所占的时间,占空比(如其名)为在一个周期内高电平所占的比例.例如:假设频率为 ...
最新文章
- 算法代码中的循环矩阵在哪体现_循环移位可视化理解
- 怎样把DataGrid存放在ViewState中的无用数据卡掉
- directory not found for option
- 无线获取不到地址 服务器,部分无线终端无法通过DHCP获取IP地址问题经验案例...
- DevOps组件高可用的思路
- 【LeetCode】【HOT】617. 合并二叉树(递归)
- 你知道url中的特殊符号含义么
- flash游戏转换html5,一键转换——介绍我做的flash转html5工具LavaH
- st计算机编程语言,SoMAChineST编程语言介绍.pdf
- ndows10cad安装不上,win10安装cad2014会显示连接不到网络
- 链接形式的客服代码 QQ客服代码
- woocommerce 新增一个支付网关
- 基于java民航售票管理系统源码(java毕业设计)
- apache beam java api_Apache Beam的基本概念
- 计算机win10开机音乐,Windows10系统更改开关机声音的两种方法
- 4个万兆光口+8千兆combo光电复用口+16千兆电口万兆三层网管型工业以太网交换机HY5700-854XG8GC16GT
- 自定义vue3.0日历组件
- python运用1之flask
- hdu 6106	 Classes (二分)
- vue配置多页面应用~
热门文章
- EGE 库入门——手把手教你从零完成 Flappy Bird 的编写
- 鲸鱼外教培优完成B+轮2.2亿元融资 官网域名为拼音域名jingyupeiyou.com
- LiveGBS流媒体平台GB/T28181功能-摄像头SDK硬件NVR录像下级海康等平台录像回看设备录像查看下载
- Eclipse中文注释乱码解决
- 【LeetCode 简单题】88-二进制手表
- 计算机网络课件第三章,南京邮电大学计算机网络第三章习题.ppt
- ARCGIS安装及卸载中遇见的一些问题
- 生信论文分享:通过稳健矩阵分解对单细胞rna测序数据进行插值
- servlet过滤器有什么作用,一般用在什么地方??_乐字节java
- 在找靓机里用计算机表白,计算机编码表白,你会吗?