51单片机延时30s的程序c语言,51单片机延时子程序延时10ms

发布时间:2022-12-02

本文目录一览:

  1. 单片机C语言延迟程序
  2. 51单片机用c语言怎么写延时函数?
  3. 51单片机求10微秒的延时函数 C语言(晶振11.0592MHz)
  4. 51单片机两个键分别控制P2.1口延时10秒和P2.0口延时30秒

单片机C语言延迟程序

下面的延时的基本程序(中断加计数器)

void T0_int(void) interrupt 1
{
    TH0 = 0x4C; // 重新装载,50MS定时器初值
    TL0 = 0x00;
    T0_count++;
    if(T0_count == 20) // 1S到
    {
        T0_count = 0; // 在这写程序
    }
}
main()
{
    TMOD = 0x01; // 定时器0,工作方式1,16位计数
    TH0 = 0x4C; // 50MS定时器初值
    TL0 = 0x00;
    IE = 0x82; // 开总中断,开T0中断
    EA = 1;
    ET0 = 1;
    TR0 = 1;
    T0_count = 0;
    i = 0;
loop:
    goto loop;
}

还有:

for(us=0; us < 60; us++); /* 延时500us */
for(us=0; us < 1; us++); /* 延时15微秒 */
for(us=0; us < 5; us++); /* 延时51微秒 */

51单片机用c语言怎么写延时函数?

延时时间的计算与单片机的晶振频率有关。若晶振频率为12Mhz,那么单片机每震动一次所需要的时间是1/12M s。那么再来看看单片机执行一次自减所需要的振动次数是96次,假如我们对时间要求不是特别精确的话,可以约等于100来计算。现在通过上面两个数据可以得出:单片机每执行一次自减所需要的时间是1/12M * 100(s),即1/120000 s,逆向计算一下,每1ms需要自减多少次?120次对吧。所以一个简单的延时功能就诞生了,我们只需要自减120次,就可以延时1ms,如果我们要延时50ms呢,那就自减50*120=6000次。那么在程序上如何表达呢?我们可以用两套for循环

void delay(int i)
{
    int x, y;
    for(x = i; x > 0; x--)
    {
        for(y = 120; y > 0; y--);
    }
}

参数 i 代表该函数延时多少ms。

51单片机求10微秒的延时函数 C语言(晶振11.0592MHz)

  1. 下面几个是单片机的延时程序(包括asm和C程序,都是我在学单片机的过程中用到的),在单片机延时程序中应考虑所使用的晶振的频率,在51系列的单片机中我们常用的是11.0592MHz和12.0000MHz的晶振,而在AVR单片机上常用的有8.000MHz和4.000MH的晶振所以在网上查找程序时如果涉及到精确延时则应该注意晶振的频率是多大。
  2. 软件延时:(asm) 晶振12MHZ,延时1秒 程序如下:
DELAY:MOV 72H,#100
LOOP3:MOV 71H,#100
LOOP1:MOV 70H,#47
LOOP0:DJNZ 70H,LOOP0
NOP
DJNZ 71H,LOOP1
MOV 70H,#46
LOOP2:DJNZ 70H,LOOP2
NOP
DJNZ 72H,LOOP3
MOV 70H,#48
LOOP4:DJNZ 70H,LOOP4

定时器延时: 晶振12MHZ,延时1s,定时器0工作方式为方式1

DELAY1:MOV R7,#0AH ;;晶振12MHZ,延时0.5秒
AJMP DELAY
DELAY2:MOV R7,#14H ;;晶振12MHZ,延时1秒
DELAY:CLR EX0
MOV TMOD,#01H ;设置定时器的工作方式为方式1
MOV TL0,#0B0H ;给定时器设置计数初始值
MOV TH0,#3CH
SETB TR0 ;开启定时器
HERE:JBC TF0,NEXT1
SJMP HERE
NEXT1:MOV TL0,#0B0H
MOV TH0,#3CH
DJNZ R7,HERE
CLR TR0 ;定时器要软件清零
SETB EX0
RET
  1. C语言延时程序: 10ms延时子程序(12MHZ)
void delay10ms(void)
{
    unsigned char i,j,k;
    for(i=5;i>0;i--)
        for(j=4;j>0;j--)
            for(k=248;k>0;k--);
}

1s延时子程序(12MHZ)

void delay1s(void)
{
    unsigned char h,i,j,k;
    for(h=5;h>0;h--)
        for(i=4;i>0;i--)
            for(j=116;j>0;j--)
                for(k=214;k>0;k--);
}

200ms延时子程序(12MHZ)

void delay200ms(void)
{
    unsigned char i,j,k;
    for(i=5;i>0;i--)
        for(j=132;j>0;j--)
            for(k=150;k>0;k--);
}

