第12章 應用案例設計_第1頁
第12章 應用案例設計_第2頁
第12章 應用案例設計_第3頁
第12章 應用案例設計_第4頁
第12章 應用案例設計_第5頁
已閱讀5頁,還剩123頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1第第12章章 單片機的各種控制與單片機的各種控制與 檢測應用設計檢測應用設計 介紹各種常用的單片機測控應用設計案例,通過案例使讀介紹各種常用的單片機測控應用設計案例,通過案例使讀者了解單片機系統(tǒng)的的各種常見的應用設計。者了解單片機系統(tǒng)的的各種常見的應用設計。12.1 單片機控制步進電機的設計單片機控制步進電機的設計 步進電機是步進電機是將脈沖信號轉變?yōu)榻俏灰苹蚓€位移的開環(huán)控制將脈沖信號轉變?yōu)榻俏灰苹蚓€位移的開環(huán)控制元件元件。 非超載的情況下,電機轉速、停止位置非超載的情況下,電機轉速、停止位置只取決于脈沖信號只取決于脈沖信號的頻率和脈沖數(shù),而不受負載變化的影響,的頻率和脈沖數(shù),而不受負載變化

2、的影響,給電機加一脈沖信給電機加一脈沖信號,電機則轉過一個步距角。因而步進電機號,電機則轉過一個步距角。因而步進電機只有周期性誤差而只有周期性誤差而無累積誤差無累積誤差,在,在速度、位置速度、位置等控制領域有較為廣泛的應用。等控制領域有較為廣泛的應用。2312.1.1 控制步進電機的工作原理控制步進電機的工作原理 驅動步進電機由單片機通過對每組線圈中的電流的順序切換驅動步進電機由單片機通過對每組線圈中的電流的順序切換來使電機作步進式旋轉,切換是單片機輸出脈沖信號來實現(xiàn)。來使電機作步進式旋轉,切換是單片機輸出脈沖信號來實現(xiàn)。 調節(jié)脈沖信號頻率就可改變步進電機轉速;改變各相脈沖先調節(jié)脈沖信號頻率就

3、可改變步進電機轉速;改變各相脈沖先后順序,就可改變電機旋轉方向。后順序,就可改變電機旋轉方向。 步進電機驅動可采用步進電機驅動可采用雙四拍雙四拍(ABABBCBCCDCDDADAABAB)方式,)方式,也可采用也可采用單四拍單四拍(A AB BC CD DA A)方式。為使步進電機旋轉平)方式。為使步進電機旋轉平穩(wěn),還可采用單、雙八拍方式(穩(wěn),還可采用單、雙八拍方式(A AABABB BBCBCC CCDCDD DDADAA A)。各種工作方式時序)。各種工作方式時序見見圖圖12-112-1。 4 圖圖12-1 各種工作方式時序圖各種工作方式時序圖5 圖圖12-112-1脈沖信號是高電平有效,

4、但實際控制時公共端是接脈沖信號是高電平有效,但實際控制時公共端是接在在VCCVCC上,所以實際控制脈沖是低電平有效。上,所以實際控制脈沖是低電平有效。12.1.2 電路設計與編程電路設計與編程 【例【例12-1】單片機對步進電機控制的原理電路見單片機對步進電機控制的原理電路見圖圖12-1。編。編寫程序,用四路寫程序,用四路I/O口輸出實現(xiàn)環(huán)形脈沖分配,控制步進電機按口輸出實現(xiàn)環(huán)形脈沖分配,控制步進電機按固定方向連續(xù)轉動。同時,通過固定方向連續(xù)轉動。同時,通過“正轉正轉”和和“反轉反轉”兩個按鍵兩個按鍵來控制電機的正轉與反轉。按下來控制電機的正轉與反轉。按下“正轉正轉”按鍵,步進電機正轉按鍵,步

5、進電機正轉;按下;按下“反轉反轉”按鍵,步進電機反轉;松開按鍵,電機停止轉按鍵,步進電機反轉;松開按鍵,電機停止轉動。動。 ULN2003是高耐壓、大電流達林頓陣列系列產品,是高耐壓、大電流達林頓陣列系列產品,7個個NPN達林頓管組成。多用于單片機、智能儀表、達林頓管組成。多用于單片機、智能儀表、PLC等控制電路等控制電路6圖圖12-2 單片機控制步進電機接口電路單片機控制步進電機接口電路7中。在中。在5V5V電壓下能與電壓下能與TTLTTL和和CMOSCMOS電路直接相連電路直接相連, ,可直接驅動繼可直接驅動繼電器等負載。具有電流增益高、工作電壓高、溫度范圍寬、電器等負載。具有電流增益高、

6、工作電壓高、溫度范圍寬、帶負載能力強等特點。帶負載能力強等特點。輸入輸入5V5V的的TTLTTL電平,電平,輸出可達輸出可達500mA/50V500mA/50V。適于各類高速大功率驅動的系統(tǒng)。適于各類高速大功率驅動的系統(tǒng)。參考程序參考程序:#include reg51.h#include reg51.h#define uchar unsigned char#define uchar unsigned char#define uint unsigned int#define uint unsigned int#define out P2#define out P2sbit pos=P00;sbi

