找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机延时10秒 具体表现在哪?只知道5秒

  [复制链接]
跳转到指定楼层
楼主
ID:242160 发表于 2017-12-10 14:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "reg52.h"                        
#include<intrins.h>               

typedef unsigned int u16;         
typedef unsigned char u8;

sbit beep=P1^5;         
sbit a=P2^0 ;        
sbit LSA=P2^2;        
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[10]={
        0x3f,   //0
        0x06,          //1
        0x5b,        //2
        0x4f,        //3
        0x66,        //4
        0x6d,          //5
        0x7d,        //6
        0x07,        //7
        0x7f,        //8
        0x6f,        //9

        };           

void delay(u16 i)
{
        while(i--);                  //延时函数,i=1时,大约延时10us
}
void main()
{        
   u16 L0=0,L1=0,L2=0,L3=0,d,n=0,w=0;
        
        TMOD|=0X01;                //  01定时  04计数  选择为定时器0模式,工作方式1,仅用TR0打开启动。

        TH0=0X3C;                //给定时器赋初值,定时1ms   
        TL0=0XB0;                                                     
        
        TR0=1;                        //打开定时器

         if(w==0)
        {        
                delay(100);
                if(a==1)
                {
              L0++;
                 while(1)
       {
           if(L0==10)
                {
                        L0=0;
                        L1++;
                }
                if(L1==10)                                                         
                {
                        L1=0;
                        L2++;
                }
                if(L2==10)
                {
                        L2=0;
                        L3++;
                }
                if(L3==10)
                {
                    L3=0;
                        L0=0;L1=0;L2=0;
                }
                for(d=0;d<4;d++)
                {
                        switch(d)         
                        {
                                case(0):
                                        LSA=0;LSB=0;LSC=0;P0=smgduan[L0]; break;//显示第0位
                                case(1):
                                        LSA=1;LSB=0;LSC=0;P0=smgduan[L1]; break;//显示第1位
                                case(2):
                                        LSA=0;LSB=1;LSC=0;P0=smgduan[L2]; break;//显示第2位
                                case(3):
                                        LSA=1;LSB=1;LSC=0;P0=smgduan[L3]; break;//显示第3位
                        }
                        delay(100);
                        P0=0x00;           //消隐
                }
                if(a==1)
                delay(1000);                                                                       
                L0++;
        
        
                if(TF0==1)
        {
            TF0=0;        
                TH0=0X3C;              //重置定时常数
                TL0=0XB0;
                n++;
                if(n>200)
                {
                  n=0;
                  w=1;
                }
                if(w==1)
                a=0;
    }
               
        }
        }               
        }
                }  


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

使用道具 举报

沙发
ID:259775 发表于 2017-12-10 15:23 | 只看该作者
有一个delay(1000),即10ms
回复

使用道具 举报

板凳
ID:259790 发表于 2017-12-10 15:58 | 只看该作者
delay(1000);           代表1秒,类推
回复

使用道具 举报

地板
ID:242160 发表于 2017-12-10 16:15 | 只看该作者
qzqwood 发表于 2017-12-10 15:23
有一个delay(1000),即10ms

delay(100)循环的是那些程序,delay(1000)循环的是那些?
回复

使用道具 举报

5#
ID:259822 发表于 2017-12-10 17:20 | 只看该作者
可以采用单片机内部 nop();函数延时 比较精确
回复

使用道具 举报

6#
ID:258555 发表于 2017-12-11 00:13 | 只看该作者
delay(1000),即10ms
回复

使用道具 举报

7#
ID:242160 发表于 2017-12-11 14:25 | 只看该作者
鹅城不再35 发表于 2017-12-10 17:20
可以采用单片机内部 nop();函数延时 比较精确

一个_nop()是几秒?
回复

使用道具 举报

8#
ID:111634 发表于 2017-12-11 22:22 | 只看该作者
先学理论,打基础,否则,问题多多,事倍功半。
回复

使用道具 举报

9#
ID:260595 发表于 2017-12-12 12:46 | 只看该作者
太快看不到闪烁的过程
回复

使用道具 举报

10#
ID:260626 发表于 2017-12-12 14:13 | 只看该作者
void delay(u16 i)
{
        while(i--);                  //延时函数,i=1时,大约延时10us
}
delay(1000)和delay(100);调用的就是上面的函数 循环的是while(i--)当你给的数不为0,就自减1,直到为零;期间每减一次就是10us,1000us=1ms 1000ms=1s,
回复

使用道具 举报

11#
ID:260641 发表于 2017-12-12 14:15 来自手机 | 只看该作者
delay()就是延时函数
回复

使用道具 举报

12#
ID:260871 发表于 2017-12-12 21:42 | 只看该作者
学汇编版编程可以了解更多单片机的原理
回复

使用道具 举报

13#
ID:260871 发表于 2017-12-12 21:43 | 只看该作者
用keil仿真一下就知道
回复

使用道具 举报

14#
ID:242160 发表于 2017-12-13 08:33 | 只看该作者
1597538246 发表于 2017-12-12 14:13
void delay(u16 i)
{
        while(i--);                  //延时函数,i=1时,大约延时10us

谢谢  懂了
回复

使用道具 举报

15#
ID:261374 发表于 2017-12-14 08:12 | 只看该作者
看看汇编吧,直接用定时器,很容易实现
回复

使用道具 举报

16#
ID:255861 发表于 2017-12-15 23:16 来自手机 | 只看该作者
楼上的楼上解释的很明白了,执行while进行--,delay(1000),大约就是10ms,这个在时间你可以通过keil调试出来,编译后,设置在delay前后设置断点,首先复位,运行,delay前停了,看下sec中的时间,在运行,delay后停了,在看下sec中的时间,相减,就是delay(1000)的延时时间了,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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