|
- /*****************************************************
- 功能:通過按鍵控制STC12C5A60S2內(nèi)部PWM通過
- P1.3和P1.4輸出PWM控制LED并用數(shù)碼管顯示
- 單片機(jī):STC12C5A60S2
- 晶振:11.0592M
- 作者:蘇義江改編自網(wǎng)絡(luò)
- 時(shí)間: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調(diào)整函數(shù)
- void PWM0_set(uchar empty); //直接付PWM的值
- //stc10f系列 單周期指令的ms級延時(shí)
- void DelayMs(uchar ms) //這個(gè)延時(shí)可能不對,非關(guān)鍵部分,可自己修改
- {
- uint i; while(ms--)
- {
- for(i = 0; i < 850; i++);
- }
- }
- void init_PWM()
- {
- CCON=0X00;
- CH=0;
- CL=0;
- //時(shí)鐘分頻也就是輸出的頻率。 0X00:以系統(tǒng)時(shí)鐘/12 為時(shí)鐘源,0X02:系統(tǒng)時(shí)鐘/2,0x08:系統(tǒng)時(shí)鐘
- 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輸出,下降沿產(chǎn)生中斷;
- //0X63:上升沿產(chǎn)生中斷;0X73:跳變沿產(chǎn)生中斷
- CCAPM0=0X42;
- CCAPM1=0X42;
- CR=1; //計(jì)時(shí)器開始工作
- }
- void PWM0_set(uchar empty) //直接設(shè)置占空比
- {
- CCAP0L=empty;
- CCAP0H=empty;
- CCAP1L=empty;
- CCAP1H=empty;
- }
- //占空比調(diào)節(jié)函數(shù)
- 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); //按鍵釋放才跳出執(zhí)行下一步
- 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; //使能比較器,啟動(dòng)脈寬調(diào)節(jié)模式
- //控制輸出占空比(與CL比較,當(dāng)CL<CCAP0L時(shí)輸出低電平,反之高電平)
- CCAP0L=0x50;
- CCAP0H=0x50;
- //CL溢出時(shí),CCAP0H自動(dòng)裝入CCAP0L
- CCAPM1=0x42; //PWM1同上
- CCAP1L=0x50;
- CCAP1H=0x50;
- CR=1; //PCA計(jì)數(shù)啟動(dòng)
- }
- // -------- 調(diào)速 ---------
- void format(uchar a,uchar b)
- {
- CCAP0L=a;//控制輸出占空比(與CL比較,當(dāng)CL<CCAP0L時(shí)輸出低電平,反之高電平)
- CCAP0H=a;//CL溢出時(shí),CCAP0H自動(dòng)裝入CCAP0L
- CCAP1L=b;
- CCAP1H=b;
- }
- // -------- 后退 ---------
- void turnback(uchar a,uchar b)
- {
- format(a,b);
- In1=0;In2=1;In3=0;In4=1;
- }
- // -------- 前進(jìn) ---------
- 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;
- }*/
-
復(fù)制代碼
|
|