void delay(uint t) 在c语言中的作用,[voiddelay怎么用]延迟时间怎么计算

j循环可以延时ms个i循环,也就是ms毫秒.for(i=0;i<120,i++)do-something;

voiddelay怎么用

void-delay(uint-t)//参数是无符号整形,时间不可能为负数{register-uint-bt;//定义无符号整形,放在寄存器里,存取速度较快,平时都是放在内存里for(;t;t

[voiddelay怎么用]高手帮忙解释一下这种单片机延时函数void

问题:void-delay(){;;}void-start(){sda=1;delay();scl=1;

delay();sda=0;delay();}写成下面好看点void-delay(){;;}两个“;”前什么也没写是空指令,空指令就是CPU什么也不做,但是要消耗一个指令的时间。

这个延时函数每调用一次就延时2个指令的时间。具体延时的时间要看你用的单片机的晶振时间。delay里面的内容用for循环即可,可以修改循环次数改变延时时间void-delay1(unsigned-int-j){unsigned-char-i;do{for(i=0;i<2;i++);j

;asm("nop");}while(j);}这是us延时,有误差,j的值越大相对误差越小。不过相信误差应该在你的可接受范围内。

void-delay1(unsigned-int-j){unsigned-int-i;do{for(i=0;i<2853;i++);j

;}while(j);}这是ms延时,有误差,j的值越大相对误差越小。不过相信误差应该在你的可接受范围内。

[voiddelay怎么用]高手帮忙解释一下这种单片机延时函数void

写成下面好看点void-delay(){;;}两个“;”前什么也没写是空指令,空指令就是CPU什么也不做,但是要消耗一个指令的时间。这个延时函数每调用一次就延时2个指令的时间。具体延时的时间要看你用的单片机的晶振时间。

[voiddelay怎么用]延迟时间怎么计算

你的晶振的倒数就是时钟周期用i乘以时钟周期就是延迟时间了谁知道你的i是多少呀?诶,这个没人知道。可以用keil仿真直接得到答案,也可以参考下面的自己改。

下面几个是单片机的延时程序(包括asm和c程序,都是我在学单片机的过程中用到的),在单片机延时程序中应考虑所使用的晶振的频率,在51系列的单片机中我们常用的是11.0592mhz和12.0000mhz的晶振,而在avr单片机上常用的有8.000mhz和4.000mh的晶振所以在网上查找程序时如果涉及到精确延时则应该注意晶振的频率是多大。

软件延时:(asm)晶振12mhz,延时1秒程序如下:delay:mov72h,#100loop3:mov

71h,#100loop1:mov70h,#47loop0:djnz70h,loop0nopdjnz

71h,loop1mov70h,#46loop2:djnz70h,loop2nopdjnz72h,loop3mov

70h,#48loop4:djnz70h,loop4定时器延时:晶振12mhz,延时1s,定时器0工作方式为方式1delay1:mov-r7,#0ah

;;晶振12mhz,延时0.5秒ajmp-delaydelay2:mov-r7,#14h;;晶振12mhz,延时1秒delay:clr-ex0mov-tmod,#01h

;设置定时器的工作方式为方式1mov-tl0,#0b0h;给定时器设置计数初始值mov-th0,#3chsetb-tr0

;开启定时器here:jbc-tf0,next1sjmp-herenext1:mov-tl0,#0b0hmov-th0,#3chdjnz-r7,hereclr-tr0

;定时器要软件清零setb-ex0ret-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);}下面是用了8.0000mhz的晶振的几个延时程序(用定时0的工作模式1):(1)延时0.9msvoid-delay_0_9ms(void){tmod=0x01;

/*定时器0工作在模式1下(16位计数器)*/th0=0xfd;tl0=0xa8;tr0=1;/*启动定时器*/while(tf0==0);tr0=0;}(2)延时1msvoid-delay_1ms(void){tmod=0x01;

/*定时器0工作在模式1下(16位计数器)*/th0=0xfd;tl0=0x65;tr0=1;/*启动定时器*/while(tf0==0);tr0=0;}(3)延时4.5msvoid-delay_4_5ms(void){tmod=0x01;

/*定时器0工作在模式1下(16位计数器)*/th0=0xf4;tl0=0x48;tr0=1;/*启动定时器*/while(tf0==0);tr0=0;}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用C语言嵌套汇编实现在STM32F4 Discovery开发板上实现GPIO快速翻转100次的示例代码。假设我们要翻转PD12引脚的状态。 ``` #include <stdio.h> #include <stdint.h> void Delay(uint32_t count) { for (uint32_t i = 0; i < count; i++); } int main() { // 初始化GPIO RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; GPIOD->MODER |= GPIO_MODER_MODER12_0; GPIOD->OTYPER &= ~GPIO_OTYPER_OT_12; GPIOD->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR12; GPIOD->PUPDR &= ~GPIO_PUPDR_PUPDR12; // 翻转PD12引脚状态100次 uint32_t mask = (1U << 12); for (uint32_t i = 0; i < 100; i++) { asm volatile ( "ldr r1, [%[gpio]0]\n\t" "eor r1, r1, %[mask]\n\t" "str r1, [%[gpio]0]\n\t" : // 无输出操作数 : [gpio] "r" (&GPIOD->ODR), [mask] "r" (mask) // 输入操作数 : "r1" // 被修改的寄存器 ); Delay(100000); } return 0; } ``` 上面的代码首先初始化了GPIOD引脚,然后使用循环翻转PD12引脚状态100次。在翻转PD12引脚状态时,使用了嵌套汇编进行实现。在汇编代码,使用了`ldr`指令读取ODR寄存器的值,使用`eor`指令进行异或操作,实现了快速翻转引脚状态的功能,最后使用`str`指令将新的值写入ODR寄存器。在嵌套汇编,使用了输入操作数来传递GPIOD的地址和翻转掩码,使用了被修改的寄存器来避免编译器将寄存器用于其他用途。 为了使翻转速度更明显,上面的代码还使用了一个简单的延时函数`Delay()`。需要注意的是,这里的延时函数只是一个简单的占用CPU的循环,实际应用可能需要使用更为精确的延时方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值