OpenEdv-开源电子网
标题:
呼吸灯问题,请教下大神,已经折腾很久了
[打印本页]
作者:
往事随风就好
时间:
2019-6-2 09:18
标题:
呼吸灯问题,请教下大神,已经折腾很久了
开发需求是:
1. 刚开始LED1和LED2均灭
2. LED1渐亮渐灭一次,然后LED1灭。
3. LED2渐亮渐灭一次,然后LED2灭。
就这样一直循环
我写的代码为何实现不了,求大神解答,折腾很久了
#include "reg51.h"
sbit LED1=P2^0;
sbit LED2=P2^1;
unsigned char cycle=0;
unsigned int step=1;
unsigned int bright=0;
unsigned char cycle2=0;
unsigned int step2;
unsigned int bright2=0;
void test1(void);
void test2(void);
void delay(unsigned int time_i);
void main()
{
while(1)
{
test1();
test2();
}
}
void test1(void)
{
if(++cycle >250)
{
cycle = 0;
switch (step)
{
case 1 :
bright++;
if(bright > 250)
{
step ++;
}break;
case 2 :
bright--;
if(bright < 1)
{
step2 = 1;
}break;
}
}
if(cycle < bright)
{
LED1=0; //灯亮
}
else
{
LED1=1; // 灯灭
}
}
void test2(void)
{
if(++cycle2 >250)
{
cycle2 = 0;
switch (step2)
{
case 1 :
bright2++;
if(bright2 > 250)
{
step2 ++;
}break;
case 2 :
bright2--;
if(bright2 < 1)
{
step = 1;
}break;
}
}
if(cycle2 < bright2)
{
LED2=0; //灯亮
}
else
{
LED2=1; //
}
}
作者:
Plly
时间:
2019-6-2 19:21
test1(); , test2(); 这两个函数中没有一个循环结构,都是执行一下就退出,在 while(1) { test1(); test2(); }中,这两个函数执行一步就进退出再进入下一个。你可以让一个灯呼吸再两个,你参考#include < reg51.h >
#include < intrins.h >
sbit K1 =P3^0 ; //增加键
sbit K2 =P3^1 ; //减少键
sbit BEEP =P3^5 ; //蜂鸣器
unsigned char PWM=0x7f ; //赋初值
void Beep();
void delayms(unsigned char ms);
void delay(unsigned char t);
/*********************************************************/
void main()
{
P0=0xff;
TMOD=0x21 ;
TH0=0xfc ; //1ms延时常数 12M
TL0=0x18 ; //频率调节
TH1=PWM ; //脉宽调节
TL1=0 ;
EA=1;
ET0=1;
ET1=1;
TR0=1 ;
while(1)
{
do{
if(PWM!=0xff)
{
PWM++ ;
delayms(10);
}
else
Beep() ;
}
while(K1==0);
do{
if(PWM!=0x01)
{
PWM-- ;
delayms(10);
}
else
Beep() ;
}while(K2==0);
}
}
/*********************************************************/
// 定时器0中断服务程序.
/*********************************************************/
void timer0() interrupt 1
{
TR1=0 ;
TH0=0xfc ;
TL0=0x66 ;
TH1=PWM ;
TR1=1 ;
P0=0x00 ; //启动输出
}
/*********************************************************/
// 定时器1中断服务程序
/*********************************************************/
void timer1() interrupt 3
{
TR1=0 ;
P0=0xff ; //结束输出
}
/*********************************************************/
//蜂鸣器子程序
/*********************************************************/
void Beep()
{
unsigned char i ;
for (i=0; i<100; i++)
{
delay(100) ;
BEEP=!BEEP ; //Beep取反
}
BEEP=1 ; //关闭蜂鸣器
delayms(100);
}
/*********************************************************/
// 延时子程序
/*********************************************************/
void delay(unsigned char t)
{
while(t--) ;
}
/*********************************************************/
// 延时子程序
/*********************************************************/
void delayms(unsigned char ms)
{
unsigned char i ;
while(ms--)
{
for(i = 0; i < 120; i++) ;
}
}
作者:
HXYDJ
时间:
2019-6-3 09:07
LED控制引脚要用PWM波控制亮灭,不能用直接设置输出高低电平来控制。
作者:
Plly
时间:
2019-6-3 11:31
HXYDJ 发表于 2019-6-3 09:07
LED控制引脚要用PWM波控制亮灭,不能用直接设置输出高低电平来控制。
用51普通IO输出高低电平,模拟PWM,89C51没有PWM只能模拟。目前STC增强型单片机有PWM外设不需要模拟。
欢迎光临 OpenEdv-开源电子网 (https://www.openedv.com/)
Powered by Discuz! X3.4