应该如何修改此函数的延时微秒void delay_ms(unsigned int ms) { unsigned int max_step = 1000 * (UINT32_MAX / SystemCoreClock); unsigned int max_sleep_cycles = max_step * (SystemCoreClock / 1000); while (ms > max_step) { ms -= max_step; delay_cycles(max_sleep_cycles); } delay_cycles(ms * (SystemCoreClock / 1000)); }
时间: 2024-03-23 16:39:51 浏览: 65
如果要修改此函数的延时单位为微秒,可以按照以下方式进行修改:
```void delay_us(unsigned int us) {
unsigned int max_step = 1000000 * (UINT32_MAX / SystemCoreClock);
unsigned int max_sleep_cycles = max_step * (SystemCoreClock / 1000000);
while (us > max_step) {
us -= max_step;
delay_cycles(max_sleep_cycles);
}
delay_cycles(us * (SystemCoreClock / 1000000));
}```
将函数名称改为delay_us,参数us代表需要延时的微秒数。
将max_step的计算方式修改为1000000乘以UINT32_MAX除以SystemCoreClock。
将max_sleep_cycles的计算方式修改为max_step乘以SystemCoreClock除以1000000。
将while循环中的判断条件修改为us大于max_step。
将延时时间的计算方式修改为us乘以SystemCoreClock除以1000000。
这样,修改后的函数就可以实现微秒级别的延时了。
相关问题
static void delay_nms(uint n) { uint i; while(n--) { for(i=0;i<550;i++); } } static void delay_us(unsigned int n) { while(--n); }
这是两个延时函数的代码实现。第一个函数`delay_nms()`是以毫秒为单位的延时函数,它通过循环嵌套的方式实现。外层循环控制延时的次数,内层循环则是一个空循环,通过循环次数来实现时间的延时。具体来说,内层循环的循环次数为550,这个值可以根据硬件平台的情况进行调整。第二个函数`delay_us()`是以微秒为单位的延时函数,它使用了一个while循环,并在循环体中对一个计数器进行自减操作,从而实现时间的延时。这个函数的延时精度取决于处理器的时钟频率和编译器的优化程度。需要注意的是,使用延时函数进行时间控制时,应该尽量避免在中断服务程序中使用,以免影响系统的实时性能。
#include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit Data=P2^0; uchar rec_dat[4]; void DHT11_delay_us(uchar n) { while(--n); } void DHT11_delay_ms(uint z) { uint i,j; for(i=z;i>0;i--) for(j=110;j>0;j--); } void DHT11_start() { Data=1; DHT11_delay_us(2); Data=0; DHT11_delay_ms(30); Data=1; DHT11_delay_us(30); } uchar DHT11_rec_byte() { uchar i,dat=0; for(i=0;i<8;i++) { while(!Data); DHT11_delay_us(8); dat<<=1; if(Data==1) dat+=1; while(Data); } return dat; } void DHT11_receive() { uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise; DHT11_start(); if(Data==0) { while(Data==0); DHT11_delay_us(40); R_H=DHT11_rec_byte(); R_L=DHT11_rec_byte(); T_H=DHT11_rec_byte(); T_L=DHT11_rec_byte(); revise=DHT11_rec_byte(); DHT11_delay_us(25); if((R_H+R_L+T_H+T_L)==revise) { RH=R_H; RL=R_L; TH=T_H; TL=T_L; } rec_dat[0]=RH; rec_dat[1]=RL; rec_dat[2]=TH; rec_dat[3]=TL; } }
这段代码是用来读取DHT11温湿度传感器的数据。它使用了8051系列单片机的寄存器和延时函数。代码中定义了一些宏,包括uchar和uint,用于定义无符号字符和无符号整数的数据类型。
在代码中,通过定义一个Data变量来控制DHT11传感器的数据引脚。通过设置Data引脚的电平状态,可以与DHT11传感器进行通信。
代码中还定义了一些延时函数,用于实现微秒级和毫秒级的延时操作。
函数DHT11_start()用于发送开始信号给DHT11传感器。具体的操作包括将Data引脚置高、延时一段时间后将其置低、再延时一段时间后将其置高。
函数DHT11_rec_byte()用于接收一个字节的数据。具体的操作是等待Data引脚变为高电平,然后延时一段时间后读取Data引脚的电平状态,将其保存到dat变量中。
函数DHT11_receive()用于接收DHT11传感器的温湿度数据。具体的操作包括发送开始信号、等待Data引脚变为低电平、接收4个字节的数据(分别是湿度的整数部分、湿度的小数部分、温度的整数部分和温度的小数部分)、校验数据的正确性,并将接收到的数据保存到rec_dat数组中。
需要注意的是,这段代码只是读取DHT11传感器的数据,还需要结合其他代码来对数据进行处理和显示。
阅读全文