单片机交流
直播中

李巍

7年用户 1400经验值
私信 关注
[问答]

怎样利用51单片机去执行不同的功能呢

51单片机如何同时执行不同的功能呢?

怎样利用51单片机去执行不同的功能呢?

回帖(1)

周丽

2021-10-18 10:24:55
  51单片机如何同时执行不同的功能
  我们来举个栗子,想要单片机在执行流水灯的时候同时执行心形流水灯(或者数码管),单单考虑利用C语言的逻辑来是很难达到的,因为代码是从第一行按顺序执行到最后一行,所以,按照C语言逻辑,只能运行完流水灯,再到心形流水灯,不能够达到同时运作的效果,所以,我们需要用到单片机内部提供的定时器功能,让定时器产生的中断一起工作,这样就可以达到同时执行流水灯,和心形流水灯同时运作的效果。
#include
typedef unsigned int uint;//重新定义数据类型的名字
typedef unsigned char uchar;
uchar code led[17] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//心形流水灯
//uchar code led1[17] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//测试代码
void T0_init()//定时器T0初始化
{
   TMOD=0x01;
   //初始化定时器值
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;
   //打开中断
   EA=1;
   TR0=1;
   ET0=1;  
}
//软件延时xms
void delay_ms(uint ms)
{
   uchar i;
   while(ms--)  
   for(i=115;i>0;i--);
}
//闪烁灯
void shansuodeng_led()
{
    P0=0xaa;
    P2=0xaa;
    delay_ms(500);
    P0=0x55;
    P2=0x55;
    delay_ms(500);
}
//心形流水灯
void liushuideng()
{
    uchar i;
    for (i=0;i<8;i++)
    {
       P2=0xff;
       P0=~led; //取反因为我的数组状态与实际不符,用取反来补
       delay_ms(100);
    }
    for (i=0;i<8;i++)
    {
       P0=0xff;
       P2=~led;
       delay_ms(100);
    }
}
//主函数
void main()
{
    T0_init(); //函数调用,定时器初始化
    while(1)
    {  
    liushuideng();  
    shansuodeng_led();
    }
}
//T0中断服务函数
void T0_ISR()interrupt 1
{  
   uchar j,i;
   //重装初值
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;
   i++;
   if(i==10) //计时0.5s
   {  
       i=0;   
       P1=~led[j++]; //P1流水灯
       if(j==8)  
       j=0;  
       }
    }
}

  
举报

更多回帖

×
20
完善资料,
赚取积分