- /*****************************************************
- 功能:通过按键控制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;
- }*/
-
复制代码
|