版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 1. 基本示例分析基本示例分析 2.單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)單片機(jī)C語(yǔ)言編程與設(shè)計(jì)一、基本示例分析:一、基本示例分析:例例1、LED的控制的控制 使用使用805l的的Port 1連接連接8個(gè)個(gè)LED,以產(chǎn)生跑馬,以產(chǎn)生跑馬燈的效果。連接好電路并且完成程序之后,您將燈的效果。連接好電路并且完成程序之后,您將可以看到可以看到8個(gè)個(gè)LED依次輪流閃爍。依次輪流閃爍。 在這次練習(xí)中,您將學(xué)會(huì)如何使用在這次練習(xí)中,您將學(xué)會(huì)如何使用I/O Port輸輸出數(shù)據(jù),以及如何使用循環(huán)實(shí)現(xiàn)時(shí)間延遲。出數(shù)據(jù),以及如何使用循環(huán)實(shí)現(xiàn)時(shí)間延遲。 電電路路圖圖#include void delay (void)
2、 /* delay 函數(shù)函數(shù) */ unsigned char i,j; /* 這個(gè)函數(shù)執(zhí)行時(shí)間的延遲這個(gè)函數(shù)執(zhí)行時(shí)間的延遲 */ for (i=0;i255;i+) for(j=0;j255;j+) ;void main (void) unsigned char j=0XFE; /*聲明變量聲明變量 j */ while (1) /* 無(wú)窮循環(huán)無(wú)窮循環(huán) */ /*依次讓依次讓LED 0,1,2,3,4,5,6,7閃爍閃爍 */ j=(j1) | 0 x01; if(j=0XFF) j=0XFE; P1 = j; /* 將數(shù)值輸出到將數(shù)值輸出到Port1,控制,控制LED亮或滅亮或滅 */ d
3、elay(); /* 調(diào)用調(diào)用 delay 函數(shù)函數(shù)*/ 例例2、指、指撥開(kāi)關(guān)的輸入撥開(kāi)關(guān)的輸入 目的是使用目的是使用8051的的Port l連接到連接到8個(gè)個(gè)LED,Port 2則連接到則連接到1個(gè)指撥開(kāi)關(guān),當(dāng)用戶(hù)撥動(dòng)指撥開(kāi)關(guān)時(shí),相個(gè)指撥開(kāi)關(guān),當(dāng)用戶(hù)撥動(dòng)指撥開(kāi)關(guān)時(shí),相對(duì)應(yīng)的對(duì)應(yīng)的LED就會(huì)亮或滅。就會(huì)亮或滅。 在這次練習(xí)中,您將學(xué)會(huì)如何使用在這次練習(xí)中,您將學(xué)會(huì)如何使用8051輸入數(shù)輸入數(shù)據(jù)。據(jù)。 例如,您要從例如,您要從Port 2Port 2輸入數(shù)據(jù)給變量輸入數(shù)據(jù)給變量temptemp時(shí),時(shí),可以執(zhí)行可以執(zhí)行temp=P2temp=P2; 電電路路圖圖 #include void del
4、ay (void) /* delay 函數(shù)函數(shù)*/ unsigned char i,j; /*這個(gè)函數(shù)執(zhí)行時(shí)間的延遲這個(gè)函數(shù)執(zhí)行時(shí)間的延遲 */ for (i=0;i255;i+) for(j=0;j255;j+); void main (void) unsigned char temp; /* 聲明變量聲明變量temp */ while (1) /* 無(wú)窮循環(huán)無(wú)窮循環(huán) */ temp=P2; /* 將將P2輸入的數(shù)據(jù)直接放入變量輸入的數(shù)據(jù)直接放入變量temp當(dāng)中當(dāng)中 */ P1=temp; /* 將變量將變量temp中的數(shù)據(jù)直接輸出到中的數(shù)據(jù)直接輸出到Port 1*/ delay(); 例例
5、3、七段顯示器的控制七段顯示器的控制 目的是使用目的是使用8051的的Port 1連接到一個(gè)共陽(yáng)的七連接到一個(gè)共陽(yáng)的七段顯示器,然后讓段顯示器,然后讓8051輪流顯示輪流顯示09。當(dāng)您連接好。當(dāng)您連接好電路,并且完成程序之后,您將看到七段顯示器電路,并且完成程序之后,您將看到七段顯示器依次顯示依次顯示09。 在這次練習(xí)中,您將學(xué)會(huì)如何使用在這次練習(xí)中,您將學(xué)會(huì)如何使用805l控制共控制共陽(yáng)七段顯示器的顯示。陽(yáng)七段顯示器的顯示。 一個(gè)共陽(yáng)七段顯示器的外觀(guān)和引腳如圖所示。一個(gè)共陽(yáng)七段顯示器的外觀(guān)和引腳如圖所示。這個(gè)共陽(yáng)七段顯示器的引腳分別連接到這個(gè)共陽(yáng)七段顯示器的引腳分別連接到805l的的Port
6、 l引腳。引腳。 電電路路圖圖#include code seven_seg10=0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90;void delay (void) /* 時(shí)間延遲的函數(shù)時(shí)間延遲的函數(shù) */ unsigned char i,j; for (i=0;i255;i+) for(j=0;j255;j+) ;void main (void) unsigned char i; /* 變量變量 i 用來(lái)儲(chǔ)存用來(lái)儲(chǔ)存 09 */ while (1) /* 無(wú)窮循環(huán)無(wú)窮循環(huán) */ for (i=0; i10; i+) P1
7、= seven_segi; /* 輸出輸出 09 到共陽(yáng)七段顯示器到共陽(yáng)七段顯示器*/ delay(); /* 調(diào)用時(shí)間延遲函數(shù)調(diào)用時(shí)間延遲函數(shù)delay*/ 共陽(yáng)七段顯示器有一共同接點(diǎn)連接到共陽(yáng)七段顯示器有一共同接點(diǎn)連接到5V5V,其余的七支引,其余的七支引腳分別如圖所示腳分別如圖所示 因此如果要讓所指定的因此如果要讓所指定的LED發(fā)光時(shí),就必須輸出發(fā)光時(shí),就必須輸出0,反之則輸出反之則輸出1,所以我們可以用下,所以我們可以用下表排列出所要顯示字符表排列出所要顯示字符和必須輸出的信號(hào)。下表中,假設(shè)和必須輸出的信號(hào)。下表中,假設(shè)dotdot點(diǎn)接在最高位,而點(diǎn)接在最高位,而且不點(diǎn)亮,且不點(diǎn)亮,所
8、以一直都是所以一直都是1 1 。 將以上的信息編成將以上的信息編成16進(jìn)制碼,然后存放在定義為進(jìn)制碼,然后存放在定義為seven_ seg的數(shù)組中。的數(shù)組中。 我們將共陽(yáng)七段顯示器顯示出我們將共陽(yáng)七段顯示器顯示出09的字型碼儲(chǔ)存在程序的字型碼儲(chǔ)存在程序存儲(chǔ)器中。當(dāng)用戶(hù)有固定不變的數(shù)據(jù)時(shí),就可以?xún)?chǔ)存在程序存儲(chǔ)器中。當(dāng)用戶(hù)有固定不變的數(shù)據(jù)時(shí),就可以?xún)?chǔ)存在程序存儲(chǔ)器中。儲(chǔ)存在程序存儲(chǔ)器的數(shù)據(jù)必須存聲明的變景附加存儲(chǔ)器中。儲(chǔ)存在程序存儲(chǔ)器的數(shù)據(jù)必須存聲明的變景附加上上codecode,如以下的聲明方式:,如以下的聲明方式:code seven_seg10=0XC0, 0XF9, 0XA4, 0XB0,
9、 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90;例例4、計(jì)時(shí)器、計(jì)時(shí)器Timer0 的溢出中斷控制的溢出中斷控制 在前面,我們?cè)?jīng)捉到過(guò)使用在前面,我們?cè)?jīng)捉到過(guò)使用for循環(huán)實(shí)現(xiàn)時(shí)間延循環(huán)實(shí)現(xiàn)時(shí)間延遲并不是很精確,例如,程序會(huì)受到中斷的執(zhí)行而影響遲并不是很精確,例如,程序會(huì)受到中斷的執(zhí)行而影響延遲時(shí)間。在這次實(shí)習(xí)中,您將學(xué)會(huì)如何使用延遲時(shí)間。在這次實(shí)習(xí)中,您將學(xué)會(huì)如何使用8051的的Timer0計(jì)時(shí)器溢出中斷實(shí)現(xiàn)準(zhǔn)確的時(shí)間延遲。計(jì)時(shí)器溢出中斷實(shí)現(xiàn)準(zhǔn)確的時(shí)間延遲。 本本練習(xí)練習(xí)使用使用8051的的Port 1連接到一個(gè)共陽(yáng)七段顯示連接到一個(gè)共陽(yáng)七段顯示器,然后利用計(jì)時(shí)計(jì)
10、數(shù)器器,然后利用計(jì)時(shí)計(jì)數(shù)器Timer l,讓?zhuān)?051在指定的時(shí)在指定的時(shí)間間隔內(nèi)顯示出間間隔內(nèi)顯示出09。當(dāng)您連接好電路,并且完成程序。當(dāng)您連接好電路,并且完成程序之后,您將可以看到七段顯示器依次顯示之后,您將可以看到七段顯示器依次顯示0 9。#include #define TIMER0_COUNT 0 xEE11 const seven_seg10=0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90;unsigned char timer0_tick,i=0;static void timer0_isr(void) in
11、terrupt TF0_VECTOR using 1 TR0=0; TL0=(TIMER0_COUNT & 0 x00FF); TH0=(TIMER0_COUNT 8); TR0=1; timer0_tick+; if (timer0_tick=200) i+; if(i=10) i=0; timer0_tick=0; P1=seven_segi; static void timer0_initialize(void) EA=0; /* 設(shè)定系統(tǒng)不接受所有的中斷設(shè)定系統(tǒng)不接受所有的中斷 */ timer0_tick=0; TR0=0; /* 關(guān)閉關(guān)閉Timer0 */ TMOD =0 x01;
12、 /* 設(shè)定計(jì)時(shí)器設(shè)定計(jì)時(shí)器0為為16位的工作模式位的工作模式 */ TL0=(TIMER0_COUNT & 0 x00FF); /* 設(shè)定設(shè)定TL0的數(shù)值的數(shù)值 */ TH0=(TIMER0_COUNT 8); /* 設(shè)定設(shè)定TH0的數(shù)值的數(shù)值 */ PT0=0; /* 設(shè)定計(jì)時(shí)器設(shè)定計(jì)時(shí)器0有比較高的優(yōu)先級(jí)有比較高的優(yōu)先級(jí) */ ET0=1; /* 設(shè)定接受設(shè)定接受Timer0的中斷的中斷 */ TR0=1; /* 啟動(dòng)啟動(dòng)Timer0 */ EA=1; /* 設(shè)定系統(tǒng)接受中斷設(shè)定系統(tǒng)接受中斷 */void main (void) timer0_initialize(); while (1
13、); /* 無(wú)窮循環(huán)無(wú)窮循環(huán)*/ 使用計(jì)時(shí)計(jì)數(shù)器使用計(jì)時(shí)計(jì)數(shù)器Timer0之前,必須先執(zhí)行之前,必須先執(zhí)行Timer0的初的初始化功能。始化功能。Timer0初始化按照以下的步驟:初始化按照以下的步驟: (1)先暫停接受所有的中斷。先暫停接受所有的中斷。 (2)關(guān)閉關(guān)閉Timer0。 (3)設(shè)置計(jì)時(shí)器設(shè)置計(jì)時(shí)器0的工作模式。的工作模式。 (4)設(shè)置計(jì)時(shí)器設(shè)置計(jì)時(shí)器0的計(jì)數(shù)器數(shù)值的計(jì)數(shù)器數(shù)值(TL0和和TH0數(shù)值數(shù)值)。 (5)設(shè)置計(jì)時(shí)器設(shè)置計(jì)時(shí)器0有比較高的優(yōu)先級(jí)有比較高的優(yōu)先級(jí)(這一個(gè)步驟可以省略這一個(gè)步驟可以省略)。 (6)設(shè)置接受設(shè)置接受Timer0的中斷。的中斷。 (7)啟動(dòng)啟動(dòng)Tim
14、er0。 (8)(8)設(shè)置系統(tǒng)接受中斷。設(shè)置系統(tǒng)接受中斷。 中斷定時(shí)時(shí)間計(jì)算:中斷定時(shí)時(shí)間計(jì)算: 如果外接石英晶體的頻率是如果外接石英晶體的頻率是12MHz時(shí),因?yàn)闀r(shí),因?yàn)?051的一個(gè)機(jī)械周期需要的一個(gè)機(jī)械周期需要12個(gè)石英晶體的振蕩周期,個(gè)石英晶體的振蕩周期,所以每秒就有所以每秒就有1000 000次的機(jī)械周期,換言之機(jī)械次的機(jī)械周期,換言之機(jī)械周期是周期是1us。如果我們希望。如果我們希望Timer0每秒中斷每秒中斷200次,次,那么我們就必須讓那么我們就必須讓Timer0每數(shù)每數(shù)5 000次就中斷次就中斷1次次(1 000 000/200=5000)。因?yàn)椤R驗(yàn)門(mén)imer0的溢出中斷是
15、的溢出中斷是Timer0數(shù)到數(shù)到65536(16進(jìn)制表示時(shí)是進(jìn)制表示時(shí)是10000H)就產(chǎn)生中就產(chǎn)生中斷,因此要讓斷,因此要讓Timer0數(shù)數(shù)5 000次就中斷次就中斷1次時(shí)就必須次時(shí)就必須設(shè)置設(shè)置Timer0等于等于10000H-(12000000(12200),也就是也就是0 xEE11。接下來(lái)我們可以利用以下的指令分。接下來(lái)我們可以利用以下的指令分別設(shè)置別設(shè)置Timer0計(jì)數(shù)器的低計(jì)數(shù)器的低8位和位和Timer0的高的高8位。位。 TL0=(TIMER0_COUNT & 0 x00FF); /* 設(shè)定設(shè)定TL0的數(shù)值的數(shù)值 */TH0=(TIMER0_COUNT 8); /* 設(shè)定設(shè)定T
16、H0的數(shù)值的數(shù)值 */Timer0的溢出中斷服務(wù)程序格式如下所示:的溢出中斷服務(wù)程序格式如下所示: static void timer0_isr(void) interrupt TF0_VECTOR using 1 加入中斷之后必須處理的程序加入中斷之后必須處理的程序 其中其中TF0 VECTOR是定義在文件是定義在文件regx51.h中的常量,中的常量,其數(shù)值是其數(shù)值是1,這是因?yàn)?,這是因?yàn)門(mén)imer0的中斷向量是的中斷向量是1。 TF0_VECTOR后面所接的后面所接的using 1,表示進(jìn)入,表示進(jìn)入Timer0的溢出中斷服務(wù)程序之后會(huì)使用寄存器組的溢出中斷服務(wù)程序之后會(huì)使用寄存器組1(
17、Register Bank 1),而離開(kāi),而離開(kāi)Timer0的溢出中斷服務(wù)程序時(shí)編譯器也的溢出中斷服務(wù)程序時(shí)編譯器也會(huì)自動(dòng)恢復(fù)使用原先的寄存器組會(huì)自動(dòng)恢復(fù)使用原先的寄存器組 8051中有中有4個(gè)寄存器組,分別是寄存器組個(gè)寄存器組,分別是寄存器組0到寄存到寄存器組器組3,當(dāng),當(dāng)8051開(kāi)始執(zhí)行時(shí)會(huì)自動(dòng)采用寄存器組開(kāi)始執(zhí)行時(shí)會(huì)自動(dòng)采用寄存器組0。 進(jìn)入中斷服務(wù)程序時(shí)采用不同的寄存器組,可以進(jìn)入中斷服務(wù)程序時(shí)采用不同的寄存器組,可以避免破壞原先尚未進(jìn)入避免破壞原先尚未進(jìn)入Timer0溢出中斷服務(wù)程序時(shí)所溢出中斷服務(wù)程序時(shí)所使用的寄存器內(nèi)容。使用的寄存器內(nèi)容。 用戶(hù)當(dāng)然也可以采用原先的寄存器,但是此時(shí)
18、就用戶(hù)當(dāng)然也可以采用原先的寄存器,但是此時(shí)就必須維護(hù)寄存器的內(nèi)容,一般足存進(jìn)入中斷服務(wù)程序必須維護(hù)寄存器的內(nèi)容,一般足存進(jìn)入中斷服務(wù)程序前先將使用到的寄存器放入堆棧中,等到要離開(kāi)之后前先將使用到的寄存器放入堆棧中,等到要離開(kāi)之后冉重新由堆棧取出,并恢復(fù)原先的數(shù)值,這種做法在冉重新由堆棧取出,并恢復(fù)原先的數(shù)值,這種做法在維護(hù)管理上要小心。維護(hù)管理上要小心。 例例5、外部中斷、外部中斷 INT0 本實(shí)驗(yàn)使用本實(shí)驗(yàn)使用AT89S51的的Port 1連接到連接到8顆顆LED,Port 1在正常狀況下會(huì)輸出跑馬燈,然后通過(guò)用戶(hù)在正常狀況下會(huì)輸出跑馬燈,然后通過(guò)用戶(hù)觸動(dòng)外部的硬件來(lái)中斷觸動(dòng)外部的硬件來(lái)中斷
19、INT0,當(dāng),當(dāng)INT0引腳有低電引腳有低電位的脈沖出現(xiàn)時(shí),位的脈沖出現(xiàn)時(shí),8個(gè)個(gè)LED會(huì)一閃一滅會(huì)一閃一滅4次。次。 在這次練習(xí)中,您將學(xué)會(huì)如何使用外部中斷在這次練習(xí)中,您將學(xué)會(huì)如何使用外部中斷INT0。 電電路路圖圖#include void delay (void) /* delay 函數(shù)函數(shù) */ unsigned char i,j; /* 這個(gè)函數(shù)執(zhí)行時(shí)間的延遲這個(gè)函數(shù)執(zhí)行時(shí)間的延遲 */ for (i=0;i255;i+) for(j=0;j255;j+) ;void delay_4isr (void) /* delay_4isr 函數(shù)函數(shù) */ unsigned char i,j
20、; /* 這個(gè)函數(shù)執(zhí)行時(shí)間的延遲這個(gè)函數(shù)執(zhí)行時(shí)間的延遲 */ for (i=0;i255;i+) for(j=0;j255;j+) ;static void xint0_isr(void) interrupt IE0_VECTOR unsigned char i,j=0XFF; /* 變量變量 j */ for(i=0;i16;i+) j=j; P1 = j; /* 將數(shù)值輸出到將數(shù)值輸出到 LED 輸出端口輸出端口 */ delay_4isr (); void main (void) unsigned char j=0XFF; /* 變量變量 j */ EA=0; /* 設(shè)定系統(tǒng)不接受所有的
21、中斷設(shè)定系統(tǒng)不接受所有的中斷 */ EX0=1; /* 設(shè)定接受設(shè)定接受INT0的中斷的中斷 */ PX0=1; EA=1; /* 設(shè)定系統(tǒng)接受中斷設(shè)定系統(tǒng)接受中斷 */ while (1) /* 無(wú)窮循環(huán)無(wú)窮循環(huán) */ /* 依次讓依次讓LED 0,1,2,3,4,5,6,7閃爍閃爍 */ j=(j1) | 0 x01; if(j=0XFF) j=0XFE; P1 = j; /* 將數(shù)值輸出到將數(shù)值輸出到 LED 輸出端口輸出端口 */ delay(); /* 調(diào)用調(diào)用 delay 函數(shù)函數(shù)*/ 例例6、按鈕檢測(cè)1 目的是使用目的是使用805 1的的PORT 2連接到一個(gè)彈跳式連接到一個(gè)彈跳
22、式按鈕作為輸入,按鈕作為輸入,PORT 1則連接到則連接到1個(gè)共陽(yáng)七段顯示個(gè)共陽(yáng)七段顯示器。程序執(zhí)行時(shí),共陽(yáng)七段顯示器會(huì)先顯示器。程序執(zhí)行時(shí),共陽(yáng)七段顯示器會(huì)先顯示0,之,之后當(dāng)用戶(hù)每按一次彈跳按鈕,共陽(yáng)七段顯示器所顯后當(dāng)用戶(hù)每按一次彈跳按鈕,共陽(yáng)七段顯示器所顯示的數(shù)字就會(huì)加示的數(shù)字就會(huì)加1,直到,直到9之后又會(huì)恢復(fù)到之后又會(huì)恢復(fù)到0。 電電路路圖圖#include #define TRUE 1#define FALSE 0code seven_seg10=0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90;void delay
23、 (void) /* wait function */ unsigned char i,j; /* only to delay for LED flashes */ for (i=0;i96;i+) for(j=0;j255;j+) ; / 函數(shù)函數(shù) keypressed 檢查是否有按鍵按下檢查是否有按鍵按下 int keypressed() do while (P2_0=1); delay(); if(P2_0=0) delay(); if (P2_0=0) return TRUE; while(1);void main (void) int c; P1=seven_segc; do if
24、( keypressed() ) c+; if(c=10) c=0; P1=seven_segc; while(1); 在這一個(gè)程序中,我們寫(xiě)了一個(gè)判斷按鈕是否在這一個(gè)程序中,我們寫(xiě)了一個(gè)判斷按鈕是否被按下的函數(shù)被按下的函數(shù)keypressed,這一個(gè)函數(shù)在用戶(hù)按下,這一個(gè)函數(shù)在用戶(hù)按下按鈕時(shí)就返回按鈕時(shí)就返回TRUE(1)。 因?yàn)榘聪掳粹o時(shí),必須消除按鈕彈起的時(shí)間,因?yàn)榘聪掳粹o時(shí),必須消除按鈕彈起的時(shí)間,因此當(dāng)程序檢測(cè)到按鈕事件時(shí)因此當(dāng)程序檢測(cè)到按鈕事件時(shí)(P2 0等于等于0時(shí)時(shí)),必須,必須延遲一段時(shí)問(wèn)之后再檢查延遲一段時(shí)問(wèn)之后再檢查P2_0是否還是是否還是0,如果還,如果還是是0,就表示
25、按鈕確實(shí)被按下,否則就表示只是無(wú)效,就表示按鈕確實(shí)被按下,否則就表示只是無(wú)效信息而已。根據(jù)這個(gè)原理,所以設(shè)計(jì)出函數(shù)信息而已。根據(jù)這個(gè)原理,所以設(shè)計(jì)出函數(shù)keypressed的流程圖,如圖所示。的流程圖,如圖所示。例例7、按鈕檢測(cè)2 上一節(jié)的按鈕檢測(cè)程序中,消除彈起的時(shí)間是利用上一節(jié)的按鈕檢測(cè)程序中,消除彈起的時(shí)間是利用循環(huán)來(lái)延長(zhǎng)一段時(shí)間之后,然后再檢查按鈕,這種做法循環(huán)來(lái)延長(zhǎng)一段時(shí)間之后,然后再檢查按鈕,這種做法雖然可以消除彈起時(shí)間,但是卻也造成循環(huán)執(zhí)行時(shí)其他雖然可以消除彈起時(shí)間,但是卻也造成循環(huán)執(zhí)行時(shí)其他工作無(wú)法進(jìn)行的缺點(diǎn),所以在這一節(jié)中,我們把時(shí)間延工作無(wú)法進(jìn)行的缺點(diǎn),所以在這一節(jié)中,我們
26、把時(shí)間延遲的部分交給遲的部分交給Timer0來(lái)處理,如此一來(lái),就可以讓來(lái)處理,如此一來(lái),就可以讓CPU處理其他事情了。處理其他事情了。 本本練習(xí)練習(xí)使用使用8051的的PORT 2連接到連接到2個(gè)彈跳式按鈕作個(gè)彈跳式按鈕作為輸入,其中一個(gè)是上數(shù)的彈跳按鈕,另一個(gè)則是下數(shù)為輸入,其中一個(gè)是上數(shù)的彈跳按鈕,另一個(gè)則是下數(shù)的彈跳按鈕。的彈跳按鈕。PORT l則連接到則連接到1個(gè)共陽(yáng)七段顯示器。程個(gè)共陽(yáng)七段顯示器。程序執(zhí)行時(shí),共陽(yáng)七段顯示器會(huì)先顯示出序執(zhí)行時(shí),共陽(yáng)七段顯示器會(huì)先顯示出0,之后每當(dāng)用,之后每當(dāng)用戶(hù)單擊一次上數(shù)的彈跳按鈕,共陽(yáng)七段顯示器所顯示的戶(hù)單擊一次上數(shù)的彈跳按鈕,共陽(yáng)七段顯示器所顯示
27、的數(shù)字就會(huì)加數(shù)字就會(huì)加1,直到,直到9之后又會(huì)恢復(fù)到之后又會(huì)恢復(fù)到0。而每當(dāng)用戶(hù)按。而每當(dāng)用戶(hù)按一次下數(shù)的彈跳按鈕,共陽(yáng)七段顯示器所顯示的數(shù)字就一次下數(shù)的彈跳按鈕,共陽(yáng)七段顯示器所顯示的數(shù)字就會(huì)減會(huì)減1,直到,直到0之后又會(huì)恢復(fù)到之后又會(huì)恢復(fù)到9。 電電路路圖圖#include #define TIMER0_COUNT 0XEE11 #define TRUE 1#define FALSE 0#define TIMES 25code seven_seg10=0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90;int c, ups,
28、 downs;static void timer0_initialize(void) EA=0; TR0=0; TMOD &= 0XF0; TMOD |=0 x01; TL0=(TIMER0_COUNT & 0 x00FF); TH0=(TIMER0_COUNT 8); PT0=0; ET0=1; TR0=1; EA=1;void main (void) c=0; ups=0; downs=0; timer0_initialize(); P1=seven_segc; while(1);/ 函數(shù)函數(shù) timer0_isr 檢查是否有按鍵按下檢查是否有按鍵按下 static void timer0
29、_isr(void) interrupt TF0_VECTOR using 1 TR0=0; TL0=(TIMER0_COUNT & 0 x00FF); TH0=(TIMER0_COUNT 8); TR0=1; if (ups !=0) /檢查檢查ups等于等于0嗎?嗎? ups-; /如果如果ups不等于不等于0,就將,就將ups減減1 if (ups=0 & P2_0=0) /如果如果ups減到減到0,就檢查就檢查P2_0=0 c+; / 如果如果P2_0是是0就表示上數(shù)的彈跳按鈕被按下,所以就表示上數(shù)的彈跳按鈕被按下,所以c加加1 if(c=10) c=0; /如果如果c加到加到10,就
30、將就將c恢復(fù)為恢復(fù)為0 else if (P2_0=0) ups=TIMES; /如果如果ups=0且且P2_0=0就將就將ups設(shè)為設(shè)為25 if (downs !=0) /檢查檢查downs等于等于0嗎?嗎? downs-; /如果如果downs不等于不等于0,就將,就將downs減減1 if (downs=0 & P2_1=0) /如果如果downs 減到減到0,就檢查就檢查P2_1=0 c-; / 如果如果P2_1是是0就表示下數(shù)的彈跳按鈕被按下,所以就表示下數(shù)的彈跳按鈕被按下,所以c減減1 if(c=-1) c=9; /如果如果c減到減到-1時(shí)時(shí),就將就將c恢復(fù)為恢復(fù)為10 else
31、 if (P2_1=0) downs=TIMES; /如果如果downs=0且且 P2_1 =0 /就將就將downs設(shè)為設(shè)為25 P1=seven_segc; 如何計(jì)程序可以使用如何計(jì)程序可以使用Timer0延遲一段時(shí)間呢延遲一段時(shí)間呢?在此在此我們利用變量我們利用變量ups,當(dāng)?shù)谝淮螜z查到,當(dāng)?shù)谝淮螜z查到P2_0等于等于0時(shí)就設(shè)時(shí)就設(shè)置置ups=25,然后每一次,然后每一次Timer0中斷之后,就將中斷之后,就將ups減減1,直到直到0為止,剛好經(jīng)歷為止,剛好經(jīng)歷25/200秒,接下來(lái)再檢查秒,接下來(lái)再檢查P2_0是是否依然等于否依然等于0,就可以判斷上數(shù)的彈跳按鈕是否,就可以判斷上數(shù)的彈
32、跳按鈕是否被單擊。被單擊。程序部分如下所示:程序部分如下所示: if (ups !=0) /檢查檢查ups等于等于0嗎?嗎? ups-; /如果如果ups不等于不等于0,就將,就將ups減減1 if (ups=0 & P2_0=0) /如果如果ups減到減到0,就檢查就檢查P2_0=0 c+; / 如果如果P2_0是是0就表示上數(shù)的彈跳按鈕被按下,所以就表示上數(shù)的彈跳按鈕被按下,所以c加加1 if(c=10) c=0; /如果如果c加到加到10,就將就將c恢復(fù)為恢復(fù)為0 else if (P2_0=0) ups=TIMES; /如果如果ups=0且且P2_0=0就將就將ups設(shè)為設(shè)為25例例8
33、、四個(gè)七段顯示器的顯示控制 本本練習(xí)練習(xí)使用使用805 l的的Port 1連接到四個(gè)七段顯示器。連接到四個(gè)七段顯示器。這四個(gè)共陽(yáng)七段顯示器的這四個(gè)共陽(yáng)七段顯示器的a、b、c、d、e、f和和 g全部都全部都連接在一起,因此連接在一起,因此PORT 1所輸出的數(shù)據(jù)按理說(shuō)應(yīng)該會(huì)在所輸出的數(shù)據(jù)按理說(shuō)應(yīng)該會(huì)在四個(gè)共陽(yáng)七段顯示器都顯示出來(lái)。但足我們利用四個(gè)共陽(yáng)七段顯示器都顯示出來(lái)。但足我們利用PORT 0的低的低4位分別控制這四個(gè)共陽(yáng)七段顯示器,讓四個(gè)共陽(yáng)位分別控制這四個(gè)共陽(yáng)七段顯示器,讓四個(gè)共陽(yáng)七段顯示器使用掃描的方式輪流顯示數(shù)字,因此七段顯示器使用掃描的方式輪流顯示數(shù)字,因此PORT 1每一次輸出的數(shù)
34、據(jù)恰好只會(huì)在其中一個(gè)共陽(yáng)七段顯示器每一次輸出的數(shù)據(jù)恰好只會(huì)在其中一個(gè)共陽(yáng)七段顯示器顯示數(shù)字。當(dāng)您連接好電路,并且完成程序之后,您將顯示數(shù)字。當(dāng)您連接好電路,并且完成程序之后,您將可以看到這四個(gè)七段顯示器上顯示可以看到這四個(gè)七段顯示器上顯示09999。在這次實(shí)習(xí)。在這次實(shí)習(xí)中,您將學(xué)會(huì)如何使用輪流驅(qū)動(dòng)的方式,讓四中,您將學(xué)會(huì)如何使用輪流驅(qū)動(dòng)的方式,讓四個(gè)共陽(yáng)七個(gè)共陽(yáng)七段顯示器輪流顯示數(shù)字。段顯示器輪流顯示數(shù)字。 電電路路圖圖程序描述:說(shuō)明如何使用程序描述:說(shuō)明如何使用8051 的的Port 1連接到四顆七段顯示器,連接到四顆七段顯示器,PORT 0的低的低4位分別控制這四顆共陽(yáng)七段顯示器,讓四顆
35、共陽(yáng)位分別控制這四顆共陽(yáng)七段顯示器,讓四顆共陽(yáng)七段顯示器使用掃描的方式輪流顯示數(shù)字。七段顯示器使用掃描的方式輪流顯示數(shù)字。 這四顆七段顯示器將顯示這四顆七段顯示器將顯示0到到 9999。#include #define TIMER0_COUNT 0 xFC18 code seven_seg10=0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90;code scan4=0X0E, 0X0D, 0X0B, 0X07;unsigned char counter4=0,0,0,0;unsigned char i=0;int timer0
36、_tick;static void timer0_initialize(void) EA=0; timer0_tick=0; TR0=0; TMOD &= 0XF0; TMOD |=0 x01; TL0=(TIMER0_COUNT & 0 x00FF); TH0=(TIMER0_COUNT 8); PT0=0; ET0=1; TR0=1; EA=1;void main (void) timer0_initialize(); while (1); /* 無(wú)窮循環(huán)無(wú)窮循環(huán) */static void timer0_isr(void) interrupt TF0_VECTOR using 1 TR0
37、=0; TL0=(TIMER0_COUNT & 0 x00FF); TH0=(TIMER0_COUNT 8); TR0=1; P1=seven_segcounteri; P0=scani; i+; if(i=4) i=0; timer0_tick+; if (timer0_tick=1000) timer0_tick=0; counter0+; / 個(gè)位數(shù)加個(gè)位數(shù)加1 if (counter0=10) / 如果個(gè)位數(shù)等于如果個(gè)位數(shù)等于10,則執(zhí)行以下的部分,則執(zhí)行以下的部分 counter0=0; / 個(gè)位數(shù)變成個(gè)位數(shù)變成0 counter1+; / 十位數(shù)加十位數(shù)加1 if(counter1
38、=10) / 如果十位數(shù)等于如果十位數(shù)等于10,則執(zhí)行以下的部分,則執(zhí)行以下的部分 counter1=0; / 十位數(shù)變成十位數(shù)變成0 counter2+; / 百位數(shù)加百位數(shù)加1 if(counter2=10) / 如果百位數(shù)等于如果百位數(shù)等于10,則執(zhí)行以下的部分,則執(zhí)行以下的部分 counter2=0; / 百位數(shù)變成百位數(shù)變成0 counter3+; / 千位數(shù)加千位數(shù)加1 if(counter3=10) counter3=0; /如果千位數(shù)等于如果千位數(shù)等于10,則變成,則變成0 0數(shù)到數(shù)到9999的程序部分說(shuō)明如下。我們利用的程序部分說(shuō)明如下。我們利用counter0、counte
39、r1、counter2counter3分別來(lái)儲(chǔ)存?zhèn)€位數(shù)、十位數(shù)、分別來(lái)儲(chǔ)存?zhèn)€位數(shù)、十位數(shù)、百位數(shù)和千位數(shù)。所以每隔一秒就將百位數(shù)和千位數(shù)。所以每隔一秒就將counter0加加1,如果,如果counter0等于等于10就必須進(jìn)位,于是將就必須進(jìn)位,于是將counter0設(shè)為設(shè)為0,同時(shí),同時(shí)counter1加加1。counter1等于等于10的時(shí)候也是同樣的道理,依次的時(shí)候也是同樣的道理,依次進(jìn)位到進(jìn)位到counter2counter3,程序如,程序如下所示:下所示: 例例9、4*4 小鍵盤(pán)輸入小鍵盤(pán)輸入 本練習(xí)使用前一節(jié)的本練習(xí)使用前一節(jié)的4個(gè)七段顯示器電路,然個(gè)七段顯示器電路,然后外加一個(gè)后
40、外加一個(gè)44的小鍵盤(pán),其中的小鍵盤(pán),其中8051的的PORT 2連連接到接到44小鍵盤(pán)輸入。程序執(zhí)行時(shí),用戶(hù)可以從小鍵盤(pán)輸入。程序執(zhí)行時(shí),用戶(hù)可以從44小鍵盤(pán)輸入數(shù)據(jù),而所輸入小鍵盤(pán)輸入數(shù)據(jù),而所輸入的數(shù)據(jù)會(huì)顯示在的數(shù)據(jù)會(huì)顯示在4 4個(gè)七段顯示器上。個(gè)七段顯示器上。 電電路路圖圖函數(shù)描述:函數(shù)描述: char gotkey(void) 從從44小鍵盤(pán)輸入數(shù)據(jù),返回小鍵盤(pán)輸入數(shù)據(jù),返回015小鍵盤(pán)的連小鍵盤(pán)的連接方式:接方式: 主程序:主程序:ex-9.c#define TIMER0_COUNT 0 xEE11code seven_seg16=0XC0, 0XF9, 0XA4, 0XB0, 0X
41、99, 0X92, 0X82, 0XF8, 0X80, 0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E;code scan4=0X0E, 0X0D, 0X0B, 0X07;unsigned char counter4=0,0,0,0;unsigned char timer0_tick,k=0;static void timer0_isr(void) interrupt 1 using 1 TR0=0; TL0=(TIMER0_COUNT & 0 x00FF); TH0=(TIMER0_COUNT 8); TR0=1; P1=seven_segcounterk; P0=sc
42、ank; k+; if(k=4) k=0; timer0_tick+; if (timer0_tick=200) timer0_tick=0;static void timer0_initialize(void) EA=0; timer0_tick=0; TR0=0; TMOD &= 0XF0; TMOD |=0 x01; TL0=(TIMER0_COUNT & 0 x00FF); TH0=(TIMER0_COUNT 8); PT0=0; ET0=1; TR0=1; EA=1;void main (void) unsigned char c=0; char ch; timer0_initial
43、ize(); do ch=gotkey(); for(c=3;c0;c-) counterc=counterc-1; counter0=ch; while(1);小鍵盤(pán)的輸入函數(shù):小鍵盤(pán)的輸入函數(shù):keypad.c#include code char key_code=0 x7E, 0XBE, 0XBD, 0XBB, 0XDE, 0XDD, 0XDB, 0XEE, 0XED, 0XEB, 0X7D, 0X7B, 0XE7, 0XD7, 0XB7, 0X77;code ksp4=0 x7F,0 xBF,0 xDF,0 xEF;void delay (void) /* 時(shí)間延遲函數(shù)時(shí)間延遲函數(shù) *
44、/ unsigned char i,j; for (i=0;i5;i+) for(j=0;j255;j+) ;char keypad_scan() char key,i; P2=0 xF0; while (P2!=0 xF0); do for(i=0;i=3;i+) P2=kspi; if(P2!=kspi) delay(); key=P2; if(key!=kspi) return(key); while(1);/ 檢查是否有按鍵按下檢查是否有按鍵按下char gotkey() char temp,i; temp=keypad_scan(); for (i=0;i=15;i+) if(tem
45、p=key_codei) return(i); return(16);1.1 單片機(jī)應(yīng)用系統(tǒng)的基本結(jié)構(gòu)單片機(jī)應(yīng)用系統(tǒng)的基本結(jié)構(gòu)1.1.1 單片機(jī)應(yīng)用系統(tǒng)的硬件組成單片機(jī)應(yīng)用系統(tǒng)的硬件組成被被控控對(duì)對(duì)象象單單片片機(jī)機(jī)光電隔離光電隔離A/D光電隔離光電隔離光電隔離光電隔離D/A擴(kuò)展存儲(chǔ)器擴(kuò)展存儲(chǔ)器顯示器、鍵顯示器、鍵盤(pán)盤(pán)接口接口功能芯片功能芯片接口接口數(shù)字量輸入數(shù)字量輸入模擬量輸入模擬量輸入開(kāi)關(guān)量輸入開(kāi)關(guān)量輸入開(kāi)關(guān)量輸出開(kāi)關(guān)量輸出模擬量輸出模擬量輸出輸輸入入輸輸出出接接口口I/O接接口口 二二. .單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)1.1.2 單片機(jī)應(yīng)用系統(tǒng)開(kāi)發(fā)的基本過(guò)程單片機(jī)應(yīng)用系統(tǒng)開(kāi)發(fā)的基本
46、過(guò)程一系統(tǒng)需求與方案調(diào)研一系統(tǒng)需求與方案調(diào)研 系統(tǒng)需求與方案調(diào)研的目的是通過(guò)市場(chǎng)或用戶(hù)系統(tǒng)需求與方案調(diào)研的目的是通過(guò)市場(chǎng)或用戶(hù)了解了解用戶(hù)對(duì)用戶(hù)對(duì)擬擬開(kāi)發(fā)應(yīng)用系統(tǒng)的開(kāi)發(fā)應(yīng)用系統(tǒng)的設(shè)計(jì)目標(biāo)設(shè)計(jì)目標(biāo)和和技術(shù)指標(biāo)技術(shù)指標(biāo)。通過(guò)查。通過(guò)查找資料,分析研究,解決以下問(wèn)題:找資料,分析研究,解決以下問(wèn)題:1)了解國(guó)內(nèi)外同類(lèi)系統(tǒng)的開(kāi)發(fā)水平、器材、設(shè)備水了解國(guó)內(nèi)外同類(lèi)系統(tǒng)的開(kāi)發(fā)水平、器材、設(shè)備水平、供應(yīng)狀態(tài);對(duì)接收委托研制項(xiàng)目,還應(yīng)充分了解對(duì)平、供應(yīng)狀態(tài);對(duì)接收委托研制項(xiàng)目,還應(yīng)充分了解對(duì)方技術(shù)要求、環(huán)境狀況、技術(shù)水平,以確定課題的技術(shù)方技術(shù)要求、環(huán)境狀況、技術(shù)水平,以確定課題的技術(shù)難度。難度。2)了解可移植
47、的硬、軟件技術(shù)。能移植的盡量移植,了解可移植的硬、軟件技術(shù)。能移植的盡量移植,以防止大量低水平重復(fù)勞動(dòng)。以防止大量低水平重復(fù)勞動(dòng)。3)摸清硬、軟件技術(shù)難度,明確技術(shù)主攻方向。摸清硬、軟件技術(shù)難度,明確技術(shù)主攻方向。4)綜合考慮硬、軟件分工與配合方案。單片機(jī)應(yīng)用綜合考慮硬、軟件分工與配合方案。單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)中,硬、軟件工作具有密切的相關(guān)性。系統(tǒng)設(shè)計(jì)中,硬、軟件工作具有密切的相關(guān)性。 可行性分析的目的是對(duì)系統(tǒng)開(kāi)發(fā)研制的必要可行性分析的目的是對(duì)系統(tǒng)開(kāi)發(fā)研制的必要性及可行性作出性及可行性作出明確明確的判定結(jié)論。根據(jù)這一結(jié)論的判定結(jié)論。根據(jù)這一結(jié)論決定系統(tǒng)的開(kāi)發(fā)研制工作是否進(jìn)行下去。決定系統(tǒng)的開(kāi)發(fā)研
48、制工作是否進(jìn)行下去。 可行性分析可行性分析通常從以下幾個(gè)方面進(jìn)行論證通常從以下幾個(gè)方面進(jìn)行論證:1)市場(chǎng)或用戶(hù)的需求情況。)市場(chǎng)或用戶(hù)的需求情況。2)經(jīng)濟(jì)效益和社會(huì)效益。)經(jīng)濟(jì)效益和社會(huì)效益。3)技術(shù)支持與開(kāi)發(fā)環(huán)境。)技術(shù)支持與開(kāi)發(fā)環(huán)境。4)現(xiàn)在的競(jìng)爭(zhēng)力與未來(lái)的生命力。)現(xiàn)在的競(jìng)爭(zhēng)力與未來(lái)的生命力。二可行性分析二可行性分析 系統(tǒng)功能設(shè)計(jì)系統(tǒng)功能設(shè)計(jì)包括包括系統(tǒng)總體目標(biāo)功能的確定系統(tǒng)總體目標(biāo)功能的確定及及系系統(tǒng)硬、軟件模塊功能的劃分與協(xié)調(diào)關(guān)系統(tǒng)硬、軟件模塊功能的劃分與協(xié)調(diào)關(guān)系。 系統(tǒng)功能設(shè)計(jì)系統(tǒng)功能設(shè)計(jì)是根據(jù)系統(tǒng)硬件、軟件功能的劃分是根據(jù)系統(tǒng)硬件、軟件功能的劃分及其協(xié)調(diào)關(guān)系,確定系統(tǒng)硬件結(jié)構(gòu)和軟
49、件結(jié)構(gòu)。及其協(xié)調(diào)關(guān)系,確定系統(tǒng)硬件結(jié)構(gòu)和軟件結(jié)構(gòu)。 系統(tǒng)系統(tǒng)硬件硬件結(jié)構(gòu)設(shè)計(jì)的主要內(nèi)容包括單片機(jī)系統(tǒng)擴(kuò)結(jié)構(gòu)設(shè)計(jì)的主要內(nèi)容包括單片機(jī)系統(tǒng)擴(kuò)展方案和外圍設(shè)備的配置及其接口電路方案,最后要展方案和外圍設(shè)備的配置及其接口電路方案,最后要以邏輯框圖形式描述出來(lái)。以邏輯框圖形式描述出來(lái)。 系統(tǒng)系統(tǒng)軟件軟件結(jié)構(gòu)設(shè)計(jì)主要完成的任務(wù)是確定出系統(tǒng)結(jié)構(gòu)設(shè)計(jì)主要完成的任務(wù)是確定出系統(tǒng)軟件功能模塊的劃分及各功能模塊的程序?qū)崿F(xiàn)的技術(shù)軟件功能模塊的劃分及各功能模塊的程序?qū)崿F(xiàn)的技術(shù)方法,最后以結(jié)構(gòu)框圖或流程圖描述出來(lái)。方法,最后以結(jié)構(gòu)框圖或流程圖描述出來(lái)。三系統(tǒng)功能設(shè)計(jì)三系統(tǒng)功能設(shè)計(jì) 系統(tǒng)詳細(xì)設(shè)計(jì)與制作就是將前面的系統(tǒng)方案付
50、系統(tǒng)詳細(xì)設(shè)計(jì)與制作就是將前面的系統(tǒng)方案付諸實(shí)施,將硬件框圖轉(zhuǎn)化成具體電路,并制作成電路諸實(shí)施,將硬件框圖轉(zhuǎn)化成具體電路,并制作成電路板,軟件框圖或流程圖用程序加以實(shí)現(xiàn)。板,軟件框圖或流程圖用程序加以實(shí)現(xiàn)。四系統(tǒng)詳細(xì)設(shè)計(jì)與制作四系統(tǒng)詳細(xì)設(shè)計(jì)與制作 系統(tǒng)調(diào)試是檢測(cè)所設(shè)計(jì)系統(tǒng)的正確性與可靠性的系統(tǒng)調(diào)試是檢測(cè)所設(shè)計(jì)系統(tǒng)的正確性與可靠性的必要過(guò)程。單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)是一個(gè)相當(dāng)復(fù)雜的勞必要過(guò)程。單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)是一個(gè)相當(dāng)復(fù)雜的勞動(dòng)過(guò)程,在設(shè)計(jì)、制作中,難免存在一些局部性問(wèn)題動(dòng)過(guò)程,在設(shè)計(jì)、制作中,難免存在一些局部性問(wèn)題或錯(cuò)誤。系統(tǒng)調(diào)試可發(fā)現(xiàn)存在的問(wèn)題和錯(cuò)誤,以便及或錯(cuò)誤。系統(tǒng)調(diào)試可發(fā)現(xiàn)存在的問(wèn)題和錯(cuò)誤,
51、以便及時(shí)地進(jìn)行修改。調(diào)試與修改的過(guò)程可能要反復(fù)多次,時(shí)地進(jìn)行修改。調(diào)試與修改的過(guò)程可能要反復(fù)多次,最終使系統(tǒng)試運(yùn)行成功,并達(dá)到設(shè)計(jì)要求。最終使系統(tǒng)試運(yùn)行成功,并達(dá)到設(shè)計(jì)要求。五系統(tǒng)調(diào)試與修改五系統(tǒng)調(diào)試與修改 系統(tǒng)硬件、軟件調(diào)試通過(guò)后,就可以把調(diào)試完畢系統(tǒng)硬件、軟件調(diào)試通過(guò)后,就可以把調(diào)試完畢的軟件固化在的軟件固化在EPROM中,然后脫機(jī)(脫離開(kāi)發(fā)系統(tǒng))中,然后脫機(jī)(脫離開(kāi)發(fā)系統(tǒng))運(yùn)行。如果脫機(jī)運(yùn)行正常,再在真實(shí)環(huán)境或模擬真實(shí)運(yùn)行。如果脫機(jī)運(yùn)行正常,再在真實(shí)環(huán)境或模擬真實(shí)環(huán)境下運(yùn)行,經(jīng)反復(fù)運(yùn)行正常,開(kāi)發(fā)過(guò)程即告結(jié)束。環(huán)境下運(yùn)行,經(jīng)反復(fù)運(yùn)行正常,開(kāi)發(fā)過(guò)程即告結(jié)束。 六生成正式系統(tǒng)或產(chǎn)品六生成正式系
52、統(tǒng)或產(chǎn)品1.2 單片機(jī)應(yīng)用系統(tǒng)的硬件設(shè)計(jì)單片機(jī)應(yīng)用系統(tǒng)的硬件設(shè)計(jì)1.2.1 硬件系統(tǒng)設(shè)計(jì)原則硬件系統(tǒng)設(shè)計(jì)原則 一個(gè)單片機(jī)應(yīng)用系統(tǒng)的硬件電路設(shè)計(jì)包括三個(gè)一個(gè)單片機(jī)應(yīng)用系統(tǒng)的硬件電路設(shè)計(jì)包括三個(gè)部分內(nèi)容:部分內(nèi)容:一是一是單片機(jī)芯片的選擇,單片機(jī)芯片的選擇,二是二是單片機(jī)系單片機(jī)系統(tǒng)擴(kuò)展,統(tǒng)擴(kuò)展,三是三是系統(tǒng)配置。系統(tǒng)配置。一、單片機(jī)芯片的選擇一、單片機(jī)芯片的選擇二、單片機(jī)系統(tǒng)擴(kuò)展二、單片機(jī)系統(tǒng)擴(kuò)展 單片機(jī)系統(tǒng)擴(kuò)展是指單片機(jī)內(nèi)部的功能單元單片機(jī)系統(tǒng)擴(kuò)展是指單片機(jī)內(nèi)部的功能單元(如程如程序存儲(chǔ)器、數(shù)據(jù)存儲(chǔ)器、序存儲(chǔ)器、數(shù)據(jù)存儲(chǔ)器、I/O口、定時(shí)器口、定時(shí)器/計(jì)數(shù)器、中計(jì)數(shù)器、中斷系統(tǒng)等斷系統(tǒng)等)的容
53、量不能滿(mǎn)足應(yīng)用系統(tǒng)的要求時(shí),必須在的容量不能滿(mǎn)足應(yīng)用系統(tǒng)的要求時(shí),必須在片外進(jìn)行擴(kuò)展,這時(shí)應(yīng)選擇適當(dāng)?shù)男酒?,設(shè)計(jì)相應(yīng)的片外進(jìn)行擴(kuò)展,這時(shí)應(yīng)選擇適當(dāng)?shù)男酒?,設(shè)計(jì)相應(yīng)的擴(kuò)展連接電路;系統(tǒng)配置是按照系統(tǒng)功能要求配置外擴(kuò)展連接電路;系統(tǒng)配置是按照系統(tǒng)功能要求配置外圍設(shè)備,如鍵盤(pán)、顯示器、打印機(jī)、圍設(shè)備,如鍵盤(pán)、顯示器、打印機(jī)、A/D轉(zhuǎn)換器、轉(zhuǎn)換器、D/A轉(zhuǎn)換器等,設(shè)計(jì)相應(yīng)的接口電路。轉(zhuǎn)換器等,設(shè)計(jì)相應(yīng)的接口電路。 三、系統(tǒng)擴(kuò)展和配置設(shè)計(jì)遵循的原則三、系統(tǒng)擴(kuò)展和配置設(shè)計(jì)遵循的原則 系統(tǒng)擴(kuò)展和配置設(shè)計(jì)遵循的原則:系統(tǒng)擴(kuò)展和配置設(shè)計(jì)遵循的原則:(1)盡可能選擇典型通用的電路,并符合單片機(jī)的常盡可能選擇典型通
54、用的電路,并符合單片機(jī)的常規(guī)用法。規(guī)用法。(2)系統(tǒng)的擴(kuò)展與外圍設(shè)備配置的水平應(yīng)充分滿(mǎn)足應(yīng)系統(tǒng)的擴(kuò)展與外圍設(shè)備配置的水平應(yīng)充分滿(mǎn)足應(yīng)用系統(tǒng)當(dāng)前的功能要求,并留有適當(dāng)余地,便于以后進(jìn)用系統(tǒng)當(dāng)前的功能要求,并留有適當(dāng)余地,便于以后進(jìn)行功能的擴(kuò)充。行功能的擴(kuò)充。(3)硬件結(jié)構(gòu)應(yīng)結(jié)合應(yīng)用軟件方案一并考慮。硬件結(jié)構(gòu)應(yīng)結(jié)合應(yīng)用軟件方案一并考慮。(4)整個(gè)系統(tǒng)中相關(guān)的器件要盡可能做到性能匹配。整個(gè)系統(tǒng)中相關(guān)的器件要盡可能做到性能匹配。(5)可靠性及抗干擾設(shè)計(jì)是硬件設(shè)計(jì)中不可忽視的一可靠性及抗干擾設(shè)計(jì)是硬件設(shè)計(jì)中不可忽視的一部分。部分。(6)單片機(jī)外接電路較多時(shí),必須考慮其驅(qū)動(dòng)能力。單片機(jī)外接電路較多時(shí),必須
55、考慮其驅(qū)動(dòng)能力。1.2.2 硬件設(shè)計(jì)硬件設(shè)計(jì)一程序存儲(chǔ)器一程序存儲(chǔ)器二數(shù)據(jù)存儲(chǔ)器二數(shù)據(jù)存儲(chǔ)器三三I/O接口接口四譯碼電路四譯碼電路五總線(xiàn)驅(qū)動(dòng)器五總線(xiàn)驅(qū)動(dòng)器六抗干擾電路六抗干擾電路1.3 單片機(jī)應(yīng)用系統(tǒng)的軟件設(shè)計(jì)單片機(jī)應(yīng)用系統(tǒng)的軟件設(shè)計(jì) 一個(gè)應(yīng)用系統(tǒng)中的軟件一般是由一個(gè)應(yīng)用系統(tǒng)中的軟件一般是由系統(tǒng)監(jiān)控程序系統(tǒng)監(jiān)控程序和和應(yīng)用程序應(yīng)用程序兩部分構(gòu)成的。其中兩部分構(gòu)成的。其中: 應(yīng)用程序應(yīng)用程序是用來(lái)完成諸如測(cè)量、計(jì)算、顯示、打是用來(lái)完成諸如測(cè)量、計(jì)算、顯示、打印、輸出控制等各種實(shí)質(zhì)性功能的軟件;印、輸出控制等各種實(shí)質(zhì)性功能的軟件; 系統(tǒng)監(jiān)控程序系統(tǒng)監(jiān)控程序是控制單片機(jī)系統(tǒng)按預(yù)定操作方式運(yùn)是控制單片
56、機(jī)系統(tǒng)按預(yù)定操作方式運(yùn)行的程序,它負(fù)責(zé)組織調(diào)度各應(yīng)用程序模塊,完成系行的程序,它負(fù)責(zé)組織調(diào)度各應(yīng)用程序模塊,完成系統(tǒng)自檢、初始化、處理鍵盤(pán)命令、處理接口命令、處統(tǒng)自檢、初始化、處理鍵盤(pán)命令、處理接口命令、處理?xiàng)l件觸發(fā)和顯示等功能。理?xiàng)l件觸發(fā)和顯示等功能。 軟件設(shè)計(jì)時(shí),應(yīng)根據(jù)系統(tǒng)軟件功能要求,將軟件分軟件設(shè)計(jì)時(shí),應(yīng)根據(jù)系統(tǒng)軟件功能要求,將軟件分成若干個(gè)相對(duì)獨(dú)立的部分,并根據(jù)它們之間的聯(lián)系和時(shí)成若干個(gè)相對(duì)獨(dú)立的部分,并根據(jù)它們之間的聯(lián)系和時(shí)間上的關(guān)系,設(shè)計(jì)出軟件的總體結(jié)構(gòu),畫(huà)出程序流程框間上的關(guān)系,設(shè)計(jì)出軟件的總體結(jié)構(gòu),畫(huà)出程序流程框圖。畫(huà)流程框圖時(shí)還要對(duì)系統(tǒng)資源作具體的分配和說(shuō)明。圖。畫(huà)流程框圖
57、時(shí)還要對(duì)系統(tǒng)資源作具體的分配和說(shuō)明。根據(jù)系統(tǒng)特點(diǎn)和用戶(hù)的了解情況選擇編程語(yǔ)言,現(xiàn)在一根據(jù)系統(tǒng)特點(diǎn)和用戶(hù)的了解情況選擇編程語(yǔ)言,現(xiàn)在一般用匯編語(yǔ)言和般用匯編語(yǔ)言和C語(yǔ)言。語(yǔ)言。 匯編語(yǔ)言編寫(xiě)程序?qū)τ布僮骱芊奖?,編?xiě)的程序匯編語(yǔ)言編寫(xiě)程序?qū)τ布僮骱芊奖?,編?xiě)的程序代碼短,以前單片機(jī)應(yīng)用系統(tǒng)軟件主要用匯編語(yǔ)言編寫(xiě);代碼短,以前單片機(jī)應(yīng)用系統(tǒng)軟件主要用匯編語(yǔ)言編寫(xiě); C語(yǔ)言功能豐富,表達(dá)能力強(qiáng),使用靈活方便,應(yīng)語(yǔ)言功能豐富,表達(dá)能力強(qiáng),使用靈活方便,應(yīng)用面廣,目標(biāo)程序效率高,可移植性好,用面廣,目標(biāo)程序效率高,可移植性好,現(xiàn)在單片機(jī)應(yīng)現(xiàn)在單片機(jī)應(yīng)用系統(tǒng)開(kāi)發(fā)很多都用用系統(tǒng)開(kāi)發(fā)很多都用C語(yǔ)言來(lái)進(jìn)行開(kāi)發(fā)
58、和設(shè)計(jì)語(yǔ)言來(lái)進(jìn)行開(kāi)發(fā)和設(shè)計(jì)。1.3.1 軟件設(shè)計(jì)的特點(diǎn)軟件設(shè)計(jì)的特點(diǎn)一個(gè)優(yōu)秀的應(yīng)用系統(tǒng)的軟件應(yīng)具有以下特點(diǎn):一個(gè)優(yōu)秀的應(yīng)用系統(tǒng)的軟件應(yīng)具有以下特點(diǎn):(1)軟件結(jié)構(gòu)清晰、簡(jiǎn)捷、流程合理。軟件結(jié)構(gòu)清晰、簡(jiǎn)捷、流程合理。(2)各功能程序?qū)崿F(xiàn)模塊化,系統(tǒng)化。這樣,既便于各功能程序?qū)崿F(xiàn)模塊化,系統(tǒng)化。這樣,既便于調(diào)試、連接,又便于移植、修改和維護(hù)。調(diào)試、連接,又便于移植、修改和維護(hù)。(3)程序存儲(chǔ)區(qū)、數(shù)據(jù)存儲(chǔ)區(qū)規(guī)劃合理,既能節(jié)約存程序存儲(chǔ)區(qū)、數(shù)據(jù)存儲(chǔ)區(qū)規(guī)劃合理,既能節(jié)約存儲(chǔ)容量,又能給程序設(shè)計(jì)與操作帶來(lái)方便。儲(chǔ)容量,又能給程序設(shè)計(jì)與操作帶來(lái)方便。(4)運(yùn)行狀態(tài)實(shí)現(xiàn)標(biāo)志化管理。各個(gè)功能程序運(yùn)行狀運(yùn)行狀態(tài)實(shí)
59、現(xiàn)標(biāo)志化管理。各個(gè)功能程序運(yùn)行狀態(tài)、運(yùn)行結(jié)果以及運(yùn)行需求都設(shè)置狀態(tài)標(biāo)志以便查詢(xún),態(tài)、運(yùn)行結(jié)果以及運(yùn)行需求都設(shè)置狀態(tài)標(biāo)志以便查詢(xún),程序的轉(zhuǎn)移、運(yùn)行、控制都可通過(guò)狀態(tài)標(biāo)志來(lái)控制。程序的轉(zhuǎn)移、運(yùn)行、控制都可通過(guò)狀態(tài)標(biāo)志來(lái)控制。(5)經(jīng)過(guò)調(diào)試修改后的程序應(yīng)進(jìn)行規(guī)范化,除去修經(jīng)過(guò)調(diào)試修改后的程序應(yīng)進(jìn)行規(guī)范化,除去修改改“痕跡痕跡”。規(guī)范化的程序便于交流、借鑒,也為今。規(guī)范化的程序便于交流、借鑒,也為今后的軟件模塊化、標(biāo)準(zhǔn)化打下基礎(chǔ)。后的軟件模塊化、標(biāo)準(zhǔn)化打下基礎(chǔ)。(6)實(shí)現(xiàn)全面軟件抗干擾設(shè)計(jì)。軟件抗干擾是計(jì)算實(shí)現(xiàn)全面軟件抗干擾設(shè)計(jì)。軟件抗干擾是計(jì)算機(jī)應(yīng)用系統(tǒng)提高可靠性的有力措施。機(jī)應(yīng)用系統(tǒng)提高可靠性的有
60、力措施。(7)為了提高運(yùn)行的可靠性,在應(yīng)用軟件中設(shè)置自為了提高運(yùn)行的可靠性,在應(yīng)用軟件中設(shè)置自診斷程序,在系統(tǒng)運(yùn)行前先運(yùn)行自診斷程序,用以檢診斷程序,在系統(tǒng)運(yùn)行前先運(yùn)行自診斷程序,用以檢查系統(tǒng)各特征參數(shù)是否正常。查系統(tǒng)各特征參數(shù)是否正常。1.3.2 資源分配資源分配一程序存儲(chǔ)器一程序存儲(chǔ)器ROM/EPROM資源的分配資源的分配 在這些資源分配中,定時(shí)在這些資源分配中,定時(shí)/計(jì)數(shù)器、中斷、串行口計(jì)數(shù)器、中斷、串行口等分配比較容易,這里介紹程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器等分配比較容易,這里介紹程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器的分配。的分配。 程序存儲(chǔ)器程序存儲(chǔ)器ROM/EPROM用于存放程序和數(shù)據(jù)表格。用于存放程序
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 神經(jīng)系統(tǒng)考試題及答案
- 容器技術(shù)考試題庫(kù)及答案
- 輻射探測(cè)技術(shù)
- 《GAT 759-2008公安信息化標(biāo)準(zhǔn)管理基本數(shù)據(jù)結(jié)構(gòu)》專(zhuān)題研究報(bào)告
- 2026年深圳中考語(yǔ)文小說(shuō)閱讀專(zhuān)項(xiàng)試卷(附答案可下載)
- 2026年深圳中考物理專(zhuān)題過(guò)關(guān)檢測(cè)試卷(附答案可下載)
- 積分題目及答案解析
- 2026年深圳中考數(shù)學(xué)一元一次方程試卷(附答案可下載)
- 2026年深圳中考數(shù)學(xué)沖刺名校專(zhuān)項(xiàng)試卷(附答案可下載)
- 2026年深圳中考?xì)v史戰(zhàn)后世界格局的演變?cè)嚲恚ǜ酱鸢缚上螺d)
- 不能降低投標(biāo)價(jià)的回復(fù)函
- 2024-2025學(xué)年廣東省實(shí)驗(yàn)中學(xué)高一(上)期中語(yǔ)文試卷
- 鋼鐵制造的工藝流程(內(nèi)部資料)課件
- DB31-T 1448-2023 監(jiān)獄場(chǎng)所消防安全管理規(guī)范
- 公司干部調(diào)研方案
- 無(wú)糾紛自愿離婚協(xié)議書(shū)
- 四川省高等教育自學(xué)考試畢業(yè)生登記表【模板】
- 專(zhuān)題五 以新發(fā)展理念引領(lǐng)高質(zhì)量發(fā)展
- GB/T 22417-2008叉車(chē)貨叉叉套和伸縮式貨叉技術(shù)性能和強(qiáng)度要求
- GB/T 20145-2006燈和燈系統(tǒng)的光生物安全性
- GB/T 1.1-2009標(biāo)準(zhǔn)化工作導(dǎo)則 第1部分:標(biāo)準(zhǔn)的結(jié)構(gòu)和編寫(xiě)
評(píng)論
0/150
提交評(píng)論