7、t pos=P00;/定義檢測正轉控制位定義檢測正轉控制位P0.0P0.0sbit neg=P01;sbit neg=P01;/定義檢測反轉控制位定義檢測反轉控制位P0.1P0.1void delayms(uint);void delayms(uint);8uchar code turn=0 x02,0 x06,0 x04,0 x0c,0 x08,0 x09,0 x01,0 x03;uchar code turn=0 x02,0 x06,0 x04,0 x0c,0 x08,0 x09,0 x01,0 x03; / /步進脈沖數(shù)組步進脈沖數(shù)組void main(void)void main(vo

8、id) uchar i;uchar i;out=0 x03;out=0 x03;while(1)while(1) if(!pos) /if(!pos) /如果正轉按鍵按下如果正轉按鍵按下 i=i 8?i+1: 0; /i=i 8?i+1: 0; /如果如果i8i 0 ? i-1: 7;i = i 0 ? i-1: 7;out=turni;out=turni;delayms(50);delayms(50); void delayms(uint j)void delayms(uint j)/函數(shù)功能:延時函數(shù)功能:延時 uchar i;uchar i;for(;j0;j-)for(;j0;j-)

9、i=250;i=250; while(-i);while(-i); i=249;i=249; while(-i);while(-i); 1012.2 單片機控制直流電機單片機控制直流電機 直流電機多用在直流電機多用在無無交流電源、方便移動場合,具有低速大交流電源、方便移動場合,具有低速大力矩等特點。如何用單片機控制直流電機。力矩等特點。如何用單片機控制直流電機。12.2.1 控制直流電機的工作原理控制直流電機的工作原理 對直流電機可精確控制其對直流電機可精確控制其旋轉速度旋轉速度或或轉矩轉矩,通過兩個磁場,通過兩個磁場相互作用產生旋轉。結構相互作用產生旋轉。結構見見圖圖12-3(a),定子裝設

10、一對直流,定子裝設一對直流勵磁的靜止主磁極勵磁的靜止主磁極N和和S,在轉子上裝設電樞鐵心。定子與轉子,在轉子上裝設電樞鐵心。定子與轉子間有一氣隙。在電樞鐵心上放置了由兩根導體連成的電樞線圈,間有一氣隙。在電樞鐵心上放置了由兩根導體連成的電樞線圈,線圈首端和末端分別連到兩個圓弧形銅片上,此銅片稱為線圈首端和末端分別連到兩個圓弧形銅片上,此銅片稱為換向換向片片。由換向片構成的整體稱為換向器。由換向片構成的整體稱為換向器。11 換向器固定在轉軸上,換向片與轉軸間互相絕緣。在換向換向器固定在轉軸上,換向片與轉軸間互相絕緣。在換向片上放置一對固定不動的電刷片上放置一對固定不動的電刷B1B1和和B2B2,

11、當電樞旋轉時,電樞,當電樞旋轉時,電樞線圈通過換向片和電刷與外電路接通。線圈通過換向片和電刷與外電路接通。 定子通過永磁體或受激勵電磁鐵產生一固定磁場,由于轉定子通過永磁體或受激勵電磁鐵產生一固定磁場,由于轉子由一系列電磁體構成,當電流通過其中一個繞組時會產生子由一系列電磁體構成,當電流通過其中一個繞組時會產生一個磁場。一個磁場。 對有刷直流電機,轉子上換向器和定子電刷在電機旋轉時對有刷直流電機,轉子上換向器和定子電刷在電機旋轉時為每個繞組供給電能。通電轉子繞組與定子磁體有相反極性,為每個繞組供給電能。通電轉子繞組與定子磁體有相反極性,因而相互吸引,使轉子轉動至與定子磁場對準的位置。當轉因而相

12、互吸引,使轉子轉動至與定子磁場對準的位置。當轉子到達對準位置時,電刷通過換向器為下一組繞組供電,從子到達對準位置時,電刷通過換向器為下一組繞組供電,從而使轉子維持旋轉運動而使轉子維持旋轉運動,見,見圖圖12-312-3(b b)。12(a a)有刷直流電機結構示意圖)有刷直流電機結構示意圖(i i)導體)導體adad處于處于N N極下極下 (iiii)導體)導體adad處于處于S S極下極下(b b)有刷直流電機工作示意圖)有刷直流電機工作示意圖圖圖12-312-3 直流電機工作示意圖直流電機工作示意圖 13 直流電機直流電機轉速轉速與施加與施加電壓電壓成正比,成正比,轉矩轉矩與與電流電流成正

13、比。成正比。由于必須在工作期間改變直流電機的速度,直流電機控制是由于必須在工作期間改變直流電機的速度,直流電機控制是一較困難問題。直流電機高效運行的常見方法是施加一個一較困難問題。直流電機高效運行的常見方法是施加一個 PWMPWM(脈寬調制)脈沖波,其占空比對應于所需速度。(脈寬調制)脈沖波,其占空比對應于所需速度。電機電機起到了一個低通濾波器作用,起到了一個低通濾波器作用,PWMPWM信號相對容易產生,這種信號相對容易產生,這種驅動方式使用更為廣泛。驅動方式使用更為廣泛。12.2.2 電路設計與編程電路設計與編程 【例【例12-212-2】原理電路原理電路見見圖圖12-412-4。使用單片機

14、兩個。使用單片機兩個I/OI/O腳控制腳控制直流電機轉速和旋轉方向。其中直流電機轉速和旋轉方向。其中P3.7P3.7腳腳輸出輸出PWMPWM信號控制直流信號控制直流電機轉速;電機轉速;P3.6P3.6腳腳控制直流電機旋轉方向??刂浦绷麟姍C旋轉方向。14圖圖12-412-4 單片機控制直流電機的接口電路單片機控制直流電機的接口電路 當當P3.6=1P3.6=1時,時,P3.7P3.7發(fā)送發(fā)送PWMPWM波,直流電機正轉。且可通過波,直流電機正轉。且可通過“INCINC”和和“DECDEC”兩個按鍵來增大和減少直流電機轉速。反兩個按鍵來增大和減少直流電機轉速。反之,之,P3.6=0P3.6=0時,

