|
我加了段按键消抖加循环,在开发版上实现好了,程序在下面的回复中,我把按键改为了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,数越大PWM频率越高)
TL0=210; //写入预置值 (取值1-255,数越大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,数字越大变化越慢
keyscan(); //通过按键改变占空比
if(num<1) //num 这个数值是按键的次数
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计数
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灯灭
}
}
|
|