单片机延时程序怎么写?是根据什么原理写的?有什么方法吗?

单片机延时程序怎么写?是根据什么原理写的?有什么方法吗?,第1张

单片机中做延时,如果是时间比较短的情况,和单片机的机器周期时间,或单片机运行单个命令的时间是同一个单位时间的话,那么用循环运行一些没有动作的命令来延时,算每个命令的时间是多少,循环了多少次,那延时时间就可以算出来的了。

另外一种延时,时间相对机器周期的单位时间来说比较大,好像要MS,S 以上,那么可以用单片机的定时器来做,那就比较准确的时间的了,

实验目的:本程序主要实现一个简单的流水灯程序

即轮流点亮C口的8个灯(先点亮RC0,再熄灭RCO点亮RC1。。。。)

硬件要求:拨码开关S2全部置ON。

#include<p16f877A.inc> 调用头文件

__CONFIG _DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC

芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡

**********************用户寄存器定义********************

count equ 20h 移位次数寄存器

del_va1 equ 0ffh 外层延时参数

del_va2 equ 0ffh 内层延时参数

org 00h 程序人口地址

addlw0ffh

**********************主程序开始***********************

main

nop ICD所需要的一条空指令

clrf PORTC 先清楚C口所有显示

banksel TRISC 选择I/O口方向寄存器所在的体

clrf TRISC 设置C口全为输出

clrf STATUS 返回体0

movlw.8

movwfcount 装载循环次数8(C口共8位)

bsf STATUS,C置进位标志位为1,因循环移位是带进位循环的

loop

rlf PORTC,1 C口左移1位

call delay

call delay

CALL delay 调用三次延时程序(保证亮度,以及流水灯闪烁速度)

bcf STATUS,C清0进位标志位(永远只有一只LED亮)

DECFSZ count,1 判断是否一轮循环结束

goto loop否,继续循环移位

GOTO main是,程序重头开始

***********************延时程序*************************

delay

movlwdel_va1 延时程序外层参数

movwf30h

movlwdel_va2 延时程序内层参数

movwf31h

decfsz 31h,1

goto $-1

decfsz 30h,1

goto $-4

return

********************程序结束****************************

end

延时有两种方法,一种是用软件延时,即写延时子程序,这种方法是让单片机执行无用的指令,就是为了延时,延时期间就不能做其他事情了,很浪费单片机的时间。这种方法是在单片机不忙的情况下用,反正闲着也是闲着。

第二种方法就是你要求的,即能延时,又不耽误主程序的运行,用定时器T0或T1定时,设置定时时间后,定时器开始计时,主程序继续执行,不用管定时器,当定时时间到,定时器就会申请中断,单片机就响应中断,处理定时子程序需要完成的工作,完成后返回到主程序继续主程序的执行,这是最合理的方法,充分利用了单片机的资源,互不影响。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11888435.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存