找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11804|回复: 12
打印 上一主题 下一主题
收起左侧

请大家帮忙看看这个单片机程序 void Delay10ms(50)是什么意思?

[复制链接]
跳转到指定楼层
楼主
ID:85073 发表于 2017-12-16 13:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近又开始学单片机,请高手帮忙看看这个程序是什么意思,最好有详尽的解释,void Delay10ms(50)是什么意思?执行void Delay10ms延时函数50次吗?


#include <reg51.h>
#include <intrins.h>

void main(void)
{
        unsigned char LED;

        LED = 0xFE;

        while(1)
        {
                P0 = LED;

                Delay10ms(50);

                LED = _crol_(LED,1);  //循环右移1位,点亮下一个LED  此函数于库函数
        }
}

void Delay10ms(unsigned int c)   //误差 0us
{
    unsigned char a, b;

        //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
    for (;c>0;c--)
        {
                for (b=38;b>0;b--)
                {
                        for (a=130;a>0;a--);
                }         
        }
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:111634 发表于 2017-12-16 18:20 | 只看该作者
学单片机,必须先读一本教材书,先学理论,打基础,否则,问题多多,事倍功半。给你介绍一本书,张志良编著的:《80C51单片机实用教程——基于Keil C和Proteus》高等教育出版社ISBN 978-7-04-044532-9, 用于学习51单片机原理,程序(双解c和汇编)语句条条有注解,便于阅读理解,便于自学,可从零基础c语言开始学习。
回复

使用道具 举报

板凳
ID:149988 发表于 2017-12-16 19:57 | 只看该作者

RE: 请大家帮忙看看这个单片机程序 void Delay10ms(50)是什么意思?

void Delay10ms(unsigned int c)   //误差 0us
{
    unsigned char a, b;
        //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
    for (;c>0;c--)
        {
             for (b=38;b>0;b--)
             {
                  for (a=130;a>0;a--);
             }这是一个有输入参数的延时函数,当执行void Delay10ms(50) 语句时,是将c赋值50。所以,执行for (;c>0;c--)语句时c可以减50次,for (;c>0;c--)所包含的语句都将执行50次。for (a=130;a>0;a--);自身要执行130次,for (b=38;b>0;b--)语句要执行38次,所以for (a=130;a>0;a--);执行了130*38=4940次,再乘以 for (;c>0;c--)50次,for (a=130;a>0;a--);共执行了130*38*50=247000次,假如执行for (a=130;a>0;a--)一次需要0.000002秒,那么0.000002秒*247000次=0.494秒。
回复

使用道具 举报

地板
ID:85073 发表于 2017-12-17 09:26 | 只看该作者
zl2168 发表于 2017-12-16 18:20
学单片机,必须先读一本教材书,先学理论,打基础,否则,问题多多,事倍功半。给你介绍一本书,张志良编著 ...

谢谢意见!
回复

使用道具 举报

5#
ID:85073 发表于 2017-12-17 09:29 | 只看该作者
不倒翁.WZT 发表于 2017-12-16 19:57
void Delay10ms(unsigned int c)   //误差 0us
{
    unsigned char a, b;

谢谢意见,很不喜欢编程者这种故作高深的写法,把它写成for (c=50;c>0;c--),不就很好理解吗?
回复

使用道具 举报

6#
ID:325485 发表于 2018-5-11 22:01 | 只看该作者
不是的,这是个函数,这次设置好,下次可以随时调用,且可以调整时间,这个是延迟50*10ms下次可以延迟更多,就直接调用,这是c语言的
回复

使用道具 举报

7#
ID:328008 发表于 2018-5-12 02:22 | 只看该作者
楼主问题解决的吗,及解决方法分享下啊。。。。。。。。。
回复

使用道具 举报

8#
ID:328034 发表于 2018-5-12 09:16 | 只看该作者
500毫秒延迟
回复

使用道具 举报

9#
ID:591139 发表于 2019-7-27 09:48 | 只看该作者
aojieage 发表于 2017-12-17 09:29
谢谢意见,很不喜欢编程者这种故作高深的写法,把它写成for (c=50;c>0;c--),不就很好理解吗?

因为前面已经给C赋值50了。

后面再写一次的话,以后调整赋值就要记得改两个一样的地方。

所以,不在这里再次赋值是有道理的。只是这个注释说的不够详细周密。初学者没那么快转过来。
回复

使用道具 举报

10#
ID:591139 发表于 2019-7-27 09:57 | 只看该作者
我把当年的学习笔记放出来给楼主和初学同好:

void Delay10ms(unsigned int c)   //误差 0us
{
    unsigned char a, b;//--赋值无符号变量a和b--//

        //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了。见18、22行--//
        //--完整应该为:for (c=50;c>0;c--)--//
    for (;c>0;c--)//--条件循环。这里是把c用累减方式循环50次,每次减1直至c=0。实际效果是将10ms增加50倍--//
        {
               
        //--b和a的条件循环,用于将机器指令时长通过循环方式拉为10ms时长。具体取值与单片机、晶振的指令周期有关,51单片机下这些参数是直接用的。--//
               
                for (b=38;b>0;b--)//
                {
                        for (a=130;a>0;a--);
                }
           
        }
        
回复

使用道具 举报

11#
ID:511461 发表于 2019-7-28 19:33 | 只看该作者
void Delay10ms(50)是这个函数执行50次,他想表达的大约是0.5秒
回复

使用道具 举报

12#
ID:524818 发表于 2019-7-29 08:50 | 只看该作者
延时(10ms*50次)500ms
回复

使用道具 举报

13#
ID:542954 发表于 2019-8-11 19:55 | 只看该作者
这是一个在51里面常用的粗略的延时函数。单片机的时钟往往由外部晶振决定,晶振频率的倒数就是这个单片机的一个时钟周期,而单片机执行一条语句所用的时间为时钟周期的12的整数倍(因为一个机器周期为12个时钟周期,这是单片机进行读或写操作所用的时间,而执行一次直径的时间为几个机器周期)。你这里用的晶振应该是11.0592Mhz,所以执行一次指令的时间是12n/11.0592M秒(一般这种空指令n=1),进行一次底层的while循环总共就需要112*12/11.0592M秒,大约100us,所以你给到的函数变量是多少,这个函数就可以给你延迟这个量*100us的时间

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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