AT89C51单片机的P1口控制8盏LED流水灯

通电后最低位引脚接的灯先亮,然后熄灭,第二只引脚接的灯亮,再灭,按此方式直到第八盏灯,一个轮回后继续重复上一轮回直到断电,画出硬件电路图,设计程序,要求时间的延时用软件延... 通电后最低位引脚接的灯先亮,然后熄灭,第二只引脚接的灯亮,再灭,按此方式直到第八盏灯,一个轮回后继续重复上一轮回直到断电,画出硬件电路图,设计程序,要求时间的延时用软件延时和定时器延时两种方法实现
跪求
展开
 我来答
liuzhou_huang
推荐于2017-09-21 · TA获得超过979个赞
知道小有建树答主
回答量:795
采纳率:93%
帮助的人:255万
展开全部

# include "reg51.h"                   // 包含头文件

#define uchar unsigned char

void  delay02s(void)                 // 延时0.2s子程序

 {

 unsigned  char i,j,k;

    for ( i=2;i>0;i-- )

    for (j=200;j>0;j-- )

    for (k=250;k>0;k-- );

 }

 

void  main (void)                    // 主函数

{

 uchar i,j;

 while (1)                           // 死循环

 {

 j=0x01;                         // j初始化为0x01,左移初始值

 for(i=0;i<8;i++)                 // for循环语句,完成8个循环

  {

    P1= ~ j;                       // 对变量j 中的值按位取反后,从P1口输出

    delay02s( );                    // 延时0.2s

    j= j<<1;                       // 左移1位

  }

   j=0x80;                          // 设置右移初始值j为0x80

 for (i=0;i<8;i++)

  {

    P1= ~ j;

    delay02s( );

          j= j>>1;                       // 右移1位

          }

        }

     }

这只是延时的方法实现的。

追问
多谢你的回答啊,这是定时器延迟还是软件延迟啊?
追答
延时。定时器的话,你可以试着这样去想一下:
# include "reg51.h" // 包含头文件
#define uchar unsigned char
uchar timeCnt;
void main (void) // 主函数
{
TMOD = 0x01;
TH0 = 0x3C;
TL0 = 0xB0;
ET0=1;
EA=1;
TR0=1;
while (1) ; // 死循环
}

void Timer0() interrupt 1
{
TH0 = 0x3C;
TL0 = 0xB0;
timeCnt++;
if(timeCnt==20) P1=0xFE;
if(timeCnt==40) P1=0xFD;
if(timeCnt==60) P1=0xFB;
if(timeCnt==80) P1=0xF7;
if(timeCnt==100) P1=0xEF;
if(timeCnt==120) P1=0xDF;
if(timeCnt==140) P1=0xBF;
if(timeCnt==160) { P1=0x7F; timeCnt=0;}
}
方法大概是这样,我没有上机试过。你可以看看。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式