15、時,P3.7P3.7發(fā)送發(fā)送PWMPWM信號,直流電機反轉。信號,直流電機反轉。 因此,增大和減小電機轉速,實際上是通過按下因此,增大和減小電機轉速,實際上是通過按下 “INCINC”或或“DECDEC”按鍵來改變輸出按鍵來改變輸出PWMPWM信號占空比,控制直流信號占空比,控制直流電機轉速。圖電機轉速。圖12-412-4中驅動電路使用了中驅動電路使用了NPNNPN低頻、低噪聲小功率低頻、低噪聲小功率達林頓管達林頓管 2SC2547 2SC2547。 參考程序如下:參考程序如下:1516#include reg51.h#include reg51.h#include intrins.h#inc

16、lude intrins.h#define uchar unsigned char#define uchar unsigned char#define uint unsigned int #define uint unsigned int sbit INC=P34;sbit INC=P34;sbit DEC=P35;sbit DEC=P35;sbit DIR=P36;sbit DIR=P36; sbit PWM=P37;sbit PWM=P37;void delay(uint);void delay(uint);int PWM= 900;int PWM= 900;void main(void)

17、void main(void) DIR=1;DIR=1;while(1)while(1) if(!INC)if(!INC)PWM=PWM0 ? PWM-1 : 0;/PWM=PWM0 ? PWM-1 : 0;/如果如果PWM0PWM0,則,則PWM=PWM-1PWM=PWM-1;否則;否則PWM=0PWM=01712.3 電機轉速測量電機轉速測量12.3.1 12.3.1 電機轉速測量的工作原理電機轉速測量的工作原理 用光電管、單片機及用光電管、單片機及LEDLED數(shù)碼管可測量直流電機轉速并顯示。數(shù)碼管可測量直流電機轉速并顯示。 光電對管光電對管,也稱,也稱光電開關光電開關,內部結構就是一發(fā)光

18、二極管和一,內部結構就是一發(fā)光二極管和一個光敏三極管,分為個光敏三極管,分為反射式反射式和和直射式直射式,工作原理都是光電轉化,工作原理都是光電轉化,即通過集聚光線來控制光敏三極管的導通與截止。即通過集聚光線來控制光敏三極管的導通與截止。 因此,測量電機轉速實質是利用光電對管對因此,測量電機轉速實質是利用光電對管對直流電機葉片底直流電機葉片底部的白色小帶部的白色小帶進行檢測,當進行檢測,當檢測到白色小帶時檢測到白色小帶時將產生一個將產生一個脈沖信脈沖信號號。電機轉一圈對應一個脈沖,然后對脈沖信號放大并進行計數(shù),。電機轉一圈對應一個脈沖,然后對脈沖信號放大并進行計數(shù),計算單位時間內測得的脈沖數(shù),

19、也就測出電機轉速,并送計算單位時間內測得的脈沖數(shù),也就測出電機轉速,并送LEDLED數(shù)數(shù)碼管顯示。碼管顯示。1812.3.2 12.3.2 電路設計與編程電路設計與編程 【例【例12-312-3】測量電機轉速電路見測量電機轉速電路見圖圖12-512-5。Z-OPTOCOULER-Z-OPTOCOULER-NPNNPN為光電管,電機旋轉時,使光電管輸出脈沖信號,然后脈為光電管,電機旋轉時,使光電管輸出脈沖信號,然后脈沖信號經(jīng)過放大,并對其計數(shù),經(jīng)計算,把轉速數(shù)據(jù)送到?jīng)_信號經(jīng)過放大,并對其計數(shù),經(jīng)計算,把轉速數(shù)據(jù)送到LEDLED數(shù)碼管顯示。數(shù)碼管顯示。 模擬直流電機轉速脈沖由數(shù)字時鐘發(fā)生器產生,在

20、電路中模擬直流電機轉速脈沖由數(shù)字時鐘發(fā)生器產生,在電路中添加數(shù)字時鐘發(fā)生器方法是,點擊圖添加數(shù)字時鐘發(fā)生器方法是,點擊圖4-2中左側工具箱中的圖中左側工具箱中的圖標標 ,出現(xiàn)選擇菜單,選擇,出現(xiàn)選擇菜單,選擇“DCLOCK”項,然后把其放入原項,然后把其放入原理圖編輯窗口中進行連線。鼠標右鍵單擊理圖編輯窗口中進行連線。鼠標右鍵單擊 “DCLOCK”圖標,圖標,出現(xiàn)屬性設置窗口,選擇出現(xiàn)屬性設置窗口,選擇“數(shù)字類型數(shù)字類型”欄中的欄中的“時鐘時鐘”項,項,在右面的在右面的“時間時間”欄中,手動修改輸出的數(shù)字時鐘脈沖的頻欄中,手動修改輸出的數(shù)字時鐘脈沖的頻率,這相當于改變電機轉速。率,這相當于改變

