菜鸟求助PWM控制LED闪烁问题
#include<reg52.h>typedef unsigned char uint8;
typedef unsigned int uint16;
sbit LED = P0^0;//定义一个LED小灯
sbit ENLED = P1^4;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
void delay(uint16 t);
void init_t0();
uint8 PWM;
uint8 NUM;
main()
{
ENLED = 0;ADDR3 = 1; //使能38译码器
ADDR0 = 0; ADDR1 = 1; ADDR2 = 1; //使能LED
PWM=0x7f; //初值
LED=1; //初值 熄灭LED
init_t0(); //定时器
while(1) //渐亮、渐暗语句
{
if(PWM!=0xff)
{
PWM++;
delay(100);
}
if(PWM!=0x01)
{
PWM--;
delay(100);
}
}
}
void delay(uint16 t)//延时程序
{
uint16 x;
uint8 y;
for(x=t;x>0;x--)
{
for(y=120;y>0;y--)
{}
}
}
void init_t0() //定时器控制
{
TMOD=0X01;
TH0 =255;
TL0 =256-PWM;
EA=1;
ET0=1;
TR0=1;
}
void timer0() interrupt 1 //中断 NUM的奇偶模拟LED的高低电平
{
TR0=0;
NUM++;
if(NUM%2==1)
{
LED=0;
TH0=255;
TL0=256-PWM;
TR0=1;
}
if(NUM%2==0)
{
LED=1;
TH0=255;
TL0=PWM;
TR0=1;
}
}
各位牛掰掰们,瞅瞅哪里出问题了
请指教下,
幸苦了! 给你个例子慢慢看!/*
程序说明:
由P2_0输出PWM,12M时输出100Hz,
LED接在P2_0上,每0.1秒钟改变一次亮度。
制作者;bbsniua
2012/9/1
*/
#include<AT89X51.H> // AT89X51专属库
#define uint8_t unsigned char
#define LED P2_0 // PWM输出
uint8_t P_S,PWM,d_ms;
void mcu_init() // mcu初始化子函数
{
TMOD = 0x02; // T0为8位自动重装定时器
TH0= 256-100; // T0自动重装值,12M晶体时100uS中断一次
TL0= 256-100; // T0预装值
ET0= 1; // 开T0中断
TR0= 1; // 启动T0
EA = 1; // 开总中断
P_S= 1; // PWM计数
PWM= 0; // PWM占空比
P2 = 0xFF;
}
void int_t0(void) interrupt TF0_VECTOR // T0中断函数,12M晶体时100uS中断一次
{
++P_S;
if(P_S>100)
{
P2_0 = 1;
P_S = 1;
if(d_ms)
{
--d_ms;
}
}
if(P_S>PWM)
{
P2_0 = 0;
}
}
void delay_ms(uint8_t xms)
{
d_ms = xms;
while(d_ms);
}
void main() // 主函数
{
mcu_init(); // mcu寄存器初始化
while(1)
{
delay_ms(10); // 每100mS更改一次PWM占空比
++PWM;
if(PWM>100)
{
PWM = 0;
}
}
}
页:
[1]