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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

[討論]菜鳥糾結于精確計時

[復制鏈接]
跳轉到指定樓層
樓主

首先聲明下我只是個菜鳥,
只會1點C語言,匯編什么的~對我而言是天書,看不懂
開發板也周日下午到的手,
“十天學會單片機和C語言編程”也才看完 Lesson3,講到 T0 中斷。
試著做教程里的 課后練習,第1題,
題目是:第一個發光管以間隔200ms閃爍

 

題目說了200ms,我的強迫癥啊,發作了,就想讓他很精確的間隔200ms
看了其它的例子,
比如:http://www.zg4o1577.cn/bbs/dpj-13914-1.html
都沒有很精確~

 

然后就試著自己寫1個,
用我目前學會的辦法,寫了1段代碼,
用Keil的軟件模擬,看間隔時間,
結果是閃爍1次慢1微秒,折換到1小時就是慢 18ms
也就是只能做到 “第一個發光管以間隔199.999ms閃爍”
再精確~我目前是無能為力了 =_=!

 

下面是我寫的程序代碼[數碼管的干擾什么的請無視]
另外,代碼我只是剛在公司寫完,還沒在開法板上測試過 ^=^

 

 


 

//第一個發光管以間隔200ms閃爍
//計時器 T0 中斷的使用
//使用 12MHz 晶振,方便計時


#include <reg52.h>   //52單片機頭文件
unsigned char T50ms=0;
sbit leds=P1^4; //燈總開關
sbit led1=P0^0; //第1個燈開關
void main()
{  leds=0;  //開燈
 TMOD=0x01;     //T0工作方式為  定時+16位定時
 TH0=(65536-50000)/256;  //定時器高8位初始時值
 TL0=(65536-50000)%256;  //定時器低8位初始時值
 //50ms 計時
 EA=1;  //中斷總開關
 ET0=1;  //中斷小開關-T0計時開關
 TR0=1;  //開始計時
 while(1)
 {
  if(T50ms==4)
   {led1=!led1; //燈閃爍
    T50ms=0;}  //重新計次
 }
}
void delay50ms() interrupt 1

 //中斷程序耗時_跳進中斷堆棧操用5個機器周期= 5 μs
 T50ms++;
 //中斷程序耗時_++運算用1個機器周= 1 μs
 TH0=(65536-50000)/256;  //定時器高8位初始時值
 //中斷程序耗時_一次賦值用2個機器周= 2 μs
 TL0=(65536-50000)%256+8; //定時器低8位初始時值
/*
在 TL0 中
+8 后燈每次變化慢 1μs
每即 200ms 慢 1μs
1小時慢 18ms 
 在 led1=!led1; 處設斷點,用Keil軟件模擬,查看 sec 的值,
 #1=0.20045900
 #2=0.40045800
 #3=0.60045700
 #4=0.80045600
 #5=1.00045500
*/ 
}


 

[此貼子已經被作者于2012-8-30 14:36:25編輯過]
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1 發表于 2012-8-30 16:23 | 只看該作者

我原來曾經專門開過一個帖子介紹過精確定時的問題 http://www.zg4o1577.cn/bbs/dpj-4711-1.html  

 

你按上面網址的做 能精確到1微妙 .

回復

使用道具 舉報

板凳
ID:44260 發表于 2012-8-30 21:50 | 只看該作者

看了那個貼子,匯編不懂~哈

 

參照貼子,按思路試了一下,應該也是可以調整 延遲語句 精確定時到200ms,

但這種 延遲語句 沒辦法方便調整成其它時間,比如改成250ms,又得反復調  延遲語句 到精確。

 【這方法也可以把精確定時調小,比如 延遲語句 1次是50ms,要250ms定時 就調用5次】

 

 

又順著貼子看到 _nop_() 函數正好是 1 μs,看了之前的程序,

閃爍1次慢1 μs 不對,而是快了1 μs

加個 _nop_()  應該正好

 

調了下我的程序,關了數碼管干擾,加了 _nop_() 空函數,正好間隔200ms,非常精確。

改定時就修改 if 的判斷語句,可以隨便改 50ms 倍數 的間隔時間,都是精準的。

 

當然主程序循環體語句數量改變等,定時器中斷程序里的 堆棧 操作時間也會隨著變,調起來也麻煩了 =_=!

 

我的程序改成這樣了:

 

 

 

[此貼子已經被作者于2012-8-30 22:01:37編輯過]
回復

使用道具 舉報

地板
ID:7485 發表于 2012-8-31 08:08 | 只看該作者

首先你的精益求精的精神我是贊賞的。

 

基于你這種精神和目的,但是我不得不告訴你:定時器工作在這種模式下,不可能那么精確!(12m晶振,只要有誤差就肯定大于1us)

 

原因是由于51單片機在響應中斷請求時的一些條件(具體的你自己再看看資料吧),不可能任何情況下都及時響應。由于重新裝載定時初值是在中斷內,所以就會造成重新裝載初值的時間不確定(當然是us級的),自然就造成了誤差。

 

怎么辦呢?如果是做單片機時鐘(不用時鐘芯片),確實需要這么高的精度時,可以采用定時器/計數器2(51沒有,52有),自動重裝載初值的工作模式。

回復

使用道具 舉報

5#
ID:44260 發表于 2012-8-31 12:07 | 只看該作者

呵呵,我的代碼里,12M晶振不準引起的誤差,我就是再怎么個強迫癥,我也無能為力了

STC-ISP下載時顯示的貌似確實不是精確12M,是不滿12M】

 

我們開發板 STC89C52單片機 芯片

是有 定時器/計數器2 的吧,

 

查了 reg52.h , 定時器/計數器2 不是很懂,

是不是這樣

IE 寄存器的 ET2 位是 定時器/計數器2 開關

對應的 T2CON 寄存器的 TR2和TF2位是 開始計時和溢出的標志位

 

T2CON 其它位都是什么作用?

始初值、工作方式啊 什么的是哪在個寄存器位?

 

看不懂啊,還缺點理論知識,

定時器/計數器2 使用教程在哪有的沒?

 

 

[此貼子已經被作者于2012-8-31 12:07:58編輯過]
回復

使用道具 舉報

6#
ID:7485 發表于 2012-8-31 21:41 | 只看該作者

TH2=(65536-46080)/256       ;//46080...11.0592MHZ晶振的初裝值
TL2=(65536-46080) MOD 256   ;//初值0DC00H送定時器T2 
RCAP2H=(65536-46080)/256; 
RCAP2L=(65536-46080) MOD 256   ;//初始化重裝初值
T2CON=0x04                     ;//初始化T2工作方式(自動重裝初值、定時)
                                                     ;//并啟動了T2
ET2=1                             ;//允許定時器T2中斷

 

[此貼子已經被作者于2012-9-1 9:36:46編輯過]
回復

使用道具 舉報

7#
ID:44260 發表于 2012-8-31 22:01 | 只看該作者

繼續學習~發現T0 T1 的工作方式2 也是具有自動重裝的,

 

只不過只能有8位也就是最大256us [12M晶振]

 

256us 時間有點短,留給程序執行的其它代碼時間不多。

 

我這樣理解不錯吧?

回復

使用道具 舉報

8#
ID:7485 發表于 2012-9-1 09:34 | 只看該作者

你的理解是對的!

 

按我上面給你的回復試一試,就那么多。

回復

使用道具 舉報

9#
ID:42637 發表于 2012-9-1 22:26 | 只看該作者

結果是閃爍1次慢1微秒,折換到1小時就是慢 18ms
也就是只能做到 “第一個發光管以間隔199.999ms閃爍”
肉眼觀察到這種現象?

軟件仿真本就不準!

在網上查了一下,能測1微秒的量具還真沒找到。

[此貼子已經被作者于2012-9-1 22:31:50編輯過]
回復

使用道具 舉報

10#
ID:7485 發表于 2012-9-2 00:32 | 只看該作者

單獨計量一個us是不容易,但是10天差5秒是可以計量的。

回復

使用道具 舉報

11#
ID:1 發表于 2012-9-3 22:04 | 只看該作者
敢問樓主用的什么代碼編輯器  貌似不是keil?
回復

使用道具 舉報

12#
ID:44260 發表于 2012-9-4 08:48 | 只看該作者

只是截圖時用的 Notepad++ 文本編輯器

 

應用了 tomorrow_night_bright 皮膚

[此貼子已經被作者于2012-9-4 8:48:55編輯過]
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天操操操操操 | 美女一区二区在线观看 | 欧美一区永久视频免费观看 | 国产精品视频一区二区三区 | 精品国产91乱码一区二区三区 | 二区av| 亚洲高清视频在线 | 国产黄色av网站 | 中文二区| 欧美中文字幕在线观看 | 日韩视频一区二区 | 久久精品国产一区 | 国产精品1区 | 亚洲精品视频在线观看视频 | 国产一区二区精品在线观看 | 羞羞视频免费在线观看 | 日日日干干干 | 在线播放一区二区三区 | 久久精品免费一区二区三 | 日本一区二区三区精品视频 | 日韩a| 亚洲国产精品自拍 | 一区二区欧美在线 | 91精品久久久久久久久 | 国产久 | 亚洲九九色 | 国产99精品 | 99这里只有精品视频 | 午夜精品久久久久久久星辰影院 | 日韩成人免费 | 人人看人人干 | 日日天天| 人人鲁人人莫人人爱精品 | 成人久久久 | 免费av手机在线观看 | 91电影| 成年人在线观看 | 在线中文视频 | 国产亚洲二区 | 亚洲精品高清视频在线观看 | 久草.com|