我加了段按鍵消抖加循環(huán),在開發(fā)版上實現(xiàn)好了,程序在下面的回復中,我把按鍵改為了3.0口。#include <reg51.h>
#define uInt unsigned int
#define uchar unsigned char
uchar PWM_T = 0; //占空比控制變量
uchar num;
sbit c2=P3^0; //1個按鍵,決定輸出PWM_T值
void delay10ms(void)
{
uchar i,j;
for(i=0;i<200;i++)
for(j=0;j<200;j++);
}//軟件消抖加延時
void keyscan()
{
if(c2==0)
{
while(c2==0);
num++;
}
}//確認一個按鍵按下
/****************************************************
主程序
****************************************************/
void main(void)
{
uInt n;
TMOD=0x02; //定時器0,工作模式2,8位定時模式
TH0=210; //寫入預置初值(取值1-255,數(shù)越大PWM頻率越高)
TL0=210; //寫入預置值 (取值1-255,數(shù)越大PWM頻率越高)
TR0=1; //啟動定時器
ET0=1; //允許定時器0中斷
EA=1; //允許總中斷
P1=0xff; //初始化P1,輸出端口
P0=0xff; //初始化P0
while(1) //PWM周期100,高電平100- PWM_T, 低電平PWM_T,低電平工作
{
for(n=0;n<200;n++); //延時,取值0-65535,數(shù)字越大變化越慢
keyscan(); //通過按鍵改變占空比
if(num<1) //num 這個數(shù)值是按鍵的次數(shù)
PWM_T=0;
else if(num<2) //這些值可以改變
PWM_T=10;
else if(num<3)
PWM_T=35;
else if(num<4)
PWM_T=60;
else if(num<5)
PWM_T=85;
else if(num<6)
{PWM_T=100;num=0;}
}
}
/****************************************************
/定時器0中斷模擬PWM
****************************************************/
timer0() interrupt 1 using 2
{
static uchar t ; //PWM計數(shù)
t++; //每次定時器溢出加1
if(t==100) //PWM周期 100個單位
{
t=0; //使t=0,開始新的PWM周期
P1=0x00; //使LED燈亮 ,輸出端口
P0=0x00; //使LED燈亮 ,輸出端口
}
if(PWM_T==t) //按照當前占空比切換輸出為高電平
{ P1=0xff; //使LED燈滅
P0=0xff; //使LED燈滅
}
}
|