21、電機轉速。19if(!DEC)if(!DEC)PWM=PWM1000?PWM+1:1000; /PWM=PWM1000?PWM+1:1000; /如如PWM1000PWM0;j-)for(;j0;j-) _nop_();_nop_(); 20圖圖12-5 測量電機轉速的原理電路與仿真測量電機轉速的原理電路與仿真21 仿真運行后,電機轉速(即每秒計得的脈沖數(shù))顯示在仿真運行后,電機轉速(即每秒計得的脈沖數(shù))顯示在LED數(shù)碼管上。在手動設置數(shù)字時鐘頻率時,選擇數(shù)碼管上。在手動設置數(shù)字時鐘頻率時,選擇“600”,經(jīng)過單片機測得的轉數(shù)值(轉數(shù)經(jīng)過單片機測得的轉數(shù)值(轉數(shù)/秒)在數(shù)碼管上顯示,與秒)在數(shù)

22、碼管上顯示,與設置的數(shù)字脈沖頻率相一致。設置的數(shù)字脈沖頻率相一致。參考程序如下。參考程序如下。#include reg51.h#include reg51.h#include intrins.h#include intrins.h#define uchar unsigned char#define uchar unsigned char#define uint unsigned int#define uint unsigned int#define out P0#define out P0uchar code uchar code seg=0 xc0,0 xf9,0 xa4,0 xb0,0 x

23、99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 x01;seg=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 x01;22int i=0;int i=0; void main(void)void main(void) int j;int j;TMOD=0 x15; TMOD=0 x15; / T0/ T0方式方式1 1計數(shù),計數(shù),T1T1方式方式1 1定時定時TH0=0;TH0=0;/ T0/ T0計數(shù)器清零計數(shù)器清零TH1=0 x3C;TH1=0 x3C;/ 12MHz/ 12MHz晶振,晶振

24、,T1T1定時定時50ms50msTL1=0 xB0;TL1=0 xB0;TR0=1;TR0=1;/ / 啟動啟動T0T0計數(shù)器計數(shù)器TR1=1;TR1=1;/ / 啟動啟動T1T1IE=0 x88;IE=0 x88;/ / 允許允許T1T1中斷和總中斷允許中斷和總中斷允許while(1)while(1) P2=0 x00; P2=0 x00; / / 輸出百位顯示值輸出百位顯示值out=segi/100;out=segi/100;P2=0 x02;P2=0 x02;for(j=0;j100;j+);for(j=0;j100;j+);P2=0 x00;P2=0 x00;out=segi%100

25、/10;out=segi%100/10;/ / 輸出十位顯示值輸出十位顯示值23P2=0 x04;P2=0 x04; for(j=0;j100;j+);for(j=0;j100;j+); P2=0 x00;P2=0 x00;out=segi%10;out=segi%10;/ / 輸出個位顯示值輸出個位顯示值P2=0 x08;P2=0 x08;for(j=0;j100;j+);for(j=0;j100;j+); void Timer1_ISR() interrupt 3 / T1void Timer1_ISR() interrupt 3 / T1中斷程序,產生中斷程序,產生50ms 50ms 定

26、時定時 static char j = 0;static char j = 0;TH1=0 x3C;TH1=0 x3C;/ / 重設定時器值,重設定時器值,50ms 50ms 定時,定時,12MHz 12MHz 晶振晶振TL1=0 xB0;TL1=0 xB0;if(+j = 20)if(+j = 20) / / 是否中斷是否中斷2020次,即次,即50ms50ms2020次次 = 1s = 1s j=0;j=0;i=(TH0 8)|TH00;i=(TH0 8)|TH00;/ 1s/ 1s內的計數(shù)值即為電機轉動速度內的計數(shù)值即為電機轉動速度, ,單位:轉單位:轉/ /秒秒TH0=0;TH0=0;

27、 / T0 / T0清零清零TL0=0;TL0=0; 2412.4 頻率計的制作頻率計的制作12.4.1 工作原理工作原理 利用單片機定時器利用單片機定時器/計數(shù)器可實現(xiàn)信號頻率測量。頻率測量計數(shù)器可實現(xiàn)信號頻率測量。頻率測量有有測頻法測頻法和和測周法測周法兩種。兩種。測頻法測頻法利用外部電平變化引發(fā)的外利用外部電平變化引發(fā)的外部中斷,測算部中斷,測算1s內出現(xiàn)的次數(shù),從而實現(xiàn)對頻率測內出現(xiàn)的次數(shù),從而實現(xiàn)對頻率測量量;測周測周法法是通過測算某兩次電平變化引發(fā)的中斷間的時間,再求倒是通過測算某兩次電平變化引發(fā)的中斷間的時間,再求倒數(shù),從而實現(xiàn)對頻率測定。總之,測頻法是直接根據(jù)定義來數(shù),從而實現(xiàn)

28、對頻率測定??傊?,測頻法是直接根據(jù)定義來測定頻率,測周法是通過測定周期間接測定頻率。理論上,測定頻率,測周法是通過測定周期間接測定頻率。理論上,測頻法適于較高頻率測量,測周法適于較低頻率測量。本例測頻法適于較高頻率測量,測周法適于較低頻率測量。本例采用測頻法。采用測頻法。 12.4.2 電路設計與軟件編程電路設計與軟件編程【例【例12-4】設計以單片機為核心的頻率測量裝置,測量加在設計以單片機為核心的頻率測量裝置,測量加在P3.4腳上數(shù)字時鐘信號頻率,并在外部擴展的腳上數(shù)字時鐘信號頻率,并在外部擴展的6位位LED數(shù)碼管上顯示數(shù)碼管上顯示測量頻率值。原理電路與仿真測量頻率值。原理電路與仿真見見圖

