P1口接有8个发光二极管,要求编程使八个发光二极管从左到右轮流点亮,每个发光二极管点亮时间为100ms

2024-12-28 21:20:06
推荐回答(2个)
回答1:

#include
void init_t0(void);
void t0_int(void) interrupt 1;
int i = 8; //循环次数为8
void main()
{
P1 = 0xff; //初始化LED,8个LED全灭,(假设低电平点亮)
init_t0() ;
while(1); //循环等待定时中断
}
void init_t0() //定时器0初始化程序
{
TMOD = 0x01;
TH0 =0x3c; //晶振6MHz,每个机器周期2us,所需计数时间为100ms=100000us
TL0 =0xb0; //定时器T0工作于方式1,最大定时时间为65536*2=131072us
ET0 =1; //所需计数值=(131072-100000)/2=15536,转换为16进制即为0x3cb0
EA =1;
TR0 =1;
}
void t0_int() interrupt 1 //定时器0的中断处理函数
{
TH0 =0x3c;
TL0 =0xb0;
i = i-1;
if (i!=0)
{
P1 >>= 1;
}
else
{
ET0 =0; //8个灯已点亮,关中断,关定时器
EA =0;
TR0 =0;
}
}

回答2:

C代码如下:
#include
#include //包含循环左移函数 _cro_l头文件
unsigned char tmp; //中间变量
//////////////////////////////////////////////////////////////////////////////////////////////////
// 延时子程序
////////////////////////////////////////////////////////////////////////////////////////////////
void delay(unsigned int cnt)
{
while(--cnt);
}
//////////////////////////////////////////////////////////////////////////////////////////////////
// 主函数
////////////////////////////////////////////////////////////////////////////////////////////////
main()
{
while(1) //外层循环
{
tmp = 0xfe;
P1 = tmp;
while(1) //内层循环,执行1、3、5、7亮灯循环
{
delay(30000); //延时以便能观察到灯亮移动,自己可以调整时间,由晶振和实参决定
tmp = _crol_(tmp,2);
P1 = tmp;
if(tmp == 0xbf) //判断是否已经点亮到第7灯。是,则退出进入2、4、6、8循环
{
break;
}
}
tmp = 0xfd;
P1 = tmp;
while(1) //内层循环,执行2、4、6、8亮灯循环
{
delay(30000); //延时以便能观察到灯亮移动,自己可以调整时间,由晶振和实参决定
tmp = _crol_(tmp,2);
P1 = tmp;
if(tmp == 0x7f) //判断是否已经点亮到第8灯。是,则退出进入1、3、5、7循环
{
break;
}
}

}
}