我用VC写了个跑马灯程序,用delay()函数调延时,但是我不知道怎么回事调不...
K就是1000了,你主程序中写成 delay(1000);就好了,很方便。
另个延时思想是尽量使用高效语句(减少对时间差的影响)读取系统时间,以判断时间差来延时。
delay()实现里面不能用if来判断TF0,因为程序运行到这时定时计数器还在计数,TH0还没有溢出,TF0还是0;所以你要用个while(!TF0);让程序在这等一下,等到TH0溢出,这时TF0被硬件自动置1,while(!TF0)循环结束,程序继续往下走,这时令TR0=0,关闭定时器。delay()运行完总共延时也就是50毫秒。
...灯程序,如果不加延时或者去掉其中一个延时delay,效果会怎样?求大神...
1、可以。当你学到深入,单片机要执行的程序,还会有很多很多,它们就会占用时间,也就相当于执行延时函数。
2、void delay(unsigned int i);main() //主函数 { P2=0x55; //P2口:0101 0101 从左到右:第一个口低电平,第二个口高电平。。
3、delay1(PWM_LOW); //灭延迟,随循环的执行,灭的时间越来越长 P2 =0x00; //亮 delay1(CYCLE-PWM_LOW); //亮延迟,随循环的执行,亮的时间越来越短 } 每一次循环会在固定的一个时间长度(CYCLE)内显示一个的灭亮过程,随循环的执行改变灭和亮的时间比。
单片机1秒钟定时汇编语言怎么编?
单片机。用汇编语言编程。 设计一软件延时1s的子程序。设晶振频率为12MHz。
单片机常用的编程语言有汇编语言、C语言等。以下是使用汇编语言实现延时1s的程序:以上程序中,使用了一个8位计数器来实现延时功能。由于单片机晶振频率为12MHz,每个指令需要执行12/4=3个机器周期(其中4代表指令周期),因此可以通过调整计数器初值来实现不同的延时时间。
先打开我们熟悉的单片机c51编程软件——keil,先把主方法写好。然后,我们要定义两个变量。接着,设定好定时器的工作方式。设置中断发生的机制。最后,我们要加进这几行代码进行初值的重装。最后,把if语句补充完毕就可以了。
DEL1S:MOV R7,#10 D1: MOV R6,#200 D2: MOV R5,#250 DJNZ R5,DJNZ R6,D2 DJNZ R7,D1 RET 说明:如果不使用RRR7可以用别的单元替换,比如换成30H、31H、32H等等 这个程序是12M时钟,如果时钟不同,要修改数值。
每次中断加一,这样当这个变量值为4000时就刚好是1S钟。
只有用12M才能做到精确定时。10592 M 用我这个程序吧: 准确定时是做不到的,但是有解决办法。你可以使用补偿法。比如10分钟后差1秒。你就软件补偿1S进去就好了。我是这么干的。当然你还可以使用其他更好的办法。
关于51单片机1s延时的问题
如果FOSC=12MHZ单片机,那么一个机器周期为12/12M=1us 如果是汇编语言的话:L1:MOV R7,#100 L2:MOV R6,#100 L3:MOV R5,#50 DJNZ R5,$;此句两个机器周期也就是2T DJNZ R6,L3 DJNZ R7,L2 RET 2T*50*100*100=1,000,000us(共一秒),这是粗略算法,有误差,但不是太大。
MOV R3,#250 DEL3: DJNZ R3,DEL3 ;2*2*250*100*10=1000000us DJNZ R2,DEL2 DJNZ R1,DEL1 RET 没有做具体计算,要准确的定时1s的话可以稍微改动一下R1R2R3的值。
单片机的几种精确延时实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。1 使用定时器/计数器实现精确延时 单片机系统一般常选用1059 2 MHz、12 MHz或6 MHz晶振。
现象就是发光二极管正常工作,数码管只是显示P2=6的花样。这样问题就很明显了,程序本身没有问题啊,只是P2=0到P2=6,时间太短了,以12M晶振为例,每条指令4us,只是执行了32us,停留的时间太短导致肉眼是看不见的。至于P2=6为什么会显示,那是因为你主程序里延时了1S左右。
所谓的延时函数 就是做一个死循环 void delay(void){ unsigned int i;for(i=0;i20000;i++); //延迟函数,让程序数数,浪费时间。可以通过改变i的值来改变时间。