一:問題描述
按照文中單片機代碼編譯下載后,P1口LED不閃爍,一直亮。然后通過Keil uVision5軟件仿真,延時時間也不是期望的0.5s。請大家幫我看看是怎么回事?

二:硬件環境
STC12C2052AD //12MHz //P1口外接LED
采用定時器0的工作方式1寫一段延時5ms的函數,然后調用延時函數,使P1口外接的LED每0.5s閃爍一次。

三:軟件環境
Keil uVision5

四:示例代碼如下(采用查詢方法)
- #include <STC12C2052AD.H>
- //以下是采用定時器0的 5ms延時函數
- void delay(unsigned int i) //延時程序,i是形式參數
- {
- TMOD = 0X01; //設定定時器0為工作方式1
- IE = 0X00; //禁止中斷
- TR0 = 1; //啟動定時器0
- while(i != 0) //執行i次循環
- {
- TH0 = 0XEC;
- TL0 = 0X78; //設定計數脈沖為XX次
- while(TF0 != 1); //計時時間不到,等待;計時時間到,計數溢出位置1,即TF0=1
- i--; //循環次數減1
- }
- TR0 = 0; //關閉定時器0
- }
- //以下是主程序
- void main()
- {
- for(;;)
- {
- P1 = 0X00; //P1口LED全亮
- delay(100); //延時100*5ms=0.5s
- P1 = 0XFF; //P1口LED全滅
- delay(100); //延時100*5ms=0.5s
- }
- }
復制代碼
五:定時器0的工作方式1初值計算如下:
工作方式1的定時時間.png (85.39 KB, 下載次數: 40)
下載附件
2023-5-18 01:17 上傳

六:Keil設置如下:
Keil設置.png (23.46 KB, 下載次數: 39)
下載附件
2023-5-18 01:19 上傳

七:軟件仿真如下:
軟件仿真.png (58.46 KB, 下載次數: 45)
下載附件
2023-5-18 01:19 上傳

八:自己挖的坑自己填!
仔細對照書中代碼,發現少了一句,如下:
少了一句,將計數溢出位清零.png (106.2 KB, 下載次數: 51)
下載附件
2023-5-18 13:06 上傳

九:程序重新編譯下載后,雖然LED閃爍了,但是軟件仿真結果還不是期望的0.5s,不知道怎么回事?希望大家幫我看看!多謝了!
不是期望的0.5s.png (62.21 KB, 下載次數: 36)
下載附件
2023-5-18 13:08 上傳
|