void delay1_us(u16 time) { u16 i=0; while(time--) { i=10; //自己定义 while(i--) ; } }中,
时间: 2023-06-24 21:08:53 浏览: 40
这是一个简单的延时函数,每次循环都会执行一次 i--,当 i 为 0 时,内层循环结束,继续执行外层循环。当外层循环执行完毕时,延时就完成了。
其中,参数 time 表示需要延时的时间,单位为微秒(us)。i 的初始值为 10,是通过测试得到的一个较为准确的值,可根据实际情况进行调整。
需要注意的是,这种延时函数是纯软件实现的,可能会受到系统负载、CPU主频等因素的影响,因此可能无法精确延时。在实际应用中,可以使用硬件定时器等方式进行精确延时。
相关问题
#include<reg52.h> typedef unsigned int u16; typedef unsigned char u8; sbit LED1=P2^0; sbit key1=P3^2; void delay_10us(u16 ten_us) { while(ten_us--); } void time1_init(void) { TMOD|=0X10; TH1=0XFC; TL1=0X18; ET1=1; EA=1; TR1=1; } void main() { EX0=1; time1_init(); while(1) { } } void time1() interrupt 3 { static u16 i; TH1=0XFC; TL1=0X18; i++; if(i==500) { i=0; LED1=!LED1; } } void kk2() interrupt 0 { TR1=~TR1; }添加注释
// 引入头文件reg52.h
#include<reg52.h>
// 定义无符号整型变量u16和无符号字符型变量u8
typedef unsigned int u16;
typedef unsigned char u8;
// 定义LED1为P2^0, key1为P3^2
sbit LED1=P2^0;
sbit key1=P3^2;
// 延时函数
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
// 定时器1初始化函数
void time1_init(void)
{
TMOD|=0X10; // 设置为定时器1方式
TH1=0XFC; // 定时器1高8位赋初值
TL1=0X18; // 定时器1低8位赋初值
ET1=1; // 允许定时器1中断
EA=1; // 开总中断
TR1=1; // 启动定时器1
}
void main()
{
EX0=1; // 开启外部中断0
time1_init(); // 调用定时器1初始化函数
while(1) {
}
}
// 定时器1中断服务函数
void time1() interrupt 3
{
static u16 i;
TH1=0XFC; // 定时器1高8位赋初值
TL1=0X18; // 定时器1低8位赋初值
i++; // 计数器加1
if(i==500) // 当计数器等于500时
{
i=0; // 计数器清零
LED1=!LED1; // LED1取反
}
}
// 外部中断0服务函数
void kk2() interrupt 0
{
TR1=~TR1; // 定时器1开关取反
}
#include "Delay.h" static u8 fac_us=0;//us static u16 fac_ms=0;//ms void Delay_Rough(int time) { int i,j; for(i=0;i<time;i++) for(j=0;j<time;j++) ; } void Delay_Init(u8 SYSCLK) { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟,HCLK/8 fac_us=SYSCLK/8; fac_ms=(u16)fac_us*1000; } void delay_ms(u16 nms) { u32 temp; SysTick->LOAD=(u32)nms*fac_ms; //时间加载(SysTick->LOAD?24bit) SysTick->VAL =0x00; //清空计数器 SysTick->CTRL=0x01 ; //开始倒数 do { temp=SysTick->CTRL; } while(temp&0x01&&!(temp&(1<<16)));//等待时间到达 SysTick->CTRL=0x00; //关闭计数器 SysTick->VAL =0X00; //清空计数器 } void delay_us(u32 nus) { u32 temp; SysTick->LOAD=nus*fac_us; //时间加载 SysTick->VAL=0x00; //清空计数器 SysTick->CTRL=0x01 ; //开始倒数计数 do { temp=SysTick->CTRL; } while(temp&0x01&&!(temp&(1<<16)));//时间加载 SysTick->CTRL=0x00; //关闭计数器 SysTick->VAL =0X00; //清空计数器 }
这是一个基于STM32的延时函数库,包括了毫秒级和微秒级的延时函数。其中,Delay_Rough函数是一个粗略的延时函数,用于产生较长时间的延时,如数码管显示等。Delay_Init函数用于初始化延时函数库,包括设置SysTick的时钟源以及计算fac_us和fac_ms的值。delay_ms函数用于产生指定毫秒级的延时,delay_us函数用于产生指定微秒级的延时。这些函数的实现都是基于SysTick定时器来实现的,具有较高的精度和稳定性。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)