该用户从未签到
11
331
886
荣誉版主
#include "config.h" /* 2023-07-13 修复定时器读取计数值不准的问题。 */ uint32_t volatile edata timer0_millis = 0; //定时器0初始化 void Timer0_Init(void) //1毫秒 { TM0PS = MAIN_Fosc / 1000000 - 1; //分频,定时器1M时钟 AUXR |= 0x80; //定时器时钟1T模式 TMOD &= 0xF0; //设置定时器模式 TL0 = (uint8_t)(65536 - 1000); //设置定时初始值 TH0 = (uint8_t)((65536 - 1000) / 256); //设置定时初始值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 ET0 = 1; //开启中断 } //定时器溢出中断 void Timer0_Isr(void) interrupt 1 { timer0_millis++; P20 = ~P20; } //获取系统运行时间单位ms uint32_t millis() { return timer0_millis; } //获取系统运行时间单位us uint32_t micros() { uint32_t ms, us; uint8_t th, tl, tf; F0 = EA; EA = 0; /* 动态读取运行中的计数值 一种可避免读错的方法是:先读 THx,后读TLx,将两次读得的THx 进行比较, 若两次读得的值相等,则可确定读的值是正确的,否则重复上述过程, 重复读得的值一般不会再错。 */ do { th = TH0; tl = TL0; } while(th != TH0); tf = TF0; ms = timer0_millis; EA = F0; if(tf) { ms++; us = ms * 1000; } else { us = ms * 1000 + th * 256 + tl - 64536; } return us; } //毫秒延时函数 void delay_ms(uint32_t ms) { uint32_t start, current; start = micros(); while (ms > 0) { current = micros(); if (( current - start) >= 1000) { ms--; start += 1000; } } } //while(t--) 翻译汇编需要6T时钟,所以时钟最好选6的倍数:12,24,30,36,42,48,54 #define US_6T (MAIN_Fosc/6000000UL) void delay_us(uint16_t us) { uint32_t t; t = us * US_6T; //3T t -= 2; //1T while(t--); //6T*t //最后退出只需要1T,所以-2T //RET 3T 参数 1T lcall 3T } //由于micros()需要时间,导致不是很准 /* void delay_us(uint32_t us) { uint32_t end,current; end = micros()+us; #if(MAIN_Fosc>=40000000UL) end--; #endif #if(MAIN_Fosc<40000000UL) end-=2; #endif do{ current = micros(); }while (current < end) ; } */ 复制代码
使用道具 举报
本版积分规则 发表回复 回帖后跳转到最后一页
|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )
GMT+8, 2024-5-19 13:06 , Processed in 0.056742 second(s), 33 queries .
Powered by Discuz! X3.5
© 2001-2024 Discuz! Team.