用51单片机计算一个延时函数实际所用时间,以微秒为单位。

1.测量一个延时函数的时长

void delay(unsigned int a)
{
   while(a--);
}

下面是仿真电路

img

  1. 下面是我写的代码
#include <reg51.h>

unsigned char Table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//数码管0-9
unsigned char disp[8];
unsigned int a;
void show_1() ;
unsigned int i;
unsigned int t;

void delay(unsigned int a)  //需要测量的时间函数
{
    while(a--);
}

void show_1(t)   //计算每一个数码管需要显示的数字
{
    unsigned int i;
    a=t;
    disp[0]=a%10;
    a=a/10;
    disp[1]=a%10;
    a=a/10;
    disp[2]=a%10;
    a=a/10;
    disp[3]=a%10;
    a=a/10;
    disp[4]=a%10;
    a=a/10;
    disp[5]=a%10;
    a=a/10;
    disp[6]=a%10;
    a=a/10;
    disp[7]=a%10;
    a=a/10;
for(i=0;i<8;i++)
    {
        delay(1); //消影
        P2&=0XE3;
        P2|=(i<<2);
        P0=Table[disp[i]];
        delay(1);
    }
}


void init()  //初始化外部中断
{
    EA=1;
    EX0=1; 
    IT0=1; //下降沿触发
}

void Timer()   //定时器初始化
{
    TMOD = 0x01;        //设置定时器模式
    TL0 = (65535-1)%256;        //设置定时初值
    TH0 = (65535-1)/256;        //设置定时初值
    EA=1;
    ET0=1;    
    TR0=0;        //定时器0先不开启
}

void Timer_0() interrupt 1
{
    TL0 = (65535-1)%256;    //回复定时器初值
    TH0 = (65535-1)/256;
    t++;
    if(t>9999)t=0;
}

void EXINIT0() interrupt 0 
{
    t=0; //计数清零
    TR0=1; //定时器开始计时
    delay(1000);
    TR0=0;
}

void main ()
{
    init();
    Timer();
    while(1)
    {
        show_1(t);
    }
}

  • 想问一下到底哪里出错了呀,一直找不到问题,结果也不对。

【以下回答由 GPT 生成】

首先需要了解51单片机的时钟频率。51单片机的时钟频率可以通过配置定时器工作模式来确定。在计算延时函数的实际执行时间之前,我们需要知道单片机的时钟频率。

其次,我们可以通过使用定时器来测量延时函数的实际执行时间。在延时函数中,可以使用定时器来记录开始和结束的时间戳,然后计算时间差来得到实际执行时间。

下面是一个使用定时器来测量执行时间的示例代码:

#include <reg51.h>

unsigned char Table[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; //数码管0-9
unsigned char disp[8];
unsigned int a;
void show_1();
unsigned int i;
unsigned int t;

void delay(unsigned int a)
{
    while(a--);
}

void show_1(t)
{
    unsigned int i;
    a = t;
    disp[0] = a%10;
    a = a/10;
    disp[1] = a%10;
    a = a/10;
    disp[2] = a%10;
    a = a/10;
    disp[3] = a%10;
    a = a/10;
    disp[4] = a%10;
    a = a/10;
    disp[5] = a%10;
    a = a/10;
    disp[6] = a%10;
    a = a/10;
    disp[7] = a%10;
    a = a/10;

    for(i=0; i<8; i++)
    {
        delay(1); //消影
        P2 = 0xE3;
        P2 |= (i<<2);
        P0 = Table[disp[i]];
        delay(1);  //数码管稳定显示
    }
}

void delay_us(unsigned int us)
{
    TMOD |= 0x01; //设置定时器0为工作模式1
    TH0 = 0xFF - us / 256; //装入初始值
    TL0 = 0xFF - us % 256;
    TR0 = 1; //启动定时器
    while (!TF0); //等待定时器溢出
    TR0 = 0; //停止定时器
    TF0 = 0; //清除溢出标志
}

void measure_delay()
{
    unsigned int start_time;
    unsigned int end_time;
    unsigned int execution_time;

    start_time = TH0 * 256 + TL0; //记录开始时间戳
    delay(1000); //调用延时函数
    end_time = TH0 * 256 + TL0; //记录结束时间戳

    execution_time = end_time - start_time;

    // 根据单片机的时钟频率计算实际执行时间(微秒)
    unsigned int clock_frequency = // 这里填入单片机的时钟频率(单位:Hz)
    unsigned int execution_time_us = execution_time / (clock_frequency / 1000000);

    // 将执行时间显示在数码管上
    show_1(execution_time_us);
}

void main()
{
    delay(1000); //延时等待数码管启动
    while (1) {
        measure_delay(); //测量延时函数的执行时间
    }
}

这段代码中,我们使用定时器0来测量延时函数的实际执行时间。首先,在delay_us函数中,我们配置定时器0为工作模式1,并通过设置TH0和TL0的初始值来确定定时器的计数范围,从而实现以微秒为单位的延时。然后,在measure_delay函数中,我们记录开始时间戳,调用延时函数,然后记录结束时间戳。最后,通过计算时间差,并根据单片机的时钟频率,将执行时间转换为微秒,并在数码管上显示出来。

请注意,在上述代码中,您需要根据您使用的单片机的实际情况,修改clock_frequency的值为单片机的时钟频率(单位:Hz)。这样才能正确计算延时函数的实际执行时间。

希望这个解决方案对你有所帮助!如果还有其他问题,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

很简单,在延时函数内放置一个BIT变量取反,测量周期就知道了。