A. 设单片机系统采用6M晶振,写出用定时器1方式2实现1ms的延时程序
6M晶振,方式2定时1mS的时间太长,不能直接实现,(最大定时应该是512uS)下面是500uS定时示例程序,可在中断函数中计数每2次得1S。
void Timer1Init(void) //500微秒@6.000MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0x06; //设置定时初值
TH1 = 0x06; //设置定时重载值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
}
B. C51单片机,谁帮我写个1ms的延时
void delay(uint i) //调用子程序所需时间)
{
uchar j,k;
for (j=i; j>0; j--)
for(k=0;k<30;k++);
}
在程序调用函数就可以得到1ms的程序,具体调用如下:
delay(10); //延时1.011ms
C. 51单片机中,写个延时函数,延时1ms,该怎么写,为什么
用汇编语言写可以精确计算,但有时想拼出整数的ms或10ms也不容易,计算方法如下图说明:
而C语言靠经验和实验得来的,如下面程序
如果不准(与晶振频率有关),调K的值,,软件仿真查看,直到大致准确,想更精确用定时器
void delay(unsigned char i)//延时程序
{
unsigned chari,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
D. 单片机延时1ms问题
首先,不知道你的晶振频率是多少,然后不知道你使用的是哪种类型的单片机。
我根据KEILC的测试:for循环这个语句是双周期指令2个机器周期,j=0;j<33;j++。这有三步单周期指令,每次三个机器周期。。。所以时间是(3j+2) 乘以循环次数i。就是时间微秒
上述指令在12MHZ的晶振频率,AT89S52的单片机测试情况下为0.0001060秒。也就是1MS
E. 求一个1ms的单片机C语言延时程序
void
delay(char
x)
{
unsigned
char
a,b,c;
for(c=x;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
学过标准C就知道了,char
和
int
是可以相互转换的,char的取值范围是-128~+127
unsigned
char
的是0~255
可以用unsigned
int啊,我一般都是用char的,用unsigned
int的话占的字节比较多,运行速度也没char那么快,计算机会麻烦点,建议使用char