29、圖12-6。 本頻率計測量的信號由數(shù)字時鐘源本頻率計測量的信號由數(shù)字時鐘源“DCLOCK”產生,在電產生,在電路中添加數(shù)字時鐘源的具體操作與設置見【例路中添加數(shù)字時鐘源的具體操作與設置見【例12-3】。手動改變】。手動改變被測時鐘信號源頻率,觀察是否與被測時鐘信號源頻率,觀察是否與LED數(shù)碼管上顯示的測量結果數(shù)碼管上顯示的測量結果相同。相同。26圖圖12-6 頻率計原理電路與仿真頻率計原理電路與仿真27參考程序如下。參考程序如下。#include#includesfr16 DPTR=0 x82;sfr16 DPTR=0 x82;/定義寄存器定義寄存器DPTRDPTRunsigned char

30、cnt_t0,cnt_t1,qian,bai,shi,ge,bb,wan,shiwan;unsigned char cnt_t0,cnt_t1,qian,bai,shi,ge,bb,wan,shiwan;unsigned long freq;unsigned long freq;/定義頻率定義頻率unsigned char code table=0 x3f,0 x06,0 x5b,0 x4f, 0 x66,0 x6d, 0 x7d, unsigned char code table=0 x3f,0 x06,0 x5b,0 x4f, 0 x66,0 x6d, 0 x7d, 0 x07, 0 x7

31、f,0 x6f,0 x77,0 x7c, 0 x39,0 x5e,0 x79,0 x71; 0 x07, 0 x7f,0 x6f,0 x77,0 x7c, 0 x39,0 x5e,0 x79,0 x71; / /共陰數(shù)碼管段碼表共陰數(shù)碼管段碼表void delay_1ms(unsigned int z)void delay_1ms(unsigned int z)/函數(shù)功能:延時約函數(shù)功能:延時約1ms1ms unsigned char i,j;unsigned char i,j;for(i=0;iz;i+)for(i=0;iz;i+)for(j=0;j110;j+);for(j=0;jVCC1

32、+0.2VVCC2VCC1+0.2V時,芯片由時,芯片由VCC2VCC2供電;當供電;當VCC2VCC1VCC2VCC1時,芯片時,芯片由由VCC1VCC1供電。供電。l GND GND:地:地l X1 X1,X2X2:接:接32.768KHz32.768KHz晶振引腳。晶振引腳。 單片機與單片機與DS1302DS1302間無數(shù)據(jù)傳輸時,間無數(shù)據(jù)傳輸時,SCLKSCLK保持低電平,此時保持低電平,此時如果如果 從低變?yōu)楦邥r,即啟動數(shù)據(jù)傳輸,此時從低變?yōu)楦邥r,即啟動數(shù)據(jù)傳輸,此時SCLKSCLK的上升沿將的上升沿將數(shù)據(jù)寫入數(shù)據(jù)寫入DS1302DS1302,而在,而在SCLKSCLK的下降沿從的下

33、降沿從DS1302DS1302讀出數(shù)據(jù)。讀出數(shù)據(jù)。 為為低時,則禁止數(shù)據(jù)傳輸?shù)蜁r,則禁止數(shù)據(jù)傳輸, ,讀讀/ /寫時序如圖寫時序如圖12-812-8所示。數(shù)據(jù)傳輸所示。數(shù)據(jù)傳輸時,低位在前,高位在后。時,低位在前,高位在后。2. DS1302的命令字格式的命令字格式 單片機對單片機對DS1302的讀的讀/寫,都必須由單片機先向寫,都必須由單片機先向DS1302寫入一個命令字寫入一個命令字(8位位) 發(fā)起,命令字的格式見發(fā)起,命令字的格式見表表12-1。37圖圖12-8 DS1302讀讀/寫時序寫時序RAM/CKRD/WRAM/CKRD/W命令字各位功能:命令字各位功能:D7:必須為邏輯必須為邏

34、輯1,如為,如為0,則禁止寫入,則禁止寫入DS1302。D6:1讀讀/寫寫RAM數(shù)據(jù),數(shù)據(jù),0讀讀/寫時鐘寫時鐘/日歷數(shù)據(jù)。日歷數(shù)據(jù)。D5D1:為讀為讀/寫單元的地址;寫單元的地址;D0:1對對DS1302讀操作,讀操作,0對對DS1302寫操作。寫操作。 注意,命令字(注意,命令字(8位)總是低位在先,命令字每位)總是低位在先,命令字每1位都是在位都是在SCLK上升沿送出。上升沿送出。383. DS1302的內部寄存器的內部寄存器 片內各時鐘片內各時鐘/日歷寄存器以及其它的功能寄存器見日歷寄存器以及其它的功能寄存器見表表12-2。通過向寄存器寫入命令字實現(xiàn)對通過向寄存器寫入命令字實現(xiàn)對DS1

35、302操作。操作。 例如,如要設置秒寄存器的初始值,需要先寫入命令字例如,如要設置秒寄存器的初始值,需要先寫入命令字80H(見見表表12-2),然后再向秒寄存器寫入初始值;如要讀出某,然后再向秒寄存器寫入初始值;如要讀出某時刻秒值,需要先寫入命令字時刻秒值,需要先寫入命令字81H,然后再從秒寄存器讀取秒,然后再從秒寄存器讀取秒值。值。 表表12-2中各寄存器中各寄存器 “取值范圍取值范圍”1列存放的數(shù)據(jù)均為列存放的數(shù)據(jù)均為BCD碼。碼。39表表12-2 主要寄存器、命令字與取值范圍及各位內容主要寄存器、命令字與取值范圍及各位內容40l CH:時鐘暫停位,:時鐘暫停位,1-振蕩器停止,振蕩器停止

