關鍵代碼設計說明
公共變量定義及說明
sbit Sel0=P2^0;//
sbit Sel1=P2^1;//
sbit Sel2=P2^2;//位選的三個引腳控制位
uchar show_w1;
uchar show_w2;
uchar show_w3;
uchar show_w4;
uchar show_w5;
uchar show_w6;
uchar show_w7;
uchar show_w8;//show_wi(i=1,2,3,4,……,8)分別是對應左到右的各個數碼管上的顯示的數字
uchar flag;//分頻作用,同時用作位選下標
uchar count;//分頻作用的變量
uchar duanxuan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x40,0x00}; //段選,顯示0-f
uchar weixuan[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; //位選,選擇是0-7中的一個數碼管 **3.2 Init****():完成初始化配置;**
(1)P0和P2口需要設置成推挽模式輸出,以驅動LED數碼管正常顯示。
P2M1=0x00; P2M0=0xff; P0M1=0x00; P0M0=0xff;
(2)TMOD=0x01; //定時器0采用模式1
(3)打開中斷并允許定時器0中斷
EA=1;//打開總中斷
ET0=1;//允許定時器0中斷
TR0=1;//啟動定時器0
(4)設置定時器初始值
TH0=(65535-1000)/256; TL0=(65535-1000)%256;
(5)設置位選位flag初始值為0;
(6)為每個數碼管要顯示的內容賦初值
show_w1=0;
show_w2=1;
show_w3=2;
show_w4=3;
show_w5=4;
show_w6=5;
show_w7=6;
show_w8=7;
void timer0() interrupt 1
當定時器0初始值不斷加一最終溢出時激發的處理方法。
(1) 重設TH0、TL0;
(2) flag加一;如果flag等于8,則賦值flag為0
(3) P0要顯示的值為0
(4) P2為位選結果,下標為flag。
(5) 如果位選為0,則顯示段選下標為show_w1%10對應的數值;如果位選為1,則顯示段選下標為show_w2%10對應的數值,以此類推。由于定時時間為1ms用于處理顯示內容,而下一個1ms很快就會到,因此,雖然實際上并不是同時選通相應的數碼管位,但是由于人眼有時延,因此感覺是同時顯示。
void main()
主體功能,主要用于控制數碼管循環顯示
(1) 調用Init()完成程序初始化;
(2) 單純一個死循環即可
寄存器知識補充說明
MCS51系列的單片機通常有2個16位可編程定時/計數器,即定時器0和1。MCS52系列還有一個定時/計數器2。可編程的意思是指其功能(如工作模式、定時時間、啟動方式等)可由指令來確定和改變。通常都是賦值指令給相關的寄存器。與定時/計數器相關的有兩個特殊功能寄存器(模式控制寄存器TMOD和控制寄存器TCON)。且定時器往往在中斷中使用,以便當時間到了完成相應處理。MCS51單片機定時/計數器工作原理示意圖如圖6所示。
MCS51單片機定時/計數器工作原理示意圖
每個16位定時/寄存器又分別由兩個8位專用寄存器組成。其中TH0、TL0(對應定時器0)、TH1、TL1(對應定時器1),其訪問地址依次為8AH-8DH。它們可單獨訪問,主要用于裝載定時或計數的初始值。
定時/計數器0和1要正常工作,需要先設置好8位模式控制寄存器TMOD(89H)和8位控制寄存器TCON(88H)。TMOD主要用于設定定時/計數器的工作模式;TCON主要用于控制定時/計數器的啟動/停止,保存T0、T1的溢出和中斷標志。當定時器工作在計數方式時,外部事件可通過引腳P34(對應T0)或P35(對應T1)進行輸入。本程序使用的是內部計時及相應處理,不是外部事件激活。
定時計數器工作原理:
16位的定時器/計數器實質上就是一個加1計數器。當定時器/計數器為定時工作方式時,計數器的加1信號由振蕩器的12分頻信號產生;每過一個機器周期,計數器加1,直至計滿溢出為止。因此,定時器的定時時間與系統的振蕩頻率有關。
一個機器周期等于12個振蕩周期,所以計數頻率fcount=1/12osc。如果晶振為12MHz,則計數周期為:T=1/(12×106)Hz×1/12=1μs。這是最短的計數周期。若要延長定時時間,則需要改變定時器的初值,根據初始值需要選擇適當的定時器長度(如8位、13位、16位等)。當定時器/計數器為計數工作方式時,通過引腳T0和T1對外部信號計數,外部脈沖下降沿將觸發計數。若一個機器周期采樣值為1,下一個機器周期采樣值為0,則計數器加1。此后的機器周期S3P1期間,新的計數值裝入計數器。所以檢測一個由1至0的跳變需要兩個機器周期,故外部事件的最高計數頻率為振蕩頻率的1/24。例:如果選用12MHz晶振,則最高計數頻率為0.5MHz。雖然對外部輸入信號的占空比無特殊要求,但為了確保某給定電平在變化前至少被采樣一次,外部計數脈沖的高電平與低電平保持時間均需在一個機器周期以上。
當CPU用軟件給定時器設置了某種工作方式之后,定時器就會按設定的工作方式獨立運行,不再占用CPU的操作時間,除非定時器計滿溢出,才可能中斷CPU當前操作。CPU也可以重新設置定時器工作方式,以改變定時器的操作。
在定時器/計數器開始工作之前,CPU必須將一些命令(稱為控制字)寫入定時/計數器。將工作模式控制字寫入模式控制寄存器,工作狀態字(或相關位)寫入控制寄存器,并給定時/計數器賦初值。
定時器賦初始值計算:
如果需要需要定時為50MS,則計算方式如下:如果晶振是12MHZ,則機器周期為12MHz除以12,就是1MHz,每秒1000000次機器周期,那么50ms就是50000次機器周期。65536-50000=15536(3cb0),TH0=0x3c,TL0=0xb0。1ms就是1000次機器周期。(65536-1000)/256是高位,(65536-1000)%256是低位。
TMOD寄存器的設置依據如圖7所示。
TMOD寄存器設置依據
TCON寄存器的設置依據如圖8所示。
TCON寄存器設置依據
定時/計數器初始化基本流程如圖9所示。
定時/計數器初始化流程
中斷工作原理
中斷的概念: CPU在處理某一事件A時,發生了另一事件B請求CPU迅速去處理(中斷發生);CPU暫時中斷當前的工作,轉去處理事件B(中斷響應和中斷服務);待CPU將事件B處理完畢后,再回到原來事件A被中斷的地方繼續處理事件A(中斷返回),這一過程稱為中斷。MCS51中斷信息如表2所示。
MCS51單片機中斷信息表
與中斷相關的寄存器包括:
① 中斷允許控制寄存器IE:
中斷允許控制寄存器IE
說明:
在用到中斷時,必須要開總中斷EA,即EA=1。
EX0(EX1):外部中斷允許控制位。EX0=1開外部0號中斷,EX0=0關閉外部0號中斷。
ET0(ET1):定時中斷允許控制位。ET0=1,開內部定時器0號中斷;ET0=0關閉定時器中斷0號開關。
ES: 串口中斷允許控制位。ES=1,開串口中斷;ES=0 關閉串口中斷。
② 中斷優先控制寄存器IP
說明:
l PS:串行口中斷優先級控制位。PS=1設定串行口為高優先級中斷;PS=0為低優先級中斷。
l PT1:T1中斷優先級控制位。PT1=1設定定時器T1為高優先級中斷;PT1=0為低優先級中斷。
l 外部中斷1優先級控制位。PX1=1設定定時器外部中斷1為高優先級中斷;PX1=0為低優先級中斷。
l PT0:T0中斷優先級控制位。PT0=1設定定時器T0為高優先級中斷;PT0=0為低優先級中斷。
l PX0:外部中斷0優先級控制位。PX0=1設定定時器外部中斷0為高優先級中斷;PX0=0為低優先級中斷。