|
#include <reg51.h>
/******************************************/
//#define PWM_DUTY 100 //定義PWM的周期,數(shù)值為時鐘周期數(shù),假如使用24.576MHZ的主頻,則PWM頻率為6000HZ。
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
sfr P3M1 = 0xB1; //P3M1.n,P3M0.n =00--->Standard, 01--->push-pull
sfr P3M0 = 0xB2; // =10--->pure input, 11--->open drain
sfr AUXR = 0x8E;
sfr INT_CLKO = 0x8F; //外部中斷允許和時鐘輸出寄存器
unsigned char pwm_led_val ;//LED占空比值 0-100 0最亮,pwm_led_val值越大,調(diào)光的速度越慢
unsigned char num=1;
sbit P_PWM = P3^5; //定義PWM輸出引腳。STC15w104S sbit key1 = P3^2;
bit flag=1;
sbit key_s2 = P3^0; //減鍵
sbit key_s3 = P3^1; //加鍵
sbit key_s4 = P3^2; //開關(guān)鍵
u8 pwm; //定義PWM輸出高電平的時間的變量。用戶操作PWM的變量。
u8 PWM_high,PWM_low; //中間變量,用戶請勿修改。
void delay_ms(unsigned char ms);
void LoadPWM(u16 i);
void Init_ALL(void)
{
P_PWM = 0;
P3M1 &= ~(1 << 5); //P3.5 設(shè)置為推挽輸出
P3M0 &= (1 << 5);
TR0 = 0; //停止計數(shù)
ET0 = 1; //允許中斷
PT0 = 1; //高優(yōu)先級中斷
TMOD &= 0xF0; //設(shè)置定時器模式 8位
TMOD |= 0x02; //設(shè)置定時器模式
AUXR &= 0x00; //12T
INT_CLKO |= 0x01; //輸出時鐘 0x01:允許將P3.5/T1腳配置為定時器0的時鐘輸出T0CLKO
TH0 = 0;
TL0 = 0;
// TR0 = 1; //定時器0運行控制位
EA = 1; //中斷總控制位
}
void delay(unsigned int z)//毫秒級延時
{
unsigned int x,y;
for(x = z; x > 0; x--)
for(y = 1104; y > 0 ; y--);
}
/******************** 主函數(shù)**************************/
void main(void)
{
Init_ALL();
pwm = 0; //給PWM一個初值,
LoadPWM(pwm); //計算PWM重裝值
P_PWM=1;
while (1)
{
if(flag==0)
{
if(key_s2 == 0) //S2按下LED變暗
{
delay(5);
if(key_s2 == 0)
{
if(pwm_led_val < 100)
{
pwm_led_val++;
// delay_ms(10);
LoadPWM(pwm_led_val); //計算PWM重裝
}
}
}
if(key_s3 == 0) //S3按鍵LED變亮
{
delay(5);
if(key_s3 == 0)
{
if(pwm_led_val > 0)
{
pwm_led_val--;
// delay_ms(100);
LoadPWM(pwm_led_val); //計算PWM重裝值
}
}
}
}
if(num==0)
{
if(key_s4==0)
{
delay(5);
if(key_s4==0)
{
INT_CLKO &= ~0x01;
num=1;
flag=1;
TR0=0;
P_PWM=1;
while(!key_s4);
P_PWM=1;
}
}
}
if(num==1)
{
if(key_s4==0)
{
delay(5);
if(key_s4==0)
{
INT_CLKO |= 0x01;
num=0;
flag=0;
pwm_led_val=0;
TR0=1;
LoadPWM(pwm_led_val);
while(!key_s4);
}
}
}
}
}
/**************** 計算PWM重裝值函數(shù) *******************/
void LoadPWM(u16 i)
{
u8 j;
if(i<1) i=1;
if(i>100) i=100;
i = i; //計算PWM低電平時間
j = 255UL - i; //計算PWM高電平時間
EA = 0;
PWM_high = i; //裝載PWM高電平時間
PWM_low = j; //裝載PWM低電平時間
EA = 1;
}
/********************* Timer0中斷函數(shù)************************/
void timer0_int (void) interrupt 1
{
if(P_PWM) //如果是輸出高電平,則裝載低電平時間。
{
TH0 = (u8)(PWM_low );
TL0 = (u8)PWM_low;
}
else //如果是輸出低電平,則裝載高電平時間。
{
TH0 = (u8)(PWM_high);
TL0 = (u8)PWM_high;
}
}
|
|