36、,DS1302為低功耗方式;為低功耗方式;0-時鐘開始時鐘開始 工作。工作。l 10SEC:秒的十位數(shù)字,:秒的十位數(shù)字,SEC為秒的個位數(shù)字為秒的個位數(shù)字l 10MIN:分的十位數(shù)字,:分的十位數(shù)字,MIN為分的個位數(shù)字為分的個位數(shù)字l 12/24:12或或24小時方式選擇位小時方式選擇位l AP:小時格式設置位,:小時格式設置位, 0-上午模式(上午模式(AM););1-下午模式下午模式(PM)l 10DATE:日期的十位數(shù)字,:日期的十位數(shù)字,DATE為日期的個位數(shù)字為日期的個位數(shù)字l 10M:月的十位數(shù)字,:月的十位數(shù)字,MONTH為日期的個位數(shù)字為日期的個位數(shù)字l DAY:星期的個位

37、數(shù)字:星期的個位數(shù)字41l10YEAR:年的十位數(shù)字,:年的十位數(shù)字,YEAR為年的十位數(shù)字為年的十位數(shù)字 表表12-2中后中后3個寄存器的功能及特殊位符號的意義說明如下。個寄存器的功能及特殊位符號的意義說明如下。 寫保護寄存器:寫保護寄存器:該寄存器的該寄存器的D7位位WP是寫保護位,其余是寫保護位,其余7位位(D0D6)置為)置為0。在對時鐘。在對時鐘/日歷單元和日歷單元和RAM單元進行寫操作單元進行寫操作前,前,WP必須為必須為0,即允許寫入。當,即允許寫入。當WP為為1時,用來防止對其它時,用來防止對其它寄存器進行寫操作。寄存器進行寫操作。 涓流充電寄存器涓流充電寄存器:慢充電寄存器,

38、用于管理對備用電源的充:慢充電寄存器,用于管理對備用電源的充電。電。TCS:當當4位位TCS=1010時,才允許使用涓流充電寄存器,其他時,才允許使用涓流充電寄存器,其他任何狀態(tài)都將禁止使用涓流充電器。任何狀態(tài)都將禁止使用涓流充電器。DS:兩兩DS位用于選擇連接在位用于選擇連接在VCC2和和VCC1間的二極管數(shù)目。間的二極管數(shù)目。 01-選擇選擇1個二極管;個二極管;10-選擇選擇2個二極管;個二極管; 11或或00-涓流充電器被禁止。涓流充電器被禁止。RS:兩位兩位RS位用于選擇涓流充電器內部在位用于選擇涓流充電器內部在VCC2和和VCC1之間之間的連接電阻。的連接電阻。 RS=01,選擇,

39、選擇R1(2k););RS=10時,選擇時,選擇R2(4k););RS=11時,選擇時,選擇R3(8k););RS=00時,不選擇任何電阻。時,不選擇任何電阻。43 時鐘突發(fā)寄存器:時鐘突發(fā)寄存器:單片機對單片機對DS1302除單字節(jié)數(shù)據(jù)讀除單字節(jié)數(shù)據(jù)讀/寫外,寫外,還可采用突發(fā)方式,即多字節(jié)連續(xù)讀還可采用突發(fā)方式,即多字節(jié)連續(xù)讀/寫。在多字節(jié)連續(xù)讀寫。在多字節(jié)連續(xù)讀/寫寫中,只要對地址為中,只要對地址為3EH的時鐘突發(fā)寄存器進行讀的時鐘突發(fā)寄存器進行讀/寫操作,即寫操作,即把對時鐘把對時鐘/日歷或日歷或RAM單元的讀單元的讀/寫設定為寫設定為多字節(jié)方式多字節(jié)方式。該方式,。該方式,讀讀/寫都

40、開始于地址寫都開始于地址0的的D0位。當多字節(jié)方式寫時鐘位。當多字節(jié)方式寫時鐘/日歷時,日歷時,必須按照數(shù)據(jù)傳送的次序寫入最先的必須按照數(shù)據(jù)傳送的次序寫入最先的8個寄存器;但是以多字個寄存器;但是以多字節(jié)方式寫節(jié)方式寫RAM時,沒有必要寫入所有的時,沒有必要寫入所有的31個字節(jié),每個被寫個字節(jié),每個被寫入的字節(jié)都被傳輸?shù)饺氲淖止?jié)都被傳輸?shù)絉AM,無論,無論31個字節(jié)是否都被寫入。個字節(jié)是否都被寫入。12.5.2 電路設計與編程電路設計與編程44 (2)閏年自動判別。)閏年自動判別。 (3)鍵盤采用動態(tài)掃描方式查詢,參量應能進行增)鍵盤采用動態(tài)掃描方式查詢,參量應能進行增1修改,由修改,由“啟動

41、日期與時間修改啟動日期與時間修改”功能鍵功能鍵k1與與6個參量修改鍵組合來完成個參量修改鍵組合來完成增增1修改。即先按一下修改。即先按一下k1,然后按一下被修改參量鍵,即可使該,然后按一下被修改參量鍵,即可使該參量增參量增1,修改完畢,再按一下,修改完畢,再按一下k1表示修改結束確認。表示修改結束確認。 本例時鐘本例時鐘/日歷原理電路與仿真見圖日歷原理電路與仿真見圖12-9。LCD1602分兩行顯分兩行顯示日歷與時鐘。示日歷與時鐘。45 【例例12-5】制作一個使用時鐘制作一個使用時鐘/日歷芯片日歷芯片DS1302并采用并采用LCD1602顯示的日歷顯示的日歷/時鐘,基本功能如下。時鐘,基本功

