微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 我这是用指针做了一个流水灯 用的定时器进行延时1S 可是没调试成功

我这是用指针做了一个流水灯 用的定时器进行延时1S 可是没调试成功

时间:10-02 整理:3721RD 点击:
#include<reg52.h>
sbit ENLED = P1^4;
sbit ADDR3 = P1^3;
sbit ADDR2 = P1^2;
sbit ADDR1 = P1^1;
sbit ADDR0 = P1^0;
void shiftleft(unsigned char *p);         
void main()
{
unsigned int  i=0;
unsigned char buf=0x01;
  TMOD = 0X01;
  TH0 = 0XFC;
  TL0 = 0X67;
  TR0 = 1;
  ENLED = 0;
  ADDR3 = 1;
  ADDR0 = 0;
  ADDR1 = 1;
  ADDR2 = 1;

  while(1)
  {
      P0=~buf;
         for(i=0;i<40000;i++);
          
         while(1)
        {
            if(TF0 ==1)
                {
                   TF0 = 0;
                   TH0 = 0XFC;
                   TL0 = 0X67;
                   i++;
                   if(i==1000)
                   {
                       i=0;
                   }
                   break;
                  shiftleft(&buf);
                 
                }
        }
    if(buf == 0)
         {                                  
            buf= 0x01;
         }
         
           
  }
}
void shiftleft(unsigned char *p)
         {
         *p = *p <<1;
         }  
                      

OK, 用for延时写出来是OK的,那说明,你的控制代码和实现led流水的部分是OK的; 其实看你的中断程序觉得有些混乱,接下来,去分析下,正确的中断延时该怎么去写; 小编,不急,基础这个东西就是满满积累的,这个部分,一点点的去查自己的问题,然后修正,会收获更多,我就不举例子了,只给小编参考的一些方向,期待小编一点点的独立解决此问题。

延时用中断写的, 直接用for 循环的方式延时,小编试过吗? 结果怎么样? 个人觉得是这里中断延时的写法有错误。

  *p = *p <<1;  小编你查过优先级吗?

break; 是干什么用的?

跳出这个while循环

这个倒没有    这是写了一个指针进行的是左移操作

在这里我将定时器写在循环里面 每次都去判断间隔1s    这个原来的写法就是用的for非精确延时  结果是没有问题的   在这里我的思路是将原来的for非精确延时改写成精确延时   这样我就理不清楚了   求指教啊  刚开始学习单片机 c语言学的也不扎实   问题很多

break后面的语句执行不到啊?这个是你要的结果吗?

我刚开始接触这个  有点不太明白  还望大神指导                 
while(1)弄好了
        {
      P0=~buf;     
          if(TF0 ==1)
          {
                 TF0 = 0;
                 TH0 = 0XFC;
                 TL0 = 0X67;
                 i++;
                 if(i==1000)
                 {
                    i=0;
                        shiftleft(&buf);
                 }         
          }
         if(buf == 0)
         {                                  
            buf= 0x01;
         }
        }
         
}

void shiftleft(unsigned char *p)
         {
         *p = (*p) <<1;
         }  
                      

跳出直接往下执行啊

我先看看哈, 许久不弄这些有些生疏了。

呵呵,学习看看!

咋啦   我刚刚学习单片机  我就是虚心学习一下  看不懂程序  呵呵是啥个意思?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top