#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit K1=P1^0; //按鍵1,PWM脈沖寬度值增加
sbit K2=P1^1; //按鍵2,PWM脈沖寬度值減少
sbit LED=P1^3; //LED顯示
sbit PWM_OUT=P1^4; //PWM輸出,SCR控制
uchar PWM,num; //PWM設定脈沖寬度值,num計算中斷次數;
void delay(uint ms) //1ms延時
{
uchar i;
while(ms--)
{
for(i=0;i<120;i++);
}
}
void keyscan() //按鍵掃描函數
{
if(K1==0) //按鍵1是否按下
{
delay(50); //去抖延時
if(K1==0) //按鍵1是否繼續按下
{
if(PWM<32) //PWM設定脈沖寬度值是否小于32
{
PWM++; //PWM設定脈沖寬度值加1
delay(100);
}
}
}
if(K2==0) //按鍵2是否按下
{
delay(50); //去抖延時
if(K2==0) //按鍵2是否繼續按下
{
if(PWM>1) //PWM設定脈沖寬度值是否大于1
{
PWM--; //PWM設定脈沖寬度值減1
delay(100);
}
}
}
}
void init_t0() //定時器T0初始化
{
TMOD=0x01; //方式1,16位定時器
TH0=(65536-500)/256; //0,5ms定時
TL0=(65536-500)%256; //0,5ms定時
EA=1; //開總中斷
ET0=1; //開定時器T0
TR0=1; //啟動定時器T0
}
void t0() interrupt 1 //T0中斷服務函數
{
TR0=0; //停止T0定時器
TH0=(65536-500)/256; //0,5ms定時
TL0=(65536-500)%256; //0,5ms定時
num++; //num計算中斷次數+1
if(num>32) //中斷次數大于32
{
num=0; //中斷次數=0
}
if(num<=PWM) //中斷次數<=PWM脈沖寬度
{
LED=0x01; //輸出高電平,小燈滅
PWM_OUT=0x00; //輸出低電平,關閉SCR
}
else
{
LED=0x00; //輸出低電平,小燈亮
PWM_OUT=0x01; //輸出高電平,啟動SCR
}
TR0=1; //啟動T0定時器,等待下一次中斷
}
void main()
{
init_t0(); //T0初始化
num=0; //num計算中斷次數=0
PWM=16; //PWM脈沖寬度=16
while(1)
{
keyscan(); //調用按鍵掃描函數
}
}
|