版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、1. 基本示例分析 2.單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì),單片機(jī)C語言編程與設(shè)計(jì),一、基本示例分析:,例1、LED的控制,使用805l的Port 1連接8個(gè)LED,以產(chǎn)生跑馬燈的效果。連接好電路并且完成程序之后,您將可以看到8個(gè)LED依次輪流閃爍。 在這次練習(xí)中,您將學(xué)會(huì)如何使用I/O Port輸出數(shù)據(jù),以及如何使用循環(huán)實(shí)現(xiàn)時(shí)間延遲。,電路圖,#include void delay (void) /*
2、 delay 函數(shù) */{ unsigned char i,j; /* 這個(gè)函數(shù)執(zhí)行時(shí)間的延遲 */ for (i=0;i<255;i++) for(j=0;j<255;j++) ;}void main (void) { unsigned char j=0XFE; /*聲明變量 j */ whil
3、e (1) /* 無窮循環(huán) */ { /*依次讓LED 0,1,2,3,4,5,6,7閃爍 */ j=(j<<1) | 0x01; if(j==0XFF) j=0XFE; P1 = j; /* 將數(shù)值輸出到Port1,控制LED亮或滅 */
4、 delay(); /* 調(diào)用 delay 函數(shù)*/ } },例2、指撥開關(guān)的輸入,目的是使用8051的Port l連接到8個(gè)LED,Port 2則連接到1個(gè)指撥開關(guān),當(dāng)用戶撥動(dòng)指撥開關(guān)時(shí),相對(duì)應(yīng)的LED就會(huì)亮或滅。 在這次練習(xí)中,您將學(xué)會(huì)如何使用8051輸入數(shù)據(jù)。 例如,您要從Port 2輸入數(shù)據(jù)給變量temp時(shí),可以執(zhí)行temp=P2;,電路圖,#include void d
5、elay (void) /* delay 函數(shù)*/{ unsigned char i,j; /*這個(gè)函數(shù)執(zhí)行時(shí)間的延遲 */ for (i=0;i<255;i++) for(j=0;j<255;j++);} void main (void) { unsigned char temp; /* 聲明
6、變量temp */ while (1) /* 無窮循環(huán) */ { temp=P2; /* 將P2輸入的數(shù)據(jù)直接放入變量temp當(dāng)中 */ P1=temp; /* 將變量temp中的數(shù)據(jù)直接輸出到Port 1*/ delay(); }},例3、七段顯示器的控
7、制,目的是使用8051的Port 1連接到一個(gè)共陽的七段顯示器,然后讓8051輪流顯示0~9。當(dāng)您連接好電路,并且完成程序之后,您將看到七段顯示器依次顯示0~9。 在這次練習(xí)中,您將學(xué)會(huì)如何使用805l控制共陽七段顯示器的顯示。,一個(gè)共陽七段顯示器的外觀和引腳如圖所示。這個(gè)共陽七段顯示器的引腳分別連接到805l的Port l引腳。,電路圖,#include code seven_seg[10]={0XC0, 0X
8、F9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90};void delay (void) /* 時(shí)間延遲的函數(shù) */ { unsigned char i,j; for (i=0;i<255;i++) for(j=0;j<255;j++)
9、 ;}void main (void) { unsigned char i; /* 變量 i 用來儲(chǔ)存 0~9 */ while (1) /* 無窮循環(huán) */ { for (i=0; i<10; i++) { P1 = seven_seg[i]; /
10、* 輸出 0~9 到共陽七段顯示器*/ delay(); /* 調(diào)用時(shí)間延遲函數(shù)delay*/ } }},共陽七段顯示器有一共同接點(diǎn)連接到5V,其余的七支引腳分別如圖所示,因此如果要讓所指定的LED發(fā)光時(shí),就必須輸出0,反之則輸出1,所以我們可以用下表排列出所要顯示字符和必須輸出的信號(hào)。下表中,假設(shè)dot點(diǎn)接在最高位,而且不點(diǎn)
11、亮,所以一直都是1 。,將以上的信息編成16進(jìn)制碼,然后存放在定義為seven_ seg的數(shù)組中。,我們將共陽七段顯示器顯示出0~9的字型碼儲(chǔ)存在程序存儲(chǔ)器中。當(dāng)用戶有固定不變的數(shù)據(jù)時(shí),就可以儲(chǔ)存在程序存儲(chǔ)器中。儲(chǔ)存在程序存儲(chǔ)器的數(shù)據(jù)必須存聲明的變景附加上code,如以下的聲明方式:code seven_seg[10]={0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80,
12、0X90};,例4、計(jì)時(shí)器Timer0 的溢出中斷控制,在前面,我們?cè)?jīng)捉到過使用for循環(huán)實(shí)現(xiàn)時(shí)間延遲并不是很精確,例如,程序會(huì)受到中斷的執(zhí)行而影響延遲時(shí)間。在這次實(shí)習(xí)中,您將學(xué)會(huì)如何使用8051的Timer0計(jì)時(shí)器溢出中斷實(shí)現(xiàn)準(zhǔn)確的時(shí)間延遲。 本練習(xí)使用8051的Port 1連接到一個(gè)共陽七段顯示器,然后利用計(jì)時(shí)計(jì)數(shù)器Timer l,讓8051在指定的時(shí)間間隔內(nèi)顯示出0~9。當(dāng)您連接好電路,并且完成程序之后,您將可
13、以看到七段顯示器依次顯示0~ 9。,#include #define TIMER0_COUNT 0xEE11 const seven_seg[10]={0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90};unsigned char timer0_tick,i=0;static void timer0_isr(void) interrupt TF0_VECTOR
14、using 1{ TR0=0; TL0=(TIMER0_COUNT & 0x00FF); TH0=(TIMER0_COUNT >> 8); TR0=1; timer0_tick++; if (timer0_tick==200) { i++; if(i==10) i=0; timer0_
15、tick=0; P1=seven_seg[i]; }},static void timer0_initialize(void){ EA=0; /* 設(shè)定系統(tǒng)不接受所有的中斷 */ timer0_tick=0; TR0=0; /* 關(guān)閉Timer0 */ TMOD =0x01;
16、 /* 設(shè)定計(jì)時(shí)器0為16位的工作模式 */ TL0=(TIMER0_COUNT & 0x00FF); /* 設(shè)定TL0的數(shù)值 */ TH0=(TIMER0_COUNT >> 8); /* 設(shè)定TH0的數(shù)值 */ PT0=0; /* 設(shè)定計(jì)時(shí)器0有比較高的優(yōu)先級(jí) */ ET0=1; /
17、* 設(shè)定接受Timer0的中斷 */ TR0=1; /* 啟動(dòng)Timer0 */ EA=1; /* 設(shè)定系統(tǒng)接受中斷 */}void main (void) { timer0_initialize(); while (1); /* 無窮循環(huán)*/},使用計(jì)時(shí)計(jì)數(shù)器Timer0之前,必須先執(zhí)行
18、Timer0的初始化功能。Timer0初始化按照以下的步驟: (1)先暫停接受所有的中斷。 (2)關(guān)閉Timer0。 (3)設(shè)置計(jì)時(shí)器0的工作模式。 (4)設(shè)置計(jì)時(shí)器0的計(jì)數(shù)器數(shù)值(TL0和TH0數(shù)值)。 (5)設(shè)置計(jì)時(shí)器0有比較高的優(yōu)先級(jí)(這一個(gè)步驟可以省略)。 (6)設(shè)置接受Timer0的中斷。 (7)啟動(dòng)Timer0。 (8)設(shè)置系統(tǒng)接受中斷。,中斷定時(shí)時(shí)間計(jì)算: 如果外接石英晶體的
19、頻率是12MHz時(shí),因?yàn)?051的一個(gè)機(jī)械周期需要12個(gè)石英晶體的振蕩周期,所以每秒就有1000 000次的機(jī)械周期,換言之機(jī)械周期是1us。如果我們希望Timer0每秒中斷200次,那么我們就必須讓Timer0每數(shù)5 000次就中斷1次(1 000 000/200=5000)。因?yàn)門imer0的溢出中斷是Timer0數(shù)到65536(16進(jìn)制表示時(shí)是10000H)就產(chǎn)生中斷,因此要讓Timer0數(shù)5 000次就中斷1次時(shí)就必須設(shè)置Tim
20、er0等于10000H--((12000000/(12×200)),也就是0xEE11。接下來我們可以利用以下的指令分別設(shè)置Timer0計(jì)數(shù)器的低8位和Timer0的高8位。,TL0=(TIMER0_COUNT & 0x00FF); /* 設(shè)定TL0的數(shù)值 */TH0=(TIMER0_COUNT >> 8); /* 設(shè)定TH0的數(shù)值 */,Timer0的溢出中斷服務(wù)程序格式如下所示:
21、 static void timer0_isr(void) interrupt TF0_VECTOR using 1 { 加入中斷之后必須處理的程序 } 其中TF0 VECTOR是定義在文件regx51.h中的常量,其數(shù)值是1,這是因?yàn)門imer0的中斷向量是1。 TF0_VECTOR后面所接的using 1,表示進(jìn)入Timer0的溢出中斷服務(wù)程序之后會(huì)使用寄存器組1(Regist
22、er Bank 1),而離開Timer0的溢出中斷服務(wù)程序時(shí)編譯器也會(huì)自動(dòng)恢復(fù)使用原先的寄存器組,8051中有4個(gè)寄存器組,分別是寄存器組0到寄存器組3,當(dāng)8051開始執(zhí)行時(shí)會(huì)自動(dòng)采用寄存器組0。 進(jìn)入中斷服務(wù)程序時(shí)采用不同的寄存器組,可以避免破壞原先尚未進(jìn)入Timer0溢出中斷服務(wù)程序時(shí)所使用的寄存器內(nèi)容。 用戶當(dāng)然也可以采用原先的寄存器,但是此時(shí)就必須維護(hù)寄存器的內(nèi)容,一般足存進(jìn)入中斷服務(wù)程序前先將使
23、用到的寄存器放入堆棧中,等到要離開之后冉重新由堆棧取出,并恢復(fù)原先的數(shù)值,這種做法在維護(hù)管理上要小心。,例5、外部中斷 INT0,本實(shí)驗(yàn)使用AT89S51的Port 1連接到8顆LED,Port 1在正常狀況下會(huì)輸出跑馬燈,然后通過用戶觸動(dòng)外部的硬件來中斷INT0,當(dāng)INT0引腳有低電位的脈沖出現(xiàn)時(shí),8個(gè)LED會(huì)一閃一滅4次。 在這次練習(xí)中,您將學(xué)會(huì)如何使用外部中斷INT0。,電路圖,#include void dela
24、y (void) /* delay 函數(shù) */ { unsigned char i,j; /* 這個(gè)函數(shù)執(zhí)行時(shí)間的延遲 */ for (i=0;i<255;i++) for(j=0;j<255;j++) ;}void delay_4isr (void) /* delay_4isr 函數(shù) */ {
25、 unsigned char i,j; /* 這個(gè)函數(shù)執(zhí)行時(shí)間的延遲 */ for (i=0;i<255;i++) for(j=0;j<255;j++) ;}static void xint0_isr(void) interrupt IE0_VECTOR{ unsigned char i,j=0XFF; /* 變量 j */
26、 for(i=0;i<16;i++) { j=~j; P1 = j; /* 將數(shù)值輸出到 LED 輸出端口 */ delay_4isr (); }},void main (void) { unsigned char j=0XFF; /* 變量 j */ EA=0;
27、 /* 設(shè)定系統(tǒng)不接受所有的中斷 */ EX0=1; /* 設(shè)定接受INT0的中斷 */ PX0=1; EA=1; /* 設(shè)定系統(tǒng)接受中斷 */ while (1)
28、 /* 無窮循環(huán) */ /* 依次讓LED 0,1,2,3,4,5,6,7閃爍 */ { j=(j<<1) | 0x01; if(j==0XFF) j=0XFE; P1 = j; /* 將數(shù)值輸出到 LED
29、 輸出端口 */ delay(); /* 調(diào)用 delay 函數(shù)*/ }},例6、按鈕檢測(cè)1,目的是使用805 1的PORT 2連接到一個(gè)彈跳式按鈕作為輸入,PORT 1則連接到1個(gè)共陽七段顯示器。程序執(zhí)行時(shí),共陽七段顯示器會(huì)先顯示0,之后當(dāng)用戶每按一次彈跳按鈕,共陽七段顯示器所顯示的數(shù)字就會(huì)加1,直到9之后又會(huì)恢復(fù)到0。,電路圖,#include #def
30、ine TRUE 1#define FALSE 0code seven_seg[10]={0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90};void delay (void) /* wait function */ { unsigned char i,j; /* only
31、to delay for LED flashes */ for (i=0;i<96;i++) for(j=0;j<255;j++) ; },// 函數(shù) keypressed 檢查是否有按鍵按下 int keypressed(){ do { while (P2_0==1); delay();
32、 if(P2_0==0) { delay(); if (P2_0==0) return TRUE; } } while(1);},void main (void) { int c; P1=seven_seg[c]; do { if ( keypressed(
33、) ) c++; if(c==10) c=0; P1=seven_seg[c]; } while(1);},在這一個(gè)程序中,我們寫了一個(gè)判斷按鈕是否被按下的函數(shù)keypressed,這一個(gè)函數(shù)在用戶按下按鈕時(shí)就返回TRUE(1)。 因?yàn)榘聪掳粹o時(shí),必須消除按鈕彈起的時(shí)間,因此當(dāng)程序檢測(cè)到按鈕事件時(shí)(P2 0等于0時(shí)),必須延遲一段時(shí)問之后再檢查P2_0是否還是0,如果還是0,就表示按鈕確
34、實(shí)被按下,否則就表示只是無效信息而已。根據(jù)這個(gè)原理,所以設(shè)計(jì)出函數(shù)keypressed的流程圖,如圖所示。,例7、按鈕檢測(cè)2,上一節(jié)的按鈕檢測(cè)程序中,消除彈起的時(shí)間是利用循環(huán)來延長一段時(shí)間之后,然后再檢查按鈕,這種做法雖然可以消除彈起時(shí)間,但是卻也造成循環(huán)執(zhí)行時(shí)其他工作無法進(jìn)行的缺點(diǎn),所以在這一節(jié)中,我們把時(shí)間延遲的部分交給Timer0來處理,如此一來,就可以讓CPU處理其他事情了。 本練習(xí)使用8051的PORT 2連接
35、到2個(gè)彈跳式按鈕作為輸入,其中一個(gè)是上數(shù)的彈跳按鈕,另一個(gè)則是下數(shù)的彈跳按鈕。PORT l則連接到1個(gè)共陽七段顯示器。程序執(zhí)行時(shí),共陽七段顯示器會(huì)先顯示出0,之后每當(dāng)用戶單擊一次上數(shù)的彈跳按鈕,共陽七段顯示器所顯示的數(shù)字就會(huì)加1,直到9之后又會(huì)恢復(fù)到0。而每當(dāng)用戶按一次下數(shù)的彈跳按鈕,共陽七段顯示器所顯示的數(shù)字就會(huì)減1,直到0之后又會(huì)恢復(fù)到9。,電路圖,#include #define TIMER0_COUNT 0XEE11 #d
36、efine TRUE 1#define FALSE 0#define TIMES 25code seven_seg[10]={0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90};int c, ups, downs;static void timer0_initialize(void){
37、EA=0; TR0=0; TMOD &= 0XF0; TMOD |=0x01; TL0=(TIMER0_COUNT & 0x00FF); TH0=(TIMER0_COUNT >> 8); PT0=0; ET0=1; TR0=1; EA=1;},void main (void) { c=0; ups=0; downs=0;
38、 timer0_initialize(); P1=seven_seg[c]; while(1);},// 函數(shù) timer0_isr 檢查是否有按鍵按下 static void timer0_isr(void) interrupt TF0_VECTOR using 1{ TR0=0; TL0=(TIMER0_COUNT & 0x00FF); TH0=(TIMER0_COUNT >>
39、 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++; // 如果
40、P2_0是0就表示上數(shù)的彈跳按鈕被按下,所以c加1 if(c==10) c=0; //如果c加到10,就將c恢復(fù)為0 } } else if (P2_0==0) ups=TIMES; //如果ups=0且P2_0=0就將ups設(shè)為25,if (downs !=0) //檢查downs等于0嗎? {
41、 downs--; //如果downs不等于0,就將downs減1 if (downs==0 && P2_1==0) //如果downs 減到0,就檢查P2_1=0 { c--; // 如果P2_1是0就表示下數(shù)的彈跳按鈕被按下,所以c減1 if(c==-1) c=9; //如果c減到-1
42、時(shí),就將c恢復(fù)為10 } } else if (P2_1==0) downs=TIMES; //如果downs=0且 P2_1 =0 //就將downs設(shè)為25 P1=seven_seg[c];},如何計(jì)程序可以使用Timer0延遲一段時(shí)間呢?在此我們利用變量ups,當(dāng)?shù)谝淮螜z查到P2_0等于0時(shí)就設(shè)置ups=2
43、5,然后每一次Timer0中斷之后,就將ups減1,直到0為止,剛好經(jīng)歷25/200秒,接下來再檢查P2_0是否依然等于0,就可以判斷上數(shù)的彈跳按鈕是否被單擊。程序部分如下所示:,if (ups !=0) //檢查ups等于0嗎? { ups--; //如果ups不等于0,就將ups減1 if (ups==0 &
44、amp;& P2_0==0) //如果ups減到0,就檢查P2_0==0{ c++; // 如果P2_0是0就表示上數(shù)的彈跳按鈕被按下,所以c加1 if(c==10) c=0; //如果c加到10,就將c恢復(fù)為0 } } else if (P2_0==0) ups=TIMES; //如果u
45、ps=0且P2_0=0就將ups設(shè)為25,例8、四個(gè)七段顯示器的顯示控制,本練習(xí)使用805 l的Port 1連接到四個(gè)七段顯示器。這四個(gè)共陽七段顯示器的a、b、c、d、e、f和 g全部都連接在一起,因此PORT 1所輸出的數(shù)據(jù)按理說應(yīng)該會(huì)在四個(gè)共陽七段顯示器都顯示出來。但足我們利用PORT 0的低4位分別控制這四個(gè)共陽七段顯示器,讓四個(gè)共陽七段顯示器使用掃描的方式輪流顯示數(shù)字,因此PORT 1每一次輸出的數(shù)據(jù)恰好只會(huì)在其中一個(gè)共陽七段顯
46、示器顯示數(shù)字。當(dāng)您連接好電路,并且完成程序之后,您將可以看到這四個(gè)七段顯示器上顯示0~9999。在這次實(shí)習(xí)中,您將學(xué)會(huì)如何使用輪流驅(qū)動(dòng)的方式,讓四個(gè)共陽七段顯示器輪流顯示數(shù)字。,電路圖,程序描述:說明如何使用8051 的Port 1連接到四顆七段顯示器,PORT 0的低4位分別控制這四顆共陽七段顯示器,讓四顆共陽七段顯示器使用掃描的方式輪流顯示數(shù)字。 這四顆七段顯示器將顯示0到 9999。#include #
47、define TIMER0_COUNT 0xFC18 code seven_seg[10]={0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90};code scan[4]={0X0E, 0X0D, 0X0B, 0X07};unsigned char counter[4]={0,0,0,0};unsigned char i=0;int timer0_tick
48、;,static void timer0_initialize(void){ EA=0; timer0_tick=0; TR0=0; TMOD &= 0XF0; TMOD |=0x01; TL0=(TIMER0_COUNT & 0x00FF); TH0=(TIMER0_COUNT >> 8); PT0=0; ET0=1; TR0=1; EA=1;}void m
49、ain (void) { timer0_initialize(); while (1); /* 無窮循環(huán) */},static void timer0_isr(void) interrupt TF0_VECTOR using 1{ TR0=0; TL0=(TIMER0_COUNT & 0x00FF); TH0=(TIMER0_COUNT >>
50、; 8); TR0=1; P1=seven_seg[counter[i]]; P0=scan[i]; i++; if(i==4) i=0; timer0_tick++;,if (timer0_tick==1000) { timer0_tick=0; counter[0]++; // 個(gè)位數(shù)加1 if (counter[0]==10) {
51、 // 如果個(gè)位數(shù)等于10,則執(zhí)行以下的部分 counter[0]=0; // 個(gè)位數(shù)變成0 counter[1]++; // 十位數(shù)加1 if(counter[1]==10){ // 如果十位數(shù)等于10,則執(zhí)行以下的部分 counter[1]=0; // 十位數(shù)變成0 count
52、er[2]++; // 百位數(shù)加1 if(counter[2]==10) { // 如果百位數(shù)等于10,則執(zhí)行以下的部分 counter[2]=0; // 百位數(shù)變成0 counter[3]++; // 千位數(shù)加1
53、 if(counter[3]==10) counter[3]=0; //如果千位數(shù)等于10,則變成0 } } } }},0數(shù)到9999的程序部分說明如下。我們利用counter[0]、counter[1]、counter[2]~counter[3]分別來
54、儲(chǔ)存?zhèn)€位數(shù)、十位數(shù)、百位數(shù)和千位數(shù)。所以每隔一秒就將counter[0]加1,如果counter[0]等于10就必須進(jìn)位,于是將counter[0]設(shè)為0,同時(shí)counter[1]加1。counter[1]等于10的時(shí)候也是同樣的道理,依次進(jìn)位到counter[2]~counter[3],程序如下所示:,例9、4*4 小鍵盤輸入,本練習(xí)使用前一節(jié)的4個(gè)七段顯示器電路,然后外加一個(gè)4×4的小鍵盤,其中8051的PORT 2連接到
55、4×4小鍵盤輸入。程序執(zhí)行時(shí),用戶可以從4×4小鍵盤輸入數(shù)據(jù),而所輸入的數(shù)據(jù)會(huì)顯示在4個(gè)七段顯示器上。,電路圖,函數(shù)描述: char gotkey(void) 從4×4小鍵盤輸入數(shù)據(jù),返回0~15小鍵盤的連接方式:,主程序:ex-9.c,#define TIMER0_COUNT 0xEE11code seven_seg[16]={0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X9
56、2, 0X82, 0XF8, 0X80, 0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E};code scan[4]={0X0E, 0X0D, 0X0B, 0X07};unsigned char counter[4]={0,0,0,0};unsigned char timer0_tick,k=0;static void timer0_isr(void) interrupt 1 using 1{ TR0
57、=0; TL0=(TIMER0_COUNT & 0x00FF); TH0=(TIMER0_COUNT >> 8); TR0=1; P1=seven_seg[counter[k]]; P0=scan[k]; k++; if(k==4) k=0; timer0_tick++; if (timer0_tick==200) timer0_tick=0;},static void time
58、r0_initialize(void){ EA=0; timer0_tick=0; TR0=0; TMOD &= 0XF0; TMOD |=0x01; TL0=(TIMER0_COUNT & 0x00FF); TH0=(TIMER0_COUNT >> 8); PT0=0; ET0=1; TR0=1; EA=1;},void main (void) { u
59、nsigned char c=0; char ch; timer0_initialize(); do { ch=gotkey(); for(c=3;c>0;c--) counter[c]=counter[c-1]; counter[0]=ch; } while(1);},小鍵盤的輸入函數(shù):keypad.c,#include code char key_code
60、[]={0x7E, 0XBE, 0XBD, 0XBB, 0XDE, 0XDD, 0XDB, 0XEE, 0XED, 0XEB, 0X7D, 0X7B, 0XE7, 0XD7, 0XB7, 0X77};code ksp[4]={0x7F,0xBF,0xDF,0xEF};void delay (void) /* 時(shí)間延遲函數(shù) */ { unsigned char i,j;
61、 for (i=0;i<5;i++) for(j=0;j<255;j++) ;},char keypad_scan(){ char key,i; P2=0xF0; while (P2!=0xF0); do{ for(i=0;i<=3;i++) { P2=ksp[i];
62、 if(P2!=ksp[i]) { delay(); key=P2; if(key!=ksp[i]) { return(key); } } } } while(1);},// 檢查是否有按鍵
63、按下char gotkey(){ char temp,i; temp=keypad_scan(); for (i=0;i<=15;i++) { if(temp==key_code[i]) return(i); } return(16);},1.1 單片機(jī)應(yīng)用系統(tǒng)的基本結(jié)構(gòu),1.1.1 單片機(jī)應(yīng)用系統(tǒng)的硬件組成,二.單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì),1.1.2 單片機(jī)
64、應(yīng)用系統(tǒng)開發(fā)的基本過程,一.系統(tǒng)需求與方案調(diào)研,系統(tǒng)需求與方案調(diào)研的目的是通過市場(chǎng)或用戶了解用戶對(duì)擬開發(fā)應(yīng)用系統(tǒng)的設(shè)計(jì)目標(biāo)和技術(shù)指標(biāo)。通過查找資料,分析研究,解決以下問題:1)了解國內(nèi)外同類系統(tǒng)的開發(fā)水平、器材、設(shè)備水平、供應(yīng)狀態(tài);對(duì)接收委托研制項(xiàng)目,還應(yīng)充分了解對(duì)方技術(shù)要求、環(huán)境狀況、技術(shù)水平,以確定課題的技術(shù)難度。2)了解可移植的硬、軟件技術(shù)。能移植的盡量移植,以防止大量低水平重復(fù)勞動(dòng)。3)摸清硬、軟件技術(shù)難度,明確技術(shù)主攻方
65、向。4)綜合考慮硬、軟件分工與配合方案。單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)中,硬、軟件工作具有密切的相關(guān)性。,可行性分析的目的是對(duì)系統(tǒng)開發(fā)研制的必要性及可行性作出明確的判定結(jié)論。根據(jù)這一結(jié)論決定系統(tǒng)的開發(fā)研制工作是否進(jìn)行下去。 可行性分析通常從以下幾個(gè)方面進(jìn)行論證:1)市場(chǎng)或用戶的需求情況。2)經(jīng)濟(jì)效益和社會(huì)效益。3)技術(shù)支持與開發(fā)環(huán)境。4)現(xiàn)在的競爭力與未來的生命力。,二.可行性分析,系統(tǒng)功能設(shè)計(jì)包括系統(tǒng)總體目標(biāo)功能的確定及系統(tǒng)硬、
66、軟件模塊功能的劃分與協(xié)調(diào)關(guān)系。 系統(tǒng)功能設(shè)計(jì)是根據(jù)系統(tǒng)硬件、軟件功能的劃分及其協(xié)調(diào)關(guān)系,確定系統(tǒng)硬件結(jié)構(gòu)和軟件結(jié)構(gòu)。 系統(tǒng)硬件結(jié)構(gòu)設(shè)計(jì)的主要內(nèi)容包括單片機(jī)系統(tǒng)擴(kuò)展方案和外圍設(shè)備的配置及其接口電路方案,最后要以邏輯框圖形式描述出來。 系統(tǒng)軟件結(jié)構(gòu)設(shè)計(jì)主要完成的任務(wù)是確定出系統(tǒng)軟件功能模塊的劃分及各功能模塊的程序?qū)崿F(xiàn)的技術(shù)方法,最后以結(jié)構(gòu)框圖或流程圖描述出來。,三.系統(tǒng)功能設(shè)計(jì),系統(tǒng)詳細(xì)設(shè)計(jì)與制作就是將前面的系統(tǒng)方案
67、付諸實(shí)施,將硬件框圖轉(zhuǎn)化成具體電路,并制作成電路板,軟件框圖或流程圖用程序加以實(shí)現(xiàn)。,四.系統(tǒng)詳細(xì)設(shè)計(jì)與制作,系統(tǒng)調(diào)試是檢測(cè)所設(shè)計(jì)系統(tǒng)的正確性與可靠性的必要過程。單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)是一個(gè)相當(dāng)復(fù)雜的勞動(dòng)過程,在設(shè)計(jì)、制作中,難免存在一些局部性問題或錯(cuò)誤。系統(tǒng)調(diào)試可發(fā)現(xiàn)存在的問題和錯(cuò)誤,以便及時(shí)地進(jìn)行修改。調(diào)試與修改的過程可能要反復(fù)多次,最終使系統(tǒng)試運(yùn)行成功,并達(dá)到設(shè)計(jì)要求。,五.系統(tǒng)調(diào)試與修改,系統(tǒng)硬件、軟件調(diào)試通過后,就可以把調(diào)試完畢的
68、軟件固化在EPROM中,然后脫機(jī)(脫離開發(fā)系統(tǒng))運(yùn)行。如果脫機(jī)運(yùn)行正常,再在真實(shí)環(huán)境或模擬真實(shí)環(huán)境下運(yùn)行,經(jīng)反復(fù)運(yùn)行正常,開發(fā)過程即告結(jié)束。,六.生成正式系統(tǒng)或產(chǎn)品,1.2 單片機(jī)應(yīng)用系統(tǒng)的硬件設(shè)計(jì),1.2.1 硬件系統(tǒng)設(shè)計(jì)原則,一個(gè)單片機(jī)應(yīng)用系統(tǒng)的硬件電路設(shè)計(jì)包括三個(gè)部分內(nèi)容:一是單片機(jī)芯片的選擇,二是單片機(jī)系統(tǒng)擴(kuò)展,三是系統(tǒng)配置。,一、單片機(jī)芯片的選擇,二、單片機(jī)系統(tǒng)擴(kuò)展,單片機(jī)系統(tǒng)擴(kuò)展是指單片機(jī)內(nèi)部的功能單元(如程序存儲(chǔ)器、數(shù)據(jù)
69、存儲(chǔ)器、I/O口、定時(shí)器/計(jì)數(shù)器、中斷系統(tǒng)等)的容量不能滿足應(yīng)用系統(tǒng)的要求時(shí),必須在片外進(jìn)行擴(kuò)展,這時(shí)應(yīng)選擇適當(dāng)?shù)男酒?,設(shè)計(jì)相應(yīng)的擴(kuò)展連接電路;系統(tǒng)配置是按照系統(tǒng)功能要求配置外圍設(shè)備,如鍵盤、顯示器、打印機(jī)、A/D轉(zhuǎn)換器、D/A轉(zhuǎn)換器等,設(shè)計(jì)相應(yīng)的接口電路。,三、系統(tǒng)擴(kuò)展和配置設(shè)計(jì)遵循的原則,系統(tǒng)擴(kuò)展和配置設(shè)計(jì)遵循的原則:(1)盡可能選擇典型通用的電路,并符合單片機(jī)的常規(guī)用法。(2)系統(tǒng)的擴(kuò)展與外圍設(shè)備配置的水平應(yīng)充分滿足應(yīng)用系統(tǒng)當(dāng)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)應(yīng)用系統(tǒng)單片機(jī)
- 應(yīng)用單片機(jī)搶答系統(tǒng)設(shè)計(jì)調(diào)試
- 單片機(jī)應(yīng)用系統(tǒng)的設(shè)計(jì)開發(fā)
- 單片機(jī)應(yīng)用綜合系統(tǒng)
- 單片機(jī)課程設(shè)計(jì)---單片機(jī)原理及應(yīng)用
- 單片機(jī)課程設(shè)計(jì)-- 單片機(jī)原理及應(yīng)用
- 單片機(jī)課程設(shè)計(jì)報(bào)告---單片機(jī)秒表系統(tǒng)設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---單片機(jī)病房呼叫系統(tǒng)
- 單片機(jī)課程設(shè)計(jì)--單片機(jī)轉(zhuǎn)速測(cè)量系統(tǒng)
- 單片機(jī)課程設(shè)計(jì)--單片機(jī)io口的應(yīng)用
- 單片機(jī)課程設(shè)計(jì)--基于單片機(jī)的多功能綜合應(yīng)用系統(tǒng)的設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---基于單片機(jī)溫度測(cè)量系統(tǒng)設(shè)計(jì)
- 單片機(jī)原理與應(yīng)用-學(xué)林單片機(jī)
- 單片機(jī)課程設(shè)計(jì)報(bào)告---單片機(jī)控制秒表系統(tǒng)
- 單片機(jī)溫控系統(tǒng)設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--基于單片機(jī)的秒表系統(tǒng)設(shè)計(jì)
- AVR單片機(jī)應(yīng)用設(shè)計(jì).pdf
- AVR單片機(jī)應(yīng)用設(shè)計(jì).pdf
- 單片機(jī)溫度控制系統(tǒng)設(shè)計(jì)分析
- 單片機(jī)基本原理
評(píng)論
0/150
提交評(píng)論