500ms延时子程序程序:(12MHZ)

void delay500ms(void)
{
    unsigned char i,j,k;
    for(i=15;i>0;i--)
        for(j=202;j>0;j--)
            for(k=81;k>0;k--);
}

51单片机两个键分别控制P2.1口延时10秒和P2.0口延时30秒

下面这个程序里面有你要的东西,自己找找。

#include "reg51.h"
void delay(int n);
sbit K1 = P3^3; // LED左移按键
sbit K2 = P3^5; // LED右移按键
sbit K3 = P3^6; // 开启手动按键
sbit K4 = P3^7; // 开启自动按键
bit mark1 = 0;
bit mark2 = 0;
unsigned char a,b,c,d;
int x;
void pulse(void);
void main()
{
    a = 0xfe; b = 0xff;
    c = 0x7f; d = 0xff;
    while(K4)
    {
        P2 = a;
        P0 = b;
        if(!K1 && !mark1) // 如果K1按下且mark1=0
        {
            delay(10); // 延时
            if(!K1) // 检查K1还是按下
            {
                mark1 = 1; // mark1=1
                if((a & 0x80) && (a != 0xff)) // 如果a=1*******("*"号为0或者1(最高位为1))并且a不等于0xff
                {
                    a = (a << 1) | 0x01;
                    pulse();
                } // 让a向左移后边会拉出0,然后与00000001相与(最后一位补1)
                else if(a == 0x7f)
                {
                    a = 0xff;
                    b = 0xfe;
                    pulse();
                }
                else if((b & 0x80) && (b != 0xff))
                {
                    b = (b << 1) | 0x01;
                    pulse();
                }
                else if(b == 0x7f)
                {
                    a = 0xfe;
                    b = 0xff;
                    pulse();
                }
            }
        }
        else if(K1)
        {
            mark1 = 0;
        }
        if(!K2 && !mark2)
        {
            delay(10);
            if(!K2)
            {
                mark2 = 1;
                if((a != 0xff) && (a != 0xfe))
                {
                    if(a & 0x01)
                    {
                        a = (a << 1) | 0x80;
                        pulse();
                    }
                }
                else if(a == 0xfe)
                {
                    a = 0xff;
                    b = 0x7f;
                    pulse();
                }
                if((b != 0xff) && (b != 0xfe))
                {
                    if(b & 0x01)
                    {
                        b = (b << 1) | 0x80;
                        pulse();
                    }
                }
                else if(b == 0xfe)
                {
                    a = 0x7f;
                    b = 0xff;
                    pulse();
                }
            }
        }
        else if(K2)
        {
            mark2 = 0;
        }
    }
    while(K3)
    {
        if(!K1 && !mark1)
        {
            delay(10);
            if(!K1)
            {
                mark1 = 1;
                for(x = 0; x <= 16; x++)
                {
                    P0 = a;
                    P2 = b;
                    delay(100);
                    if((a & 0x80) && (a != 0xff))
                    {
                        a = (a << 1) | 0x01;
                    }
                    else if(a == 0x7f)
                    {
                        a = 0xff;
                        b = 0xfe;
                    }
                    else if((b & 0x80) && (b != 0xff))
                    {
                        b = (b << 1) | 0x01;
                    }
                    else if(b == 0x7f)
                    {
                        b = 0xff;
                        a = 0xff;
                    }
                }
            }
        }
        else if(K1)
        {
            mark1 = 0;
        }
        if(!K2 && !mark2)
        {
            delay(10);
            if(!K2)
            {
                mark2 = 1;
                for(x = 0; x < 16; x++)
                {
                    P0 = c;
                    P2 = d;
                    delay(100);
                    if((c != 0xff) && (c != 0xfe))
                    {
                        if(c & 0x01)
                        {
                            c = (c << 1) | 0x80;
                        }
                    }
                    else if(c == 0xfe)
                    {
                        c = 0xff;
                        d = 0x7f;
                    }
                    if((d != 0xff) && (d != 0xfe))
                    {
                        if(d & 0x01)
                        {
                            d = (d << 1) | 0x80;
                        }
                    }
                    else if(d == 0xfe)
                    {
                        d = 0xff;
                        c = 0xff;
                    }
                }
            }
        }
        else if(K2)
        {
            mark2 = 0;
        }
    }
}
void delay(int n)
{
    int i,j;
    for(i = 0; i < n; i++)
        for(j = 0; j < 320; j++);
}
void pulse(void)
{
    P1 = 0xfe;
    delay(100);
    P1 = 0xfd;
    delay(100);
    P1 = 0xfb;
    delay(100);
    P1 = 0xf7;
    delay(100);
    P1 = 0xff;
}