void delayms(unsigned char ms)

#include <reg51.h> /
#include <intrins.h>

void delayms(unsigned char ms)
// 延时子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}

main()
{
unsigned char LED;
LED = 0xfe; //0xfe = 1111 1110
while(1)
{
P2 = LED;
delayms(250);
LED = LED << 1; //循环右移1位,点亮下一个LED "<<"为左移位
if(P2 == 0x00 ) {LED = 0xfe; } // 0xfe = 1111 1110
}
}

我不太明白的是这段延时程序是怎么样的逻辑,初学51机
void delayms(unsigned char ms)
// 延时子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
然后后面又出现delayms(250); 这个句子,这个句子中间的250表示什么意思???

这个程序是根据51的主频,经实际测试进行一次循环:for(i = 0; i < 120; i++);实测要用1ms时间(约120次++运算耗时),所以调用这个循环几次就约等于延时几毫秒。
250表示需要由延时函数调用循环250次以实现延时250毫秒(1/4秒)。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-10-11
for(i=0;i<120;i++);需要循环执行120次才结束本次循环,每次循环需要执行“MOV传送指令(1-2个机器周期)”、“比较判断CJNE(2个机器周期)”、“JNC判零转移(2机器周期)”、等大约8-9个机器周期。执行for循环一次大约需要1000个机器周期,以晶振位12M的单片机系统(一个机器周期消耗时间大约是1us),执行120次需要1MS的时间。 总的来说相当于标一个1MS的刻度吧。
第2个回答  2013-10-30
表示延时一段时间,delayms(250)中的参数越大延时也就越长,这个时间是不确定的,和你机子的运行速度有关追问

难道没有直接靠晶振延时的方法吗?

追答

我是学通用程序的,对单片机研究不深,抱歉

第3个回答  2013-10-30
250是传给函数void delayms(unsigned char ms)的参数

也就是说,ms为250
相似回答