void Delay(int c) { char a, b; for(;c>0;c--) { for (b=8;b>0;b--) { for (a=20;a>0;a--); } } }C等于500时该程序应用在12M晶振51单片机的时延是多少?
时间: 2024-01-14 20:04:26 浏览: 42
该程序中每个循环中有三个嵌套循环,因此总循环次数为 8*20*500 = 80,0000 次。由于晶振频率为 12M,每秒钟振荡 12,000,000 次,因此每次振荡的时间为 1/12,000,000 秒。因此该程序的延时时间为 80,0000 * (1/12,000,000) = 0.0667 秒,即约为 67 毫秒。
相关问题
#include <reg52.h> #define SPEEDMAX 1 #define SPEEDMIN 5 sbit IN1_D=P1^0; sbit IN1_C=P1^1; sbit IN1_B=P1^2; sbit IN1_A=P1^3; unsigned char code table[]={0xfe,0xee,0xbe,0xde,0x7e,0}; void delay_ms(unsigned char x){ int i,j; for(i=x;i>0;i++){ for(j=0;j<120;j++); } } void Delay(unsigned int t) { unsigned char i, j; while(t--) { i = 2; j = 239; do { while (--j); } while (--i); } } void step_28byj48_control(char step,char dir) { char temp=step; if(dir==0) temp=7-step; switch(temp) { case 0: IN1_A=1;IN1_B=1;IN1_C=1;IN1_D=0;break; case 1: IN1_A=1;IN1_B=1;IN1_C=0;IN1_D=0;break; case 2: IN1_A=1;IN1_B=1;IN1_C=0;IN1_D=1;break; case 3: IN1_A=1;IN1_B=0;IN1_C=0;IN1_D=1;break; case 4: IN1_A=1;IN1_B=0;IN1_C=1;IN1_D=1;break; case 5: IN1_A=0;IN1_B=0;IN1_C=1;IN1_D=1;break; case 6: IN1_A=0;IN1_B=1;IN1_C=1;IN1_D=1;break; case 7: IN1_A=0;IN1_B=1;IN1_C=1;IN1_D=0;break; } } unsigned char key_scan(){ unsigned char temp,num; temp=0xfe; temp=P3; temp=temp&0xf0; if (temp!=0xf0){ delay_ms(5); temp=P3; while(temp!=0xf0){ switch(temp){ case 0xee:num=0;break; case 0xde:num=1;break; case 0xbe:num=2;break; case 0x7e:num=3;break; } } return num; } } void main(){ char key=0; char dir=0; char step=0; char speed=SPEEDMAX; int stepmove=0; while(1) { key=key_scan(); if(key==0){ stepmove=(!stepmove); } if(stepmove==1){ step_28byj48_control(step++,dir); if(step==8) step=0; Delay(speed); } if(key==3){ dir=!dir; } else if (key==1){ if(speed>SPEEDMAX) speed-=1; } else if (key==2){ if(speed<SPEEDMIN) speed+=1; } Delay(SPEEDMAX); } }上述代码有错误吗
代码中存在一些错误:
1. 在delay_ms函数中,for循环条件应为i>0,而不是i>=0。
2. 在key_scan函数中,在while循环中缺少对P3寄存器的读取,应添加temp=P3;。
3. 在while循环中,如果没有按键按下,应该一直执行下去而不是跳出循环,可以使用while(1);实现。
4. 在main函数中,stepmove变量应该初始化为0,否则第一次按下按键时不会执行步进电机控制。
5. 在控制步进电机的函数中,当dir为0时,temp应该为step,而不是7-step,因为0-7循环移位后是0-7本身。
解释这个程序#include <reg52.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char void delay (uint); void main() { while(1) { P1=0xfe; delay(200); P1=0xff; delay(800); } } void delay(uint xms) { uint i, j; for(i=xms;i>0;i--) for(j=110;j>0;j--); }
这个程序使用了STC89C52单片机,程序的功能是让LED灯以一定的频率闪烁。
程序首先通过头文件引入了单片机寄存器的定义和一些常用函数。然后通过宏定义定义了两个常量:`uint` 表示无符号整数类型,`uchar` 表示无符号字符类型。
接着定义了一个函数 `delay`,用于实现延时效果。`delay` 函数的参数 `xms` 表示需要延时的时间,单位是毫秒。函数内部使用了两个循环来实现延时效果。
在 `main` 函数中,进入一个无限循环。在循环中,先将 P1 口的值赋为 `0xfe`,控制LED灯的亮灭状态,然后调用 `delay` 函数实现延时效果。接着将 P1 口的值赋为 `0xff`,再次调用 `delay` 函数实现延时效果。这样就实现了LED灯以一定的频率闪烁的效果。
需要注意的是,由于延时函数的实现方式是通过两个嵌套的循环来实现的,因此在不同的单片机系统中,需要根据实际情况修改延时函数的参数,才能获得正确的延时效果。
阅读全文