先看一下我的程式碼:
timer.c
/* 本程式依照創用CC規範,也就是說,愛怎麼用就怎麼用,就算拿去賺錢我,只要別讓我知道就好。 設計者:Ethan 設計日期:2012/5/5 程式功能:使用計時器,做出一個週期為兩秒的方波 */ #include<AT89X51.h> #include "timerAPI.h" //#include <math.h> #include "TimerLIB.c" void main(){ unsigned char i=0; // int count; P1 =0xff; /* TMOD該填入的值 +-----------+------+------+ | Mode/Timer| 0 | 1 | +-----------+------+------+ | 0 | 0x00 | 0x01 | +-----------+------+------+ | 1 | 0x00 | 0x10 | +-----------+------+------+ 內部計數,由TR啟動,Timer0,Mode0,TMOD = 0x00 內部計數,由TR啟動,Timer1,Mode0,TMOD = 0x10 內部計數,由TR啟動,Timer0,Mode1,TMOD = 0x01 內部計數,由TR啟動,Timer0,Mode0,TMOD = 0x00 */ TMOD = 0x10; while(1){ //P1 = 0x00; DelayX1msTimer1Mode1(1000); P1_0=~P1_0; } }复制代码 TimerLIB.c
/*
本程式依照創用CC規範,也就是說,愛怎麼用就怎麼用,就算拿去賺錢我,只要別讓我知道就好。
設計者:Ethan
設計日期:2012/5/5
程式功能:內部計時,TR啟動, DelayX1msTimer1Mode0 == Timer1,Mode0 1ms延遲產生程式; DelayX1msTimer1Mode0 == Timer1,Mode1 1ms延遲產生程式; DelayX1msTimer0Mode0 == Timer0,mode0 1ms延遲產生程式; DelayX1msTimer0Mode0 == Timer0,mode0 1ms延遲產生程式;
*/
#include<AT89X51.h> #include "timerAPI.h" //Timer 1,Mode 0 ,內部計數,TR啟動,計時1ms副程式 //Count=延遲時間 //Count=1000,延遲一秒 //Count=10000,延遲十秒 extern void DelayX1msTimer1Mode0(unsigned int count){ //13位元計數,所以是2^13=8192 //TLx=(計數位元數-計數次數)%256 //THx=(計數位元數-計數次數)/256 TL1=(8192-1000)%32; TH1=(8192-1000)/32; TR1=1;//Timer 0啟動 while (count) { //TF,計數溢位旗標,數到了就會變為0 while(TF1==0); //重新設定Timer 0 TL1=(8192-1000)%32; TH1=(8192-1000)/32; TF1=0; count--; } TR1=0;//Timer 0關閉 } //Timer 0,Mode 0 ,內部計數,TR啟動,計時1ms副程式 //Count=延遲時間 //Count=1000,延遲一秒 //Count=10000,延遲十秒 extern void DelayX1msTimer0Mode0(unsigned int count){ //13位元計數,所以是2^13=8192 //TLx=(計數位元數-計數次數)%256 //THx=(計數位元數-計數次數)/256 TL0=(8192-1000)%32; TH0=(8192-1000)/32; TR0=1;//Timer 0啟動 while (count) { //TF,計數溢位旗標,數到了就會變為0 while(TF0==0); //重新設定Timer 0 TL0=(8192-1000)%32; TH0=(8192-1000)/32; TF0=0; count--; } TR0=0;//Timer 0關閉 } //Timer 0,Mode 1 ,內部計數,TR啟動,計時1ms副程式 //Count=延遲時間 //Count=1000,延遲一秒 //Count=10000,延遲十秒 extern void DelayX1msTimer0Mode1(unsigned int count){ //16位元計數,所以是2^16=65535 //TLx=(計數位元數-計數次數)%256 //THx=(計數位元數-計數次數)/256 TL0=(65536-1000)%256; TH0=(65536-1000)/256; TR0=1;//Timer 0啟動 while (count) { //TF,計數溢位旗標,數到了就會變為0 while(TF0==0); //重新設定Timer 0 TL0=(65536-1000)%256; TH0=(65536-1000)/256; TF0=0; count--; } TR0=0;//Timer 0關閉 } //Timer 1,Mode 1 ,內部計數,TR啟動,計時1ms副程式 //Count=延遲時間 //Count=1000,延遲一秒 //Count=10000,延遲十秒 extern void DelayX1msTimer1Mode1(unsigned int count){ //16位元計數,所以是2^16=65535 //TLx=(計數位元數-計數次數)%256 //THx=(計數位元數-計數次數)/256 TL1=(65536-1000)%256; TH1=(65536-1000)/256; TR1=1;//Timer 0啟動 while (count) { //TF,計數溢位旗標,數到了就會變為0 while(TF1==0); //重新設定Timer 0 TL1=(65536-1000)%256; TH1=(65536-1000)/256; TF1=0; count--; } TR1=0;//Timer 0關閉 }复制代码 頭文件timerAPI.h
extern void DelayX1msTimer0Mode0(unsigned int count); extern void DelayX1msTimer0Mode1(unsigned int count); extern void DelayX1msTimer1Mode1(unsigned int count); extern void DelayX1msTimer1Mode0(unsigned int count);复制代码 把這三個程式碼全拷貝過去,各存成三個檔案,就可以使用了。
本人測試過,如果用keil,51的震盪頻率在12MHz的狀況之下,可以確實可以延遲一秒,甚至三十秒都可以。
然而,我的問題是當我用Keil連結的時候,出現以下的警告訊息
Rebuild target 'Target 1' assembling STARTUP.A51... compiling timer.c... linking... *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?TIMER0MODE0DELAY?TIMER *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?TIMER1MODE1DELAY?TIMER *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_DELAYX1MSTIMER1MODE0?TIMER *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_DELAYX1MSTIMER0MODE0?TIMER *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_DELAYX1MSTIMER0MODE1?TIMER Program Size: data=10.0 xdata=0 code=199 creating hex file from "timer"... "timer" - 0 Error(s), 5 Warning(s). 复制代码 很顯然的,這些訊息是說有些函數沒有用到。
我是可以當作沒看到,反正沒用到就沒用到;但還是想要把這些警告給解決。
請問我該如何解決?