单片机,C语言写的一小段程序,高手帮看看

void delay(uint);
void main(void)
{
uint i;
uchar temp;
while(1)
{
temp=0xFE;
for(i=0;i<8;i++)
{
P0=temp;
delay(100);
temp<<=1;
}
这边的delay(100)的时间是多少?怎么算出来的?前面的void delay(unit)是啥意思?
这是一排灯闪过去的程序,已用Proteus仿真过没问题了。

这是一个简单的流水灯实验,前面的void delay(uint)是一个函数申明,你这一段里面没有给delay函数,给的程序不够清晰。
如果是延迟100ms的话,delay函数应该是这样的:
void delay(unsigned int x)
{
unsigned int i,j;

for( i =0;i < x;i++ )
{
for( j =0;j<3;j++ );
}
}
给定delay(100)即延迟100ms。追问

以下是比较完整的程序,帮看下,如何算delay,顺便提供下delay的用法,我还不会用delay。

#include
#define uchar unsigned char
#define uint unsigned int
void delay(uint);
void main(void)
{
uint i;
uchar temp;
while(1)
{
temp=0xFE;
for(i=0;i<8;i++) //8个流水灯依次全部点亮
{
P0=temp;
delay(100); //调用延时函数
temp<<=1;
}
temp=0xFE;
}
}

追答

如果是用汇编的延时程序,比较直接些,C里面有些都是经过调试到合理的为准,好像跟编译软件有关,如果你用keil编译的话,建议用郭天祥的那个常用的延时程序:
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
z取值为1即为1ms,以此类推。你用C的话,记住怎么用就行。

追问

z取值为1ms,为什么?void delay(uint z)这样就等于1?怎么算的?
x=z,x>0;x--,这样的话,x的值为1,减一次就没了?
y=110;y>0;y--,这个y每减一次的时间也是1ms?为什么?
我是初学者,很多都不懂。。。

追答

你是做C的话,没必要对机器周期这么执着,如果实在想弄懂的话,建议把上面的程序跑一下,看看debug里面这个程序占用的时间。
还是上面说的,跟编程软件有关,不是用汇编的话,不好计算。而且上面的delay函数也是个大约,如果用c编程,想精确的话,必须用定时器,定时器就是按机器周期来算的。

追问

主要是我想要得到一个精确的时间,用来做数字时钟。
据说可以用定时器来得到精确的时间,怎么写呢?
这个定时器是属于中断的一种吗?

追答

你上面的是流水灯,数字时钟的话,肯定要用到定时器,就是通过中断来控制时间。你看一下定时器部分,应该很容易搞定。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-05-22
前面的void delay(unit);就是函数声明的意思,用proteus仿真没问题,但是你贴出来的程序有问题,肯定有一个子函数是delay函数,你没有贴出来,至于时间怎么算嘛,我只会算汇编的,不会算C的追问

嗯,这只是其中的一段....

第2个回答  2011-05-22
根据单片机的晶振来计算时间,我以前做实验用的C51单片机,其晶振是12Mhz,周期T=1us,大部分指令执行时间是一个机器周期,即12个振荡周期。算算就出来了。你的这段程序中要加上delay的子函数。
第3个回答  2011-05-23
这是个延时程序,但是你没有给那个子函数。
void delay(uint x)
{
uchar i;
while(x--)
for(i=0;i<110;i++);
}
为1ms,你自己算!
第4个回答  2011-05-23
这应该是延时100ms的意思,void delay(unit)是函数头,在C语言中如果要调用子函数,就必须加函数头(子函数写在main函数后则不需),uint是传递参数的类型,参数名省略延时程序具体如下:
void delay(uint a )
{ char j;
while(a--)
{
for (j=0;j<110;j++) ;
}

} 当a=100时,即延时100ms
第5个回答  2011-05-22
有人知道该怎么写语句吗?? 急求!!! pic单片机吗?可以这样定义 static bank1 unsigned char x; bank3 float var[8]; 这样定义
相似回答