42、能如下。(1)顯示)顯示6個參量的內容,個參量的內容,第一行顯示第一行顯示:年、月、日;:年、月、日;第二行第二行顯示:顯示:時、分、秒。時、分、秒。46圖圖12-9 LCD顯示的時鐘顯示的時鐘/日歷原理電路及仿真日歷原理電路及仿真47 圖圖12-912-9的的4 43 3矩陣鍵盤,只用到了其中矩陣鍵盤,只用到了其中2 2行鍵共行鍵共6 6個,個,余下的按鍵,本例未使用,可用于將來鍵盤功能擴展。余下的按鍵,本例未使用,可用于將來鍵盤功能擴展。參考程序如下:參考程序如下:#include#include#include LCD1602.h#include LCD1602.h / /液晶顯示器液晶

43、顯示器LCD1602LCD1602頭文件頭文件#include DS1302.h#include DS1302.h / /時鐘時鐘/ /日歷芯片日歷芯片DS1302DS1302頭文件頭文件#define uchar unsigned char#define uchar unsigned char#define uint unsigned int#define uint unsigned intbit key_flag1=0,key_flag2=0;bit key_flag1=0,key_flag2=0;SYSTEMTIME adjusted;SYSTEMTIME adjusted; / / 此

44、處為結構體定義此處為結構體定義48uchar sec_add=0,min_add=0,hou_add=0;uchar sec_add=0,min_add=0,hou_add=0;uchar day_add=0,mon_add=0,yea_add=0;uchar day_add=0,mon_add=0,yea_add=0;uchar data_alarm7=0;uchar data_alarm7=0;int key_scan() int key_scan() / / 函數(shù)功能:鍵盤掃描,判是否有鍵按下函數(shù)功能:鍵盤掃描,判是否有鍵按下 int i=0;int i=0; uint temp;uin

45、t temp; P1=0 xf0;P1=0 xf0; temp=P1;temp=P1; if(temp!=0 xf0)if(temp!=0 xf0) i=1;i=1; elseelse i=0;i=0; return i;return i; 49uchar key_value()uchar key_value()/函數(shù)功能:獲取按下的按鍵值函數(shù)功能:獲取按下的按鍵值 uint m=0,n=0,temp; uint m=0,n=0,temp; uchar value; uchar value; uchar v43=2,1,0,5,4,3,8,7,6,b,a,9; uchar v43=2,1,0,

46、5,4,3,8,7,6,b,a,9; P1=0 xfe;temp=P1; if(temp!=0 xfe)m=0; P1=0 xfe;temp=P1; if(temp!=0 xfe)m=0;/采用分行、分列掃描的形式獲取按鍵鍵值采用分行、分列掃描的形式獲取按鍵鍵值 P1=0 xfd;temp=P1; if(temp!=0 xfd)m=1;P1=0 xfd;temp=P1; if(temp!=0 xfd)m=1; P1=0 xfb;temp=P1; if(temp!=0 xfb)m=2; P1=0 xfb;temp=P1; if(temp!=0 xfb)m=2; P1=0 xf7;temp=P1;

47、 if(temp!=0 xf7)m=3; P1=0 xf7;temp=P1; if(temp!=0 xf7)m=3; P1=0 xef;temp=P1; if(temp!=0 xef)n=0; P1=0 xef;temp=P1; if(temp!=0 xef)n=0; P1=0 xdf;temp=P1; if(temp!=0 xdf)n=1; P1=0 xdf;temp=P1; if(temp!=0 xdf)n=1; P1=0 xbf;temp=P1; if(temp!=0 xbf)n=2; P1=0 xbf;temp=P1; if(temp!=0 xbf)n=2;50 value=vmn;

