久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2901|回復: 7
打印 上一主題 下一主題
收起左側

STF15單片機關于一個延遲函數的問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:832039 發表于 2020-12-16 00:23 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
10黑幣
下面的程序使用了一個5ms的定時器,對變量sys_tick進行了+1的操作.
程序的功能是使LED燈亮一秒,熄一秒.

目前程序運行后,通過邏輯分析儀分析 P2_3的電平輸出,高低電平持續的時候大部分是準時的,但是有時會少于1000ms,會出現800多ms,500多ms的情況.

如果每次延遲的時候去掉下面紅字部分的注釋則能正常.請問程序出現的問題在哪?

#include <stdint.h>
void Timer0Init(void) //5毫秒@11.0592MHz

{
    AUXR |= 0x80; //定時器時鐘1T模式
    TMOD &= 0xF0; //設置定時器模式
    TL0 = 0x00; //設置定時初值
    TH0 = 0x28; //設置定時初值
    TF0 = 0; //清除TF0標志
    TR0 = 1; //定時器0開始計時
    ET0 = 1;
}

typedef uint32_t size_tick;


volatile size_tick sys_tick = 0;


void Timer0Int() __interrupt TF0_VECTOR
{
    ++sys_tick;
}



void Delay(uint16_t ms)
{
    size_tick tick_num = ms / 5;
    // sys_tick = 0; // 如果這行注釋去掉的話定時是正確的
    size_tick cur_tick = sys_tick;
    while (sys_tick - cur_tick < tick_num)
    {;}
}



void main()
{
    EA = 1; //開總中斷
    Timer0Init();
    while (1)
    {

        P2_3 = 0;
        Delay(1000);


        P2_3 = 1;
        Delay(1000);


    }
}


另外,我在每次延遲后通過串口輸出 sys_tick的值. 理論上 sys_tick每次輸出的值應該是相隔200左右 ( 1000ms/5ms = 200 ).
但是總是在固定時候輸出是啊小于200的.
200
400
600
800
1000
1201
1402
1536
1737
1938
2048
2249
2450
2560
2761
2962
3072
3273
3474



最佳答案

查看完整內容

按你的思路給你改寫了,但通常不會有人這么寫延時函數,浪費資源。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:213173 發表于 2020-12-16 00:23 | 只看該作者

按你的思路給你改寫了,但通常不會有人這么寫延時函數,浪費資源。
  1. #include <STC15F2K60S2.H>
  2. sbit P2_3 = P2^3;
  3. bit flag=0;
  4. unsigned int num;

  5. void Timer0Init(void)                //1毫秒@11.0592MHz
  6. {
  7.         AUXR |= 0x80;                //定時器時鐘1T模式
  8.         TMOD &= 0xF0;                //設置定時器模式
  9.         TL0 = 0xCD;                //設置定時初值
  10.         TH0 = 0xD4;                //設置定時初值
  11.         TF0 = 0;                //清除TF0標志
  12.         TR0 = 1;                //定時器0開始計時
  13.         ET0 = 1;                //開T0中斷
  14.         EA = 1;                 //開總中斷
  15. }

  16. void Timer0Int()interrupt 1
  17. {
  18.         if(flag==1 && num>0)
  19.                 num--;
  20. }

  21. void Delay(unsigned int ms)
  22. {
  23.         flag=1;
  24.         num=ms;
  25.         while(num);
  26.         flag=0;
  27. }

  28. void main()
  29. {
  30.         Timer0Init();
  31.         while(1)
  32.         {
  33.                 P2_3 = 0;
  34.                 Delay(1000);
  35.                 P2_3 = 1;
  36.                 Delay(1000);
  37.         }
  38. }
復制代碼
回復

使用道具 舉報

板凳
ID:861234 發表于 2020-12-16 13:59 | 只看該作者
你這程序里定時器啟動后就一直在運行,sys_tick是自動變的,在不調用延時程序時都會變化,當調用延時程序時如果不預先清0則sys_tick可能已經被定時器程序增加到某一數值,當然延時時間就不準確了
回復

使用道具 舉報

地板
ID:832039 發表于 2020-12-16 14:31 | 只看該作者
小牢頭 發表于 2020-12-16 13:59
你這程序里定時器啟動后就一直在運行,sys_tick是自動變的,在不調用延時程序時都會變化,當調用延時程序時 ...

size_tick cur_tick = sys_tick;
while (sys_tick - cur_tick < tick_num)
{;}

這里的做延遲前是先取sys_tick sys_tick,在后再while循環里面中斷會不斷改sys_tick的前和之前的取值對比.
回復

使用道具 舉報

5#
ID:213173 發表于 2020-12-16 17:35 | 只看該作者
STF15單片機,有這個型號的單片機?
回復

使用道具 舉報

6#
ID:832039 發表于 2020-12-16 19:16 | 只看該作者
wulin 發表于 2020-12-16 17:35
STF15單片機,有這個型號的單片機?

STC15單片機
回復

使用道具 舉報

7#
ID:832039 發表于 2020-12-16 23:06 | 只看該作者
wulin 發表于 2020-12-16 21:21
按你的思路給你改寫了,但通常不會有人這么寫延時函數,浪費資源。

一直占用定時器確實不好.你的寫法是可行的.只是我想知道的是我貼出的程序問題出現在哪.因為目的不是實現功能,而是發現問題和解決問題
回復

使用道具 舉報

8#
ID:832039 發表于 2020-12-16 23:07 | 只看該作者
想了很久,知道問題在哪了,是原子性的問題.
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美综合一区 | 又爽又黄axxx片免费观看 | 成人免费在线播放视频 | 国产精品海角社区在线观看 | 欧美视频 | 久久久久久免费观看 | 免费观看黄a一级视频 | 懂色av蜜桃av | 天天操综合网 | 国产一区91在线 | 久久男人| 四季久久免费一区二区三区四区 | 日本一区二区三区在线观看 | 亚洲一区二区久久久 | avav在线看 | 伊人免费在线 | 中文字幕欧美在线观看 | 蜜月aⅴ免费一区二区三区 99re在线视频 | 亚洲一区成人 | 日本a级大片 | 久久久国产一区二区三区 | 精品国产一区二区三区四区在线 | 亚洲一区二区视频在线播放 | 久久成人综合 | 超碰国产在线 | 91国内精精品久久久久久婷婷 | a中文在线视频 | 国产精品成人一区二区三区 | av网址在线播放 | 91久久国产综合久久91精品网站 | 羞羞的视频网站 | 成人在线观看网址 | 日韩av一区二区在线 | 九色在线观看 | 黄色一级特级片 | 亚洲在线免费观看 | 成人欧美一区二区三区白人 | 中文字幕欧美一区 | 一区二区在线 | 91欧美精品成人综合在线观看 | 国产精品免费一区二区三区四区 |