找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4289|回复: 9
收起左侧

单片机流水灯编程求教 不理解怎么和delay配合工作

[复制链接]
ID:250349 发表于 2017-11-17 11:09 | 显示全部楼层 |阅读模式
单片机源程序:

#include<reg52.h>//开头,字体HGSoeiPresemceEB
#include<intrins.h>//用intrins头文件函数
#define uchar unsigned char//宏定义uchar代表unsigned char
#define uint  unsigned int//宏定义unit代表unsigned int
uint a;//定义a为无符号整型(16位)
uchar i;//定义i为无符号字符型(8位)
uchar temp;//定义字符型变量
void delay(uint z);//void为无返回值函数,delay为时间延时函数
void main()//唯一主函数,无返回值,没参数
{
        temp = 0x7f;//temp赋值为11111110
        P1 = temp;//P1赋值为temp
        while(1)//无限循环
        {
                for(i = 0; i <8; i++)//i从0开始,<8,执行函数,0+1,<8,执行函数,0+1+1,<8,执行函数...一直到0+1+1+1+1+1+1+1+1为止跳出函数
                {
                        temp = _crol_(temp,1);//定义的temp每次左移一位,循环
                        P1 = temp;//赋值P1为temp
                        delay(500);//延时500毫秒
                 }
        }
}         
void delay(uint z) //定义z,z是int型形式参数(形参)
{
        uint x,y;//定义x和y都是int型数值
        for(x = z; x > 0; x--)//for循环初始值x=z,当x>0时,成立,x自减
                for(y = 120; y > 0 ; y--);//for循环初始值y=120,当y>0时,成立,y自减

}        
按照教程,控制led灯的流水闪烁,但是有几个红字的地方,我不是很懂,希望得到大家的帮助
最后这段
uint x,y;//定义x和y都是int型数值
        for(x = z; x > 0; x--)//for循环初始值x=z,当x>0时,成立,x自减
                for(y = 120; y > 0 ; y--);//for循环初始值y=120,当y>0时,成立,y自减
虽然做了注释,但是,我不理解,他是怎么和delay(500)配合工作的,如果删了这一段,led灯就流水闪烁的特别厉害,,谢谢大家的帮助,,,





回复

使用道具 举报

ID:215444 发表于 2017-11-17 11:55 | 显示全部楼层
删除这一段,为什么LED还能亮,因为你把子函数都删除,不能编译的吧,还有delay(500)可以用stc-isp-15xx-v6.86D这个软件生出
回复

使用道具 举报

ID:250349 发表于 2017-11-17 13:09 | 显示全部楼层
k455619 发表于 2017-11-17 11:55
删除这一段,为什么LED还能亮,因为你把子函数都删除,不能编译的吧,还有delay(500)可以用stc-isp-15xx-v6 ...

我不了解y=120   和  delay(500)他们中间的关系,,,
回复

使用道具 举报

ID:247257 发表于 2017-11-23 11:20 | 显示全部楼层
  delay(500)是延时500ms的意思,就是执行到  delay(500)《---这里的时候等500ms在继续运行,也就是以500ms的间隔进行灯的切换。你删了这一段就没有延时了,自然闪烁地很快了
回复

使用道具 举报

ID:212797 发表于 2017-11-23 13:18 | 显示全部楼层
void delay(uint z) //定义z,z是int型形式参数(形参)
{
        uint x,y;//定义x和y都是int型数值
        for(x = z; x > 0; x--)//for循环初始值x=z,当x>0时,成立,x自减
                for(y = 120; y > 0 ; y--);//for循环初始值y=120,当y>0时,成立,y自减

}  
这个函数的意思是,当z=1时,函数运行需要消耗1ms的时间。而把z改为500时,执行这段程序就需要消耗500ms,所以说把这段程序嵌入到主程序里面就是为了延时500ms(实际是CPU在那干耗着)。
回复

使用道具 举报

ID:252134 发表于 2017-11-23 18:08 | 显示全部楼层
……就2句话……
这是一个延时函数……没啥好解释的啊
函数内部就是一个2层的for循环结构,调用该函数以后,cpu就开始在for循环里执行,for循环里只做循环体的判断,没有任何其他语句,目的就是消耗CPU时间以达到延时的目的.
void delay(uint z)
{
uint x,y;
//总共 z * 120 次循环
for(x=z;x>0;x--) //z次循环
for(y=120;y>0;y--); //120次循环
}
如果想具体计算上面的函数究竟延时多长时间,要先知道CPU的时钟频率是多少,还有搞清楚这段代码在编译器编译以后的汇编指令有多少条(每条指令的执行周期是多少),这些信息都知道了就可以算延时时间了.
真正要相对比较精确地延时的话,延时函数的代码一般是直接使用汇编语言来写的.
回复

使用道具 举报

ID:243143 发表于 2017-11-24 13:47 | 显示全部楼层
void delay(uint z) //定义z,z是int型形式参数(形参)
{
        uint x,y;//定义x和y都是int型数值
        for(x = z; x > 0; x--)//for循环初始值x=z,当x>0时,成立,x自减
                for(y = 120; y > 0 ; y--);//for循环初始值y=120,当y>0时,成立,y自减

}   

看第二个for循环后面有个分号,实际就是在空运行。
回复

使用道具 举报

ID:111634 发表于 2017-11-24 14:47 | 显示全部楼层
先学理论,打基础,就不会有这么多问题了,本坛至少有50%的问题属于此类情况。
回复

使用道具 举报

ID:253106 发表于 2017-11-24 16:29 | 显示全部楼层
心静不下 发表于 2017-11-17 13:09
我不了解y=120   和  delay(500)他们中间的关系,,,

delay()括号里的数值是多少,就是延时多少ms,执行for(y=120;y>0,y--)语句约需要1ms的时间,假如y=240,那么执行for(y=240;y>0,y--)语句约需要2ms的时间,这时  延时的时间=delay()括号里的数值*2ms,大概意思就是这样
回复

使用道具 举报

ID:253135 发表于 2017-11-24 20:22 | 显示全部楼层
所谓的延迟,其实是:1.计算机对每一条语句处理需要时间。2.每一条语句处理的时间不同。3.具体需要多长时间就要看cpu的频率了。
delay(500)的意思是让延迟子程序运行500次,每一次又要经过120次y运算,而每一次运算都需要时间,所以delay(500)就要很长很长时间,自然的就会主程序卡在P1=temp语句,不进行下一步。所以led才会亮好久。
      
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表