标题:
STC12C5A60S2片内PWM按键控制加减
[打印本页]
作者:
腾飞的龙
时间:
2015-11-14 17:05
标题:
STC12C5A60S2片内PWM按键控制加减
/*****************************************************
功能:通过按键控制STC12C5A60S2内部PWM通过
P1.3和P1.4输出PWM控制LED并用数码管显示
单片机:STC12C5A60S2
晶振:11.0592M
作者:苏义江改编自网络
时间:2015-7-22
***************************************************/
#include"12C5A.h"
#define uint unsigned int
#define uchar unsigned char
uchar code table[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,0x89,0x8c};
sbit wei=P0^6;
sbit duan=P0^7;
sbit jiaPWM=P1^0;//通过P10低电平(按键)加PWM占空比
sbit jianPWM=P1^1; //按键P11低电平 减PWM占空比
sbit In1=P0^0;
sbit In2=P0^1;
sbit In3=P0^2;
sbit In4=P0^3;
void DelayMs(uchar ms);
void init_PWM(); //PWM 初始化
void PWM0_change(uchar type,uchar change);//PWM调整函数
void PWM0_set(uchar empty); //直接付PWM的值
//stc10f系列 单周期指令的ms级延时
void DelayMs(uchar ms) //这个延时可能不对,非关键部分,可自己修改
{
uint i; while(ms--)
{
for(i = 0; i < 850; i++);
}
}
void init_PWM()
{
CCON=0X00;
CH=0;
CL=0;
//时钟分频也就是输出的频率。 0X00:以系统时钟/12 为时钟源,0X02:系统时钟/2,0x08:系统时钟
CMOD=0X02;
//起始占空比,0XC0:占空比为25%,0X80:占空比为50%,0X40:占空比为75%
PWM0_set(0X80); //
PCA_PWM1=0x00;
PCA_PWM0=0x00; //控制占空比的第九位为0
//0X42:8位PWM P1.3输出, P1.4输出,无中断;0X53:8位PWM输出,下降沿产生中断;
//0X63:上升沿产生中断;0X73:跳变沿产生中断
CCAPM0=0X42;
CCAPM1=0X42;
CR=1; //计时器开始工作
}
void PWM0_set(uchar empty) //直接设置占空比
{
CCAP0L=empty;
CCAP0H=empty;
CCAP1L=empty;
CCAP1H=empty;
}
//占空比调节函数
void PWM0_change(uchar type,uchar change) //type=0减占空比,1增加占空比
//change: 0X0C 约5%,0X05约2%
{
if(type==0)
{
if(CCAP0L<0XE6) //<90%
{
CCAP0L+=change;
CCAP0H+=change;
CCAP1L+=change;
CCAP1H+=change;
}
}
else
{
if(CCAP0L>0X19) //>10%
{
CCAP0L-=change;
CCAP0H-=change;
CCAP1L-=change;
CCAP1H-=change;
}
}
}
void display()
{
uchar bai,shi,ge;
bai=CCAP0L/100;
shi=CCAP0L/10%10;
ge=CCAP0L%10;
wei=1;
P2=0xfe;
wei=0;
duan=1;
P2=table[bai];
DelayMs(500);
P2=0xff;
wei=1;
P2=0xfd;
wei=0;
duan=1;
P2=table[shi];
DelayMs(500);
P2=0xff;
wei=1;
P2=0xfb;
wei=0;
duan=1;
P2=table[ge];
DelayMs(500);
P2=0xff;
}
void main()
{
init_PWM(); //初始化,PWM输出
while(1)
{
if(jiaPWM==0) //按键减PWM占空比
{
DelayMs(500); //按键消抖
while(jiaPWM==0); //按键释放才跳出执行下一步
PWM0_change(1,0X0c); //change: 0X0C 约5%,0X05约2%
display();
}
if(jianPWM==0)//按键 增 PWM占空比
{
DelayMs(500);
while(jianPWM==0);
PWM0_change(0,0X0c); //change: 0X0C 约5%,0X05约2%
display();
}
}
}
//一下程序P13口和P14口直接赋PWM值,控制程序速度,直接给a和b赋值
// pwm初始化 */
/*void initpwm()
{
CCAPM0=0x42; //使能比较器,启动脉宽调节模式
//控制输出占空比(与CL比较,当CL<CCAP0L时输出低电平,反之高电平)
CCAP0L=0x50;
CCAP0H=0x50;
//CL溢出时,CCAP0H自动装入CCAP0L
CCAPM1=0x42; //PWM1同上
CCAP1L=0x50;
CCAP1H=0x50;
CR=1; //PCA计数启动
}
// -------- 调速 ---------
void format(uchar a,uchar b)
{
CCAP0L=a;//控制输出占空比(与CL比较,当CL<CCAP0L时输出低电平,反之高电平)
CCAP0H=a;//CL溢出时,CCAP0H自动装入CCAP0L
CCAP1L=b;
CCAP1H=b;
}
// -------- 后退 ---------
void turnback(uchar a,uchar b)
{
format(a,b);
In1=0;In2=1;In3=0;In4=1;
}
// -------- 前进 ---------
void run(uchar a,uchar b)
{
format(a,b);
In1=1;In2=0;In3=1;In4=0;
}
// -------- 停止 ---------
void stop()
{
In1=1;In2=1;In3=1;In4=1;
}*/
复制代码
作者:
aidanpianji
时间:
2015-11-14 19:31
有难度。看不懂
作者:
腾飞的龙
时间:
2015-11-15 13:27
STC单片机自带输出PWM功能。用PWM可以控制灯的渐亮和渐暗,也可以控制小车电机转动快慢。
作者:
林霖
时间:
2016-10-26 15:17
谢谢楼主,可以用来研究下STC12C5A60S2的pwm。
作者:
45555mkkl
时间:
2016-10-31 21:43
头文件在KEIL编译器找不到,这怎么解决呢
作者:
腾飞的龙
时间:
2016-11-5 12:45
45555mkkl 发表于 2016-10-31 21:43
头文件在KEIL编译器找不到,这怎么解决呢
论坛里有在keil里面添加STC头文件。你找一找
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1