首先聲明下我只是個(gè)菜鳥, 只會(huì)1點(diǎn)C語言,匯編什么的~對(duì)我而言是天書,看不懂 開發(fā)板也周日下午到的手, “十天學(xué)會(huì)單片機(jī)和C語言編程”也才看完 Lesson3,講到 T0 中斷。 試著做教程里的 課后練習(xí),第1題, 題目是:第一個(gè)發(fā)光管以間隔200ms閃爍
題目說了200ms,我的強(qiáng)迫癥啊,發(fā)作了,就想讓他很精確的間隔200ms 看了其它的例子, 比如:http://www.zg4o1577.cn/bbs/dpj-13914-1.html 都沒有很精確~
然后就試著自己寫1個(gè), 用我目前學(xué)會(huì)的辦法,寫了1段代碼, 用Keil的軟件模擬,看間隔時(shí)間, 結(jié)果是閃爍1次慢1微秒,折換到1小時(shí)就是慢 18ms 也就是只能做到 “第一個(gè)發(fā)光管以間隔199.999ms閃爍” 再精確~我目前是無能為力了 =_=!
下面是我寫的程序代碼[數(shù)碼管的干擾什么的請(qǐng)無視] 另外,代碼我只是剛在公司寫完,還沒在開法板上測(cè)試過 ^=^
111.png (66.87 KB, 下載次數(shù): 171)
下載附件
2012-8-30 14:36 上傳
//第一個(gè)發(fā)光管以間隔200ms閃爍 //計(jì)時(shí)器 T0 中斷的使用 //使用 12MHz 晶振,方便計(jì)時(shí)
#include <reg52.h> //52單片機(jī)頭文件 unsigned char T50ms=0; sbit leds=P1^4; //燈總開關(guān) sbit led1=P0^0; //第1個(gè)燈開關(guān) void main() { leds=0; //開燈 TMOD=0x01; //T0工作方式為 定時(shí)+16位定時(shí) TH0=(65536-50000)/256; //定時(shí)器高8位初始時(shí)值 TL0=(65536-50000)%256; //定時(shí)器低8位初始時(shí)值 //50ms 計(jì)時(shí) EA=1; //中斷總開關(guān) ET0=1; //中斷小開關(guān)-T0計(jì)時(shí)開關(guān) TR0=1; //開始計(jì)時(shí) while(1) { if(T50ms==4) {led1=!led1; //燈閃爍 T50ms=0;} //重新計(jì)次 } } void delay50ms() interrupt 1 { //中斷程序耗時(shí)_跳進(jìn)中斷堆棧操用5個(gè)機(jī)器周期= 5 μs T50ms++; //中斷程序耗時(shí)_++運(yùn)算用1個(gè)機(jī)器周= 1 μs TH0=(65536-50000)/256; //定時(shí)器高8位初始時(shí)值 //中斷程序耗時(shí)_一次賦值用2個(gè)機(jī)器周= 2 μs TL0=(65536-50000)%256+8; //定時(shí)器低8位初始時(shí)值 /* 在 TL0 中 +8 后燈每次變化慢 1μs 每即 200ms 慢 1μs 1小時(shí)慢 18ms 在 led1=!led1; 處設(shè)斷點(diǎn),用Keil軟件模擬,查看 sec 的值, #1=0.20045900 #2=0.40045800 #3=0.60045700 #4=0.80045600 #5=1.00045500 */ }
[此貼子已經(jīng)被作者于2012-8-30 14:36:25編輯過]
|