48、value=vmn; return value; return value; void adjust(void)void adjust(void)/函數(shù)功能:修改各參量函數(shù)功能:修改各參量 if(key_scan()&key_flag1)if(key_scan()&key_flag1) switch(key_value()switch(key_value() case 0:sec_add+;break;case 0:sec_add+;break; case 1:min_add+;break;case 1:min_add+;break; case 2:hou_add+;break;case 2:

49、hou_add+;break; case 3:day_add+;break;case 3:day_add+;break;case 4:mon_add+;break;case 4:mon_add+;break; case 5:yea_add+;break;case 5:yea_add+;break;51default: break;default: break; adjusted.Second+=sec_add; adjusted.Second+=sec_add; adjusted.Minute+=min_add; adjusted.Minute+=min_add; adjusted.Hour+

50、=hou_add; adjusted.Hour+=hou_add; adjusted.Day+=day_add; adjusted.Day+=day_add; adjusted.Month+=mon_add; adjusted.Month+=mon_add; adjusted.Year+=yea_add; adjusted.Year+=yea_add; if(adjusted.Second59) if(adjusted.Second59) adjusted.Second=adjusted.Second%60;adjusted.Second=adjusted.Second%60; adjuste

51、d.Minute+;adjusted.Minute+; if(adjusted.Minute59)if(adjusted.Minute59) adjusted.Minute=adjusted.Minute%60;adjusted.Minute=adjusted.Minute%60; adjusted.Hour+;adjusted.Hour+; 52if(adjusted.Hour23)if(adjusted.Hour23) adjusted.Hour=adjusted.Hour%24;adjusted.Hour=adjusted.Hour%24; adjusted.Day+;adjusted.

52、Day+; if(adjusted.Day31)if(adjusted.Day31) adjusted.Day=adjusted.Day%31;adjusted.Day=adjusted.Day%31;if(adjusted.Month12)if(adjusted.Month12) adjusted.Month=adjusted.Month%12;adjusted.Month=adjusted.Month%12;if(adjusted.Year100)if(adjusted.Year100) adjusted.Year=adjusted.Year%100;adjusted.Year=adjus

53、ted.Year%100; 53void changing(void) interrupt 0 using 0void changing(void) interrupt 0 using 0/中斷處理函數(shù),修改參量,或修改確認中斷處理函數(shù),修改參量,或修改確認 if(key_flag1)if(key_flag1) key_flag1=0;key_flag1=0; else else key_flag1=1;key_flag1=1; main()main()/主函數(shù)主函數(shù) uint i;uint i; uchar p1=D:,p2=T:;uchar p1=D:,p2=T:; SYSTEMTIME

54、T;SYSTEMTIME T;EA=1;EA=1; EX0=1;EX0=1; IT0=1;IT0=1; EA=1;EA=1;54 EX1=1;EX1=1; IT1=1;IT1=1; init1602();init1602(); Initial_DS1302() ;Initial_DS1302() ;while(1)while(1) write_com(0 x80);write_com(0 x80); write_string(p1,2);write_string(p1,2); write_com(0 xc0);write_com(0 xc0); write_string(p2,2);write

55、_string(p2,2); DS1302_GetTime(&T) ;DS1302_GetTime(&T) ; adjusted.Second=T.Second;adjusted.Second=T.Second; adjusted.Minute=T.Minute;adjusted.Minute=T.Minute;adjusted.Hour=T.Hour;adjusted.Hour=T.Hour;adjusted.Week=T.Week;adjusted.Week=T.Week;55adjusted.Day=T.Day;adjusted.Day=T.Day;adjusted.Month=T.Mo

56、nth;adjusted.Month=T.Month;adjusted.Year=T.Year;adjusted.Year=T.Year;for(i=0;i9;i+)for(i=0;i9;i+) adjusted.DateStringi=T.DateStringi;adjusted.DateStringi=T.DateStringi; adjusted.TimeStringi=T.TimeStringi; adjusted.TimeStringi=T.TimeStringi; adjust();adjust();DateToStr(&adjusted);DateToStr(&adjusted)

57、;TimeToStr(&adjusted);TimeToStr(&adjusted);write_com(0 x82);write_com(0 x82); write_string(adjusted.DateString,8);write_string(adjusted.DateString,8); write_com(0 xc2);write_com(0 xc2); write_string(adjusted.TimeString,8);write_string(adjusted.TimeString,8);delay(10);delay(10); 56 程序中,使用了自行編寫的液晶顯示器程

58、序中,使用了自行編寫的液晶顯示器LCD1602LCD1602的頭文件的頭文件“LCD1602.h”“LCD1602.h”,由于液晶顯示器,由于液晶顯示器LCD1602LCD1602是單片機應用系統(tǒng)是單片機應用系統(tǒng)經(jīng)常用到的器件,因此將其常用到的驅動函數(shù)等函數(shù),寫成經(jīng)常用到的器件,因此將其常用到的驅動函數(shù)等函數(shù),寫成一個頭文件,如果以后在其他項目中也用到一個頭文件,如果以后在其他項目中也用到LCD1602LCD1602,只需將,只需將該頭文件包含進來即可,這樣程序的編寫提供了方便。同理該頭文件包含進來即可,這樣程序的編寫提供了方便。同理涉及對時鐘涉及對時鐘/ /日歷芯片日歷芯片DS1302DS1

59、302的控制,也可自行編寫頭文件的控制,也可自行編寫頭文件“DS1302.h”“DS1302.h”,以后在其他項目中將該頭文件包含進來即可。,以后在其他項目中將該頭文件包含進來即可。上述兩個頭文件清單見上述兩個頭文件清單見附錄附錄1 1與與附錄附錄2 2。12.6 12.6 電話撥號的模擬電話撥號的模擬12.6.1 12.6.1 模擬電話撥號的模擬電話撥號的設計要求設計要求57 設計模擬電話撥號時的狀況,把模擬電話鍵盤撥出的某一電設計模擬電話撥號時的狀況,把模擬電話鍵盤撥出的某一電話號碼,顯示在話號碼,顯示在LCDLCD顯示屏上。電話鍵盤除了顯示屏上。電話鍵盤除了0 09 9的的1010個數(shù)字

60、鍵個數(shù)字鍵外,還有外,還有“* *”鍵用于實現(xiàn)刪除功能,即刪除一位最后輸入的號鍵用于實現(xiàn)刪除功能,即刪除一位最后輸入的號碼;碼;“#”#”鍵用于清除顯示屏上所有的數(shù)字顯示。此外還要求每鍵用于清除顯示屏上所有的數(shù)字顯示。此外還要求每按下一個鍵,發(fā)出聲響,表示按下該鍵。還有按下一個鍵,發(fā)出聲響,表示按下該鍵。還有LCDLCD顯示器,顯示顯示器,顯示所撥的電話號碼。所撥的電話號碼。12.6.2 電路設計與編程電路設計與編程【例例12-612-6】設計一模擬電話撥號時的電話鍵盤及顯示裝置,設計一模擬電話撥號時的電話鍵盤及顯示裝置,把電話鍵盤撥出的電話號碼及其他信息,顯示在把電話鍵盤撥出的電話號碼及其他

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論