weixin_51366159
weixin_51366159
2021-01-22 15:56

求大佬帮忙解答如何定时器控制led闪烁时的一些问题

  • c++
  • 机器学习
  • c语言
  • 人工智能

第一种方法;
#include"reg51.h"
unsigned int i=0,j=1,h=0;
sbit aj1=P3^0;
sbit aj2=P3^1;
sbit led=P2^0;
void timer()
{
TMOD=0x01; 
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
EA=1;
ET1=1;
TR1=1;
}
void delay(unsigned int n)
{   unsigned int k,u;
 for(k=0;n<5;k++){
             for(u=0;u<120;u++)
                 ;
                  }
}
void x()//P3^0
{
IT0=1;
EX0=1;
EA=1;
aj1=1;
}
void y()//P3^1
{
IT0=1;
EX1=1;
EA=1;
aj2=1;
}

int main()
{ 
 x();/*interrupt 0*/
 y();/*interrupt 1*/
 timer();
 while(1);
 
}
void time1()interrupt 3
{
 if(j<=0) {j=1;}
TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
    i++;
 if(i==(100*j))
   { i=0;led=~led; }
 
 }
 
void timer2() interrupt 0
{
 if(aj1==0)
 {j=j+1;
 delay(5);
 }
}
void timer3() interrupt 2
{
  if(aj2==0)
 {j=j-1;}
 delay(5);
}
第二种方法;
#include"reg51.h"
unsigned int w=1,flag=0,fla=0,i,j;
char s[]={0x3f,0x06,0x5B,0x4f,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
sbit aj1=P3^2;
sbit aj2=P3^3;
sbit led=P3^4;
void scan1()
{if(aj1==0&&flag==0){flag=1;}
 if(aj1==1&&flag==1){w++;flag=0;}
}
void scan2()
{if(aj2==0&&fla==0){fla=1;}
 if(aj2==1&&fla==1){w--;fla=0;}
}
void timer()
{
TMOD=0x01; 
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1;
}
void display()
{
P0=s[w];
 if(w==10){w=1;}
 if(w==0){w=9;}
 
}
int main()
{
 while(1)
 {
 scan1();
 scan2();
 display();
  j=100*w;
  for(i=1;i!=(j+1);i++)
       {  timer();
    }
  i=1;  
 }
 
}
void time()interrupt 1
{
TH0=(65536-10000)/256;
 TL0=(65536-10000)%256;
 if(j==i)
   { led=~led; i=i-1;}
 
 }

       第一种方法;anj2所控制的数码管能正常显示,但是控制led闪烁却有时失灵(特别是在快速点击按键时);anj1一旦按下数码管的数值立刻变为1,且led只能闪烁一秒钟。

第二种第一种方法;数码管上 的数字能够准确地被两个按键控制,但是led却一直亮没有延时;我认为第一种方法可能时延时函数出现了问题,于是就用另一种方法(添加标志位)将延时函数替换掉,但是此时两个按键所控制的定时器却又失灵。无奈只能将两个按键的定时器去掉,直接用函数来判断两个按键是否发生了变化。但是此时数码管上 的数字能够准确地被两个按键控制,但是led却一直亮没有延时

  • 点赞
  • 回答
  • 收藏
  • 复制链接分享

0条回答

为你推荐

换一换