OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2296|回复: 5

我的代码中设计延时与实际不符的问题

[复制链接]

22

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2017-9-18
在线时间
42 小时
发表于 2018-5-7 21:27:22 | 显示全部楼层 |阅读模式
1金钱
这是我根据原子哥ds18b20代码改写的一个代码
实现功能是根据设定的时间周期(红色部分),把测得温度与RTC中时间用IIC方式保存到板上EEPROM
按下KEY0显示EEPROM中保存的5组数据(温度及时间)

但实际运行时,我发现设计的时间周期与我设定的不一样
设定10s时,实际上会是15,16s
设定5s时,实际上会是8s
设定3s时,实际上会是5s
设定2s时,实际上会是3s
感觉一直是1.5倍的样子,这是为什么呢?
补充下,我是等一段较长时间过后看5组数据的时间间隔的,平时不按KEY0

最佳答案

查看完整内容[请看2#楼]

没看到红色部分。这种问题,仿真很好解决的
普通人要怎么努力,才能超越勤奋的天才啊
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-5-7 21:27:23 | 显示全部楼层
没看到红色部分。这种问题,仿真很好解决的
回复

使用道具 举报

22

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2017-9-18
在线时间
42 小时
 楼主| 发表于 2018-5-7 21:31:16 | 显示全部楼层
本帖最后由 aswsd 于 2018-5-8 15:26 编辑

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "ds18b20.h"
#include "key.h"
#include "24cxx.h"
#include "myiic.h"
#include "rtc.h"

u8 save =0;           
u8 x=0;              
int main(void)
{
        u8 t=0;
        u16 t1=0;
        u8 key,pm;
        u8 hour,min,sec;
        short temperature,tempsave;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        delay_init();                    
        uart_init(9600);                 
        LED_Init();                                 
         LCD_Init();
        TIM1_PWM_Init(899,0);
        AT24CXX_Init();                        
        KEY_Init();
         
        POINT_COLOR=RED;
        LCD_ShowString(60,50,200,16,16,"Mini STM32");        
        LCD_ShowString(60,70,200,16,16,"DS18B20 TEST");        
        LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(60,110,200,16,16,"2014/3/12");                  
         while(DS18B20_Init())        
        {
                LCD_ShowString(60,130,200,16,16,"DS18B20 Error");
                delay_ms(200);
                LCD_Fill(60,130,239,130+16,WHITE);
                 delay_ms(200);
        }
        LCD_ShowString(60,130,200,16,16,"DS18B20 Ready!");
        while(AT24CXX_Check())
        {
                LCD_ShowString(60,150,200,16,16,"24C02 Check Failed!");
                delay_ms(500);
                LCD_ShowString(60,150,200,16,16,"Please Check!      ");
                delay_ms(500);
        }        
        LCD_ShowString(60,150,200,16,16,"24C02 Ready!");
        while(RTC_Init())               
        {
                LCD_ShowString(60,170,200,16,16,"RTC ERROR!   ");        
                delay_ms(800);
                LCD_ShowString(60,170,200,16,16,"RTC Trying...");        
        }
        LCD_ShowString(60,170,200,16,16,"RTC Ready!");        
        POINT_COLOR=BLUE;
        while(1)
        {        
                key=KEY_Scan(0);
                if(key==KEY0_PRES)
                {
                LCD_Fill(60,190,239,190+16,WHITE);
                 for(key=0;key<5;key++)
                        {
                        LCD_ShowString(60,190+20*key,90,16,16,"Temp:   . C");
                        LCD_ShowString(170,190+20*key,200,16,16,"  :  :  ");                                       
                        temperature=AT24CXX_ReadOneByte(6*key+1);
                        temperature<<=8;
                        temperature+=AT24CXX_ReadOneByte(6*key);
                        temperature=(float)temperature*0.625;
                        pm=AT24CXX_ReadOneByte(6*key+2);
                        hour=AT24CXX_ReadOneByte(6*key+3);
                        min=AT24CXX_ReadOneByte(6*key+4);
                        sec=AT24CXX_ReadOneByte(6*key+5);
                        if(pm==0)LCD_ShowChar(60+40,190+20*key,'-',16,0);                        
                        else LCD_ShowChar(60+40,190+20*key,' ',16,0);                        
                        LCD_ShowNum(60+40+8,190+20*key,temperature/10,2,16);            
                        LCD_ShowNum(60+40+32,190+20*key,temperature%10,1,16);        
                        LCD_ShowNum(170,190+20*key,hour,2,16);
                        LCD_ShowNum(170+24,190+20*key,min,2,16);
                        LCD_ShowNum(170+24+24,190+20*key,sec,2,16);
                        }
                delay_ms(1000);
                delay_ms(1000);
                delay_ms(1000);
                LCD_Fill(60,190,239,329,WHITE);
                }
                    
                 LCD_ShowString(60,190,200,16,16,"Temp:");        
                LCD_ShowString(60+64,190,200,16,16,".");
                LCD_ShowString(60+80,190,200,16,16,"C");
                if(t1==500)                                                       //代表周期为5s
                        {
                         if(x==30)x=0;
                         save=1;
                         t1=0;
                        }
                if(t%10==0)
                {        
                        temperature=DS18B20_Get_Temp();        
                        if(temperature<0)
                        {
                                LCD_ShowChar(60+40,190,'-',16,0);                        
                                temperature=-temperature;                                       
                        }else LCD_ShowChar(60+40,190,' ',16,0);                        
                          LCD_ShowNum(60+40+8,190,temperature/10,2,16);                    
                           LCD_ShowNum(60+40+32,190,temperature%10,1,16);                           
                }                                   
                 delay_ms(10);
                t++;
                t1++;
                if(t==20)
                {
                        t=0;
                        LED0=!LED0;
                }
        }
}


注释从MDK拷贝过来全变乱码。。我删掉了
普通人要怎么努力,才能超越勤奋的天才啊
回复

使用道具 举报

22

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2017-9-18
在线时间
42 小时
 楼主| 发表于 2018-5-8 15:31:59 | 显示全部楼层
正点原子 发表于 2018-5-8 01:36
没看到红色部分。这种问题,仿真很好解决的

原子哥,我标好了,仿真方面我实在是心有余而力不足。。
普通人要怎么努力,才能超越勤奋的天才啊
回复

使用道具 举报

22

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2017-9-18
在线时间
42 小时
 楼主| 发表于 2018-5-8 16:13:25 | 显示全部楼层
本帖最后由 aswsd 于 2018-5-8 16:37 编辑
正点原子 发表于 2018-5-8 01:36
没看到红色部分。这种问题,仿真很好解决的

好了原子哥,问题解决了,原来是LCDShowChar函数运行需要时间,我一次while循环设置delay_ms(10)但是三个LCDShowChar函数还需要占用5ms左右,因此一直是1.5倍设置周期!
普通人要怎么努力,才能超越勤奋的天才啊
回复

使用道具 举报

22

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2017-9-18
在线时间
42 小时
 楼主| 发表于 2018-5-8 16:19:26 | 显示全部楼层
本帖最后由 aswsd 于 2018-5-8 16:37 编辑

这里的提问我就删了
普通人要怎么努力,才能超越勤奋的天才啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 00:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表