若是12MHZ的晶振,延时程序如何修改?
时间: 2023-06-15 11:04:10 浏览: 98
如果你要使用12MHz的晶振,则需要相应地修改延时程序,因为延时时间是根据晶振频率计算的。以下是一个示例延时程序,假设你要延时1毫秒:
```c
void delay_ms(unsigned int ms)
{
while (ms--)
{
unsigned int i = 12000;
while (i--) {}
}
}
```
在这个程序中,我们假设晶振频率为12MHz,所以每个循环需要执行12000次,才能延时1毫秒。如果你使用其他频率的晶振,就需要根据晶振频率重新计算每个循环需要执行的次数,以保证延时时间的准确性。
例如,如果你使用了8MHz的晶振,那么每个循环需要执行的次数应该是8000,即:
```c
void delay_ms(unsigned int ms)
{
while (ms--)
{
unsigned int i = 8000;
while (i--) {}
}
}
```
需要注意的是,这个延时程序并不是非常精确,因为循环的执行时间受到许多因素的影响,例如编译器优化、CPU速度等等。如果你需要更精确的延时,建议使用定时器或者其他硬件资源实现延时。
相关问题
编写延时15ms的延时子程序,晶振12Mhz,一个机器周期1us
好的,以下是延时15ms的延时子程序的代码,基于12Mhz晶振和1us的机器周期:
```
delay15ms:
movlw d'15' ; 将15放入工作寄存器 W
delay_loop:
movlw d'120' ; 将120放入工作寄存器 W
delay_loop_1:
decfsz WREG, f ; W 减去 1
goto delay_loop_1 ; 如果 W 不为 0,跳转到 delay_loop_1
decfsz INDF, f ; 等待 1us
goto delay_loop ; 如果 W 为 0,跳转到 delay_loop
return ; 返回
```
使用方法:在需要延时的地方调用 `call delay15ms` 即可。
单片机编写延时15ms的延时子程序,晶振12Mhz,一个机器周期1us
好的,以下是延时15ms的延时子程序的代码,基于12Mhz晶振和1us的机器周期:
```c
void delay15ms() {
unsigned int i, j;
for (i = 0; i < 15000; i++) {
for (j = 0; j < 12; j++) {
asm("nop"); // 1us 等待
}
}
}
```
使用方法:在需要延时的地方调用 `delay15ms()` 即可。