首先聲明下我只是個菜鳥, 只會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閃爍” 再精確~我目前是無能為力了 =_=!
下面是我寫的程序代碼[數碼管的干擾什么的請無視] 另外,代碼我只是剛在公司寫完,還沒在開法板上測試過 ^=^
111.png (66.87 KB, 下載次數: 171)
下載附件
2012-8-30 14:36 上傳
//第一個發光管以間隔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編輯過]
|