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;
}
}
}

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;
}
}
}

举报