首页 > 电脑

分析程序中100毫秒延时的误差;若对延时时间的精度要求高的话,应该怎么办?

更新时间2018-10-31 12:26:34

.include "m128def.inc"              ;包括器件配置定义文件,不能缺少 

.def temp1=r20                     ;定义寄存器R20用临时变量名temp1代表 

 

.org $0000                          ;上电复位启始地址 

rjmp reset                          ;转上电复位后的初始化程序执行 

                                    ;中断向量区 

.org $002A                          ;跳过中断向量区 

reset:    ldi r16,high(RAMEND)     ;取内部RAM最高地址的高位字节 

          out sph,r16              ;放入SP的高位 

          ldi r16,low(RAMEND)      ;取内部RAM最低地址的低位字节 

          out spl,r16              ;放入SP的低位,SP中的值见器件配置文件"m16def.inc"

 

ldi r21,1;  

ldi r22,1;  

ldi r23,1;

ldi r24,1;

ldi r25,1;

 

sts $0150,r21;  

sts $0151,r22;  

sts $0152,r23;  

sts $0153,r24;

ldi r16,90;

 

loop:

rol r21;

mov r21,r25;

 

     rol r24;

     rol r23;

     rol r22;

     rol r21;

mov r25,r21;

 

sts $0150,r21;  

sts $0151,r22;  

sts $0152,r23;  

sts $0153,r24;

 

rcall delay;

rjmp loop

 

loop1:

            cbi portc,0              ;值PORTC.0位为"0",LED亮 

          rcall delay              ;调用延时子程序,延时一秒 

          sbi portc,0              ;值PORTC.0位为"1",LED灭 

          rcall delay              ;调用延时子程序,延时一秒 

          rjmp loop1                ;循环跳转到loop继续执行 

;通用延时子程序 

delay:    push r16                 ;压栈(2t) 

del1:     push r16                 ;压栈(2t) 

del2:     push r16                 ;压栈(2t) 

del3:     dec r16                  ;r16 = r16 - 1,(1t) 

          brne del3                ;不为0跳转移,为0顺序执行(2t/1t) 

          pop r16                  ;出栈(2t) 

          dec r16                  ;r16 = r16 - 1,(1t) 

          brne del2                ;不为0跳转移,为0顺序执行(2t/1t) 

          pop r16                  ;出栈(2t) 

          dec r16                  ;r16 = r16 - 1,(1t) 

          brne del1                ;不为0跳转移,为0顺序执行(2t/1t) 

          pop r16                  ;出栈(2t) 

          ret                      ;子程序返回(4t)


汗!问这个问题说明你对时钟周期、机器周期、定时器周期都不太了解吧。延时100毫秒的程序可以是一个函数,也可以是利用定时器的一段代码。如果是用汇编延时那么你要把单片机指令周期表翻一下了,看看整个循环语句用了哪些指令,每个指令多少个机器周期,然后计算每个机器周期耗时多少时长,你就知道循环多少次了。如果用c语言延时,那么就要借助仪器了,你同样要估算一下机器周期和循环次数,然后要精确到100ms就需要把这个延时时间作为频率从单片机IO口输出,用仪器来辅助测量,最后得出叫准确的100ms的循环次数的值。如:void delay_100ms(uint8 n){uint16 i;while(n){for(i=0;i<xxx;i++)//此循环应为运行100ms,用仪器辅助得到xxx的值。不够就再在FOR一次。}}

上一篇:在java自定义异常中,如何使异常字符串进入设定的异常解决方案中

下一篇:51单片机用定时器工作方式3做波特率发生器,用中断的方式发送数据的程序