该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
答应给你的程序
程序采用计数的方法,
还有一个程序是用改变定时器TH和TL值的方法,可以输出很高的频率,不过由于电脑格式化,程序已经没有了,就暂时不发了
/****************************************/
/*
Pwm.c
*/
/*
PWM软件模拟
/*
/*
模拟方式:计数式
*/
/*
2012-2-14
*/
/*****************************************/
#include #define PwmIO1 P1_0//LED接P1.0 #define Button P1_2//按扭 #define H 0//设定脉冲方向(反向)
#define L 1 unsigned char PWM1;//pwm1计数 unsigned char PR1;//当前占空比 void PWMInte()interrupt 1//中断服务,用于产生PWM
{
TH0 = 0xFF;
TL0 = TL0+0xA3+3;//重装 if(PR1 == 0)
PwmIO1 = L;//占空比为0时输出L
else if(PR1 == 100)
PwmIO1 = H;//占空比为1时输出H
else//平时输出PWM
{
if(++PWM1 > 100)//计数
PWM1 = 0;//复位
} if(PWM1 > PR1)//到占空比
PwmIO1 = L;//输出L
else//没到占空比
PwmIO1 = H;//输出H
}
/**************************************************************/
delay10ms()//延时10ms
{
unsigned char i,n;
for(i=0 ; i<10 ; i++)
{
for(n=0 ; n<124 ; n++);
}
}
/**************************************************************/
void main(void)
{
unsigned char n;//计数,用于延时 PR1 = 50;//初始化占空比为50 TMOD |= 0x01;//定时器0不自动重装
IE = 0x82;//打开中断 TH0 = 0xFF;//定时0.01ms
TL0 = 0xA3;
TR0 = 1;//开定时器
while(1)
{
if(!Button)//按下按键
{
delay10ms();
if(!Button)//无抖动
{
while(!Button);//等待松开按键
while(PR1<101)//亮度增加到最大
{
delay10ms();//延时一会
PR1++;
} for( n=0 ; n<50 ; n++)
delay10ms();//等待一会 while( PR1 )//亮度减至最小
{
delay10ms();//延时一会
PR1--;
}
}
}
}
}