




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、東北大學(xué)課程設(shè)計 任務(wù)書 東北大學(xué)課程設(shè)計 第一章 概述第一章 概述1.1 設(shè)計意義出租車的計價器應(yīng)用很廣,平時比較常見,理解較為深入,適合作為編程聯(lián)系的例子。在設(shè)計中能夠更加透徹的理解和較為全面的考慮各種情況。通過這次的練習(xí),可以加深對單片機應(yīng)用了解,更能靈活的使用51系列單片機的資源解決實際問題。1.2系統(tǒng)功能上車按鍵后開始計價。有實時時鐘、單價、距離和總價錢顯示。可以通過鍵盤修改單價(元/公里)和時間。有清除鍵用以清楚上次費用。利用LCD分別顯示時間、單價、路程和費用。LED輔助顯示說做操作。主要方法:原理是,價格=速度´時間´單價;采用直流電機測速單元模擬出租車速度
2、,通過光電耦合A/D轉(zhuǎn)換進行速度采樣,利用單片機的定時器/計數(shù)器定時和計數(shù),用LED數(shù)碼管或LCD顯示總價和時間,并通過鍵盤進行單價設(shè)定及時間顯示。附加功能:當出租車速度低于某一設(shè)定值時,自動進行計數(shù),當計時每達到1分鐘時,價格按照1公里長度計。1.3 功能詳述1.3.1 按鍵09數(shù)字鍵;B:開始計價;C:清除數(shù)據(jù);D:(P)設(shè)置單價鍵,按一次后,再按數(shù)字鍵進行設(shè)置;E: (T) 設(shè)置時間鍵,按一次后,再按數(shù)字鍵進行設(shè)置;F/A:完成設(shè)置鍵。1.3.2 操作流程 程序運行后,時間照常顯示。此時可以進行單價和時間的設(shè)置。按B鍵開始計價,運行中也可以進行單價和時間的設(shè)置。按C鍵清除上次費用和路程1
3、.4系統(tǒng)所涉及模塊1.4.1 定時器與計數(shù)器 利用模擬直流定動機模擬出租車,轉(zhuǎn)盤上有孔,利用光電轉(zhuǎn)換變成電脈沖。利用計數(shù)器進行計數(shù),定時器進行定時。1.4.2 路程和費用計算根據(jù)計數(shù)值和計時時間換算出速度,乘以單價得出單位計時間隔的費用,加上以前的費用得出即時費用。即路程=計數(shù)個數(shù)*計時間隔/轉(zhuǎn)盤上孔的個數(shù)。即時費用=路程*價格。1.4.3 實時時鐘出租車上的顯示器上要求有時鐘,選擇DS12887時鐘芯片作為時鐘控制單元。1.4.4 鍵盤及LED上車開始計價,數(shù)據(jù)清除,單價及時間的修改都需要使用鍵盤,數(shù)字加上功能鍵共計15個,因此使用8279來管理4×4鍵盤及輔助顯示的8位LED。8
4、279 是一種通用的可編程的鍵盤/顯示器接口器件,可對64 個開關(guān)組成的鍵盤矩陣進行自動掃描,接收鍵盤上的輸入信息,并在有鍵輸入時向單片機請求中斷,還能對8 位或16位LED 自動掃描,使顯示緩沖器的內(nèi)容在LED 上顯示出來。利用8279 對鍵盤/顯示器的自動掃描,可以減輕CPU 負擔(dān),具有顯示穩(wěn)定、程序簡單、不會出現(xiàn)誤動作等特點。利用8279芯片管理鍵盤,可有效減輕單片機I/O資源負擔(dān)。鍵盤由74LS138譯碼掃描,當有按鍵時,有8279自行編值,并引發(fā)外中斷。在中斷程序中讀取鍵值。8279采用單±5V電源供電,40腳封裝。其具體管腳介紹如下: DB0DB7:雙向數(shù)據(jù)總線,用來傳送
5、8279與CPU之間的數(shù)據(jù)和命令。 CLK:時鐘輸入線,用以產(chǎn)生內(nèi)部定時的時鐘脈沖。 RESET:復(fù)位輸入線,8279復(fù)位后被置為字符顯示左端輸入,二鍵閉鎖的觸點回彈型式,程序時鐘前置分頻器被置為31,RESET信號為高電平有效。 CS:片選輸入線,低電平有效,單片機在CS端為低時可以對8279讀/寫操作。 A0:緩沖器低位地址,當A0為高電平時,表示數(shù)據(jù)總線上為命令或狀態(tài), 當為低電平時,表示數(shù)據(jù)總線上為命令或狀態(tài),當為低電平時,表示數(shù)據(jù)總線上為數(shù)據(jù)。 RD:讀信號輸入線,低電平有效,將緩沖器讀出,數(shù)據(jù)送往外部總線。 WR:寫信號輸入線,低電平有效,將緩沖器讀出,將數(shù)據(jù)從外部數(shù)據(jù)總線寫入82
6、79的緩沖器。1.4.5 LCD液晶顯示器 時鐘、單價、路程及費用需要使用液晶顯示器來顯示,選用RT12864hz液晶顯示器。各種參數(shù)經(jīng)過處理后用它來顯示。RT12864HZ漢字圖形點陣液晶顯示模塊可顯示漢字和圖形。內(nèi)置8192個中文漢字 (16 x16 點陣)、 128個字符(8X16點陣)及64X256點陣顯示(用子圖形)。模塊由20個引腳與外界電路相連,其中8條數(shù)據(jù)線, 5條控制線,3條電源線,2條背光電源線,2條沒定義。文本顯示RAM提供8個,4行的漢字空間,當寫入文本顯示RAM時,可以分別顯示CGROM、HCGROM和CGRAM字型。HCGROM為半寬字型(8 x 16點陣),CGR
7、OM為中文字型,CGRAM為自定義的中文字型。三種字型的選擇由寫入DDRAM的編碼選擇- 21 -東北大學(xué)課程設(shè)計 第三章 軟件設(shè)計流程及描述第二章 硬件設(shè)計2.1 硬件原理圖簡圖圖2.1 硬件簡圖2.2 簡要說明1. 外部測速單元有模擬直流電動機(通過直流電機測速以及對速度進行采樣)和光電耦合器組成,輸出脈沖信號由計數(shù)器輸入單片機進行處理,其中電動機速度可調(diào);2. 4×4鍵盤和8位LED由8279管理,IRQ接INT0,CLK接ALE,鍵盤由十個數(shù)字鍵和五個功能鍵組成,其中一個鍵重復(fù)定義,LED用字母和數(shù)字顯示表示當前的狀態(tài)、進行的操作以及輸入的數(shù)據(jù)。第三章 軟件設(shè)計流程及描述3.
8、1 主函數(shù)程序流程圖先進行初始化,顯示計價初始值,然后等待開始計價或者進行設(shè)置。計價分兩種情況:速度超過設(shè)定值時,按當時速度進行計價;速度低于設(shè)定值時,自動進行計數(shù),當計數(shù)每達到一分鐘時,價格按照一公里長度計。修改分、修改時間和單價。清零用于清除當前路程和費用,以便進行下次計價。3.2 定時器中斷服務(wù)程序流程圖關(guān)計數(shù)器 關(guān)定時器提取數(shù)據(jù)設(shè)置計數(shù)/定時常數(shù)開計數(shù)器 開定時器進入中斷中斷返回 在定時時間內(nèi)記錄脈沖個數(shù),賦給全局變量,用于計算速度。3.3 按鍵中斷服服務(wù)程序流程圖讀取鍵值 轉(zhuǎn)換, 通過全局變量送至主函數(shù)置位相應(yīng)標志位在LED上顯示操作進入中斷中斷返回回回讀取鍵值,轉(zhuǎn)換為可用數(shù)據(jù),并且
9、置位相應(yīng)標志位,為以后操作做好準備。然后根據(jù)狀態(tài)在LED上顯示相應(yīng)操作。3.4 時鐘芯片中斷服務(wù)程序低速計數(shù)值加一關(guān)中斷取時間(時,分,秒)開中斷中斷返回進入中斷斷由于DS12887時鐘芯片一秒鐘產(chǎn)生一次中斷,因此低速計數(shù)在這里進行計數(shù)。讀取時間數(shù)值,賦給全局變量進行處理。東北大學(xué)課程設(shè)計 第四章 源程序代碼第四章 源程序代碼#include<reg51.h>#include <math.h>#include <intrins.h>#include <absacc.h>#define uchar unsigned char#define uint
10、 unsigned int/* DS12887實時時鐘時間地址設(shè)置 */#define second XBYTE 0x6000 /* 秒寄存器地址 */#define sec_alarm XBYTE 0x6001#define minute XBYTE 0x6002 /* 分寄存器地址 */#define min_alarm XBYTE 0x6003#define hour XBYTE 0x6004 /* 小時寄存器地址 */#define week XBYTE 0x6006 /* 星期寄存器地址 */#define date XBYTE 0x6007 /* 日期寄存器地址 */#define
11、 month XBYTE 0x6008 /* 月寄存器地址 */#define year XBYTE 0x6009 /* 年寄存器地址 */#define rega XBYTE 0x600A /* A寄存器地址 */#define regb XBYTE 0x600B /* B寄存器地址 */#define regc XBYTE 0x600C /* C寄存器地址 */#define regd XBYTE 0x600D /* D寄存器地址 */* RT12864HZ漢字圖形點陣液晶地址設(shè)置 */#define w_c_add XBYTE0x2070 /* 寫命令字地址 */#define w_d_
12、add XBYTE0x2071 /* 寫數(shù)據(jù)地址 */#define r_s_add XBYTE0x2072 /* 讀狀態(tài)字地址 */ #define r_d_add XBYTE0x2073 /* 讀數(shù)據(jù)地址 */#define COM XBYTE0x2021 /*8279命令口 */#define DAT XBYTE0x2020 /*8279數(shù)據(jù)口 */ #define L 1 /*長度系數(shù) */#define TI 50 /*分度數(shù)*/#define HN 30 /*孔個數(shù) */ #define LOW 30 /*最低速度 */uchar xdata key; /*鍵值 */uint id
13、ata num=0; /*計數(shù)值 */ uint xdata a=1,b=0;uint idata len,fa,m,n,o,p,q,r,s,t,COUT,CLO;uint idata h1,h2,m1,m2,s1,s2; /*時鐘參數(shù)*/ uint idata price=10,fate=00,length=0,leng;uint idata state=0,clear=1,begin=0,pri,tim,tt=0,cc=0;nn=0;/*幾個狀態(tài)標志位*/ /*設(shè)置,清除,開始計價,單價修改,時間修改,兩位數(shù)監(jiān)視,六位數(shù)監(jiān)視,數(shù)字標志*/unsigned char bdata status
14、; /* lcd可位尋址片內(nèi)數(shù)據(jù)存儲器,允許位與字節(jié)混合訪問 */sbit busy=status7; /*lcd“忙”線的第7位*/uchar bdata sta_8279; /*8279*/sbit du=sta_82797; /* 8279方式設(shè)置命令字 */unsigned char rflag;unsigned char bdata sta_ds;sbit uip=sta_ds7;uchar ds_h,ds_m,ds_s,ds_t;unsigned char bdata ds_time;unsigned char code NO10=0xB0,0xB1,0xB2,0xB3,0xB4,
15、0xB5,0xB6,0xB7,0xB8,0xB9;uchar code tab16=0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F, 0x71,0x7C,0x39,0x73,0x31,0x71;/* 0F的字型編碼*/uchar xdata hz216=0xB5,0xA5,0xBC,0xDB,0xA3,0xBA,0x20,0x20,0x20,0x20, /* 單 價 : 空 空 */ 0xA3,0xB0,0xA3,0xB0,0xD4,0xAA; /* N N 元 */ uchar xdata hz316=0xBE,0xE0,0xC0,0xEB
16、,0xA3,0xBA,0xA3,0xB0,0xA3,0xB0, /* 距 離 : 空 N */ 0xA3,0xB0,0xA3,0xB0,0x4B,0x4D; /* N N k m */uchar xdata hz416=0xBC,0xDB,0xC7,0xAE,0xA3,0xBA,0xA3,0xB0,0xA3,0xB0, /* 價 格 : N N */ 0xA3,0xB0,0xA3,0xB0,0xD4,0xAA; /* N N 元 */ uchar xdata hz516=0x20,0x20,0xCA,0xE4,0xC8,0xEB,0xC1,0xBD,0xCE,0xBB, /* 空 輸 入 兩
17、位 */ 0xB5,0xA5,0xBC,0xDB,0x20,0x20; /* 單 價 空 */uchar xdata hz616=0x20,0x20,0x20,0x20,0xA3,0xBA,0xA3,0xB0,0xA3,0xB0, /* 空 空 : N N */ 0xD4,0xAA,0xA3,0xAF,0x4B,0x4D; /* 元 / k m */ void initial (void);void delay(void);void check_lcd(void);void show_lcd(uchar *,uchar *,uchar *);void lcd_busy(void); /*LCD
18、忙狀態(tài)檢測函數(shù) */void compute(void);void change_pri(void);void change_time(void);void clock(void);void check_ds12887(void);void e(void)w_c_add=0x80;delay;lcd_busy();w_d_add=0xCA;lcd_busy();w_d_add=0xE4;lcd_busy();w_d_add=0xC8;lcd_busy();w_d_add=0xEB;lcd_busy();w_d_add=0xB4;lcd_busy();w_d_add=0xED;lcd_busy(
19、);w_d_add=0xCE;lcd_busy();w_d_add=0xF3;lcd_busy();w_d_add=0x20;lcd_busy();w_d_add=0x20;lcd_busy();w_d_add=0x20;lcd_busy();w_d_add=0x20;lcd_busy();w_d_add=0x20;lcd_busy();w_d_add=0x20;lcd_busy();w_d_add=0x20;lcd_busy();w_d_add=0x20;h1=0;h2=0;m1=0;m2=0;s1=0;s2=0;cc=0;delay();delay();delay();delay();de
20、lay();delay(); main() uint inf=0; initial(); show_lcd(hz2,hz3,hz4); while(1) clock(); if(begin=1) if(inf=0) fate=20; inf=1; if(state=0) if(num>=LOW) COUT=0; price=a*10+b; len+=num*L/HN; if(len/TI>=0) leng=len/TI; len%=TI; fa=leng*price; length+=leng; leng=0; fate+=fa; else if(COUT>=120) len
21、gth+; fate+=(10*a+b); COUT=0; compute(); show_lcd(hz2,hz3,hz4); else if(pri=1) change_pri(); if(tim=1) change_time(); if(clear=1) length=0; fate=0; inf=0; compute(); show_lcd(hz2,hz3,hz4); if(pri=1) change_pri(); if(tim=1) change_time(); /while(1)/main /*以下是程序(包括中斷)*/void keybord(void) interrupt 0 u
22、sing 1 uchar keyboard=0; EX0=0; COM=0x50; keyboard=DAT; keyboard &=0x0f; /* 保留低四位 */ switch(keyboard) case 0x0: key=0; tt+;nn=1;cc+; break; case 0x1: key=1; tt+;nn=1;cc+; break; case 0x2: key=2; tt+;nn=1;cc+; break; case 0x3: key=3; tt+;nn=1;cc+; break; case 0x4: key=4; tt+;nn=1;cc+; break; case
23、 0x5: key=5; tt+;nn=1;cc+; break; case 0x6: key=6; tt+;nn=1;cc+; break; case 0x7: key=7; tt+;nn=1;cc+; break; case 0x8: key=8; tt+;nn=1;cc+; break; case 0x9: key=9; tt+;nn=1;cc+; break; case 0x0B: key=11;COUT=0; begin=1;clear=0;nn=0;break; /*B begin*/ case 0x0C: key=12; clear=1;begin=0;nn=0;break; /
24、*C clear*/ case 0X0D: key=13; state=1;pri=1;tim=0;nn=0;break; /*D set price*/ case 0x0E: key=14; state=1;tim=1;pri=0;nn=0;break; /*E set time*/ default: key=15; nn=0;break; /*F finish*/ keyboard=tabkeyboard; if(pri=1) if(nn=0) COM=0x80+8; else COM=0x80+4+tt; if(tim=1) if(nn=0) COM=0x80+8; else COM=0
25、x80+1+cc; DAT=keyboard; EX0=1;void int1serve() interrupt 2 using 2unsigned char temp2;COUT+; EX1=0;rflag=1;sta_ds=rega;while(uip);ds_h=hour;ds_m=minute;ds_s=second;temp2=regc;rflag=0;EX1=1;void timer(void) interrupt 3 using 3 TR1=0; TR0=0; num=TH0*256+TL0; TH0=0; TL0=0; TH1=-(50000/256); TL1=-(50000
26、%256); CLO+; TR1=1; TR0=1; void initial(void) COM=0xd1; /* 清除顯示*/ ACC=DAT; if(ACC1); /* P奇偶標志。若值為1的位數(shù)為奇數(shù),則P置位,否則清除 */ COM=0x00; /* 8字符顯示左入口 */ COM=0x34; /* 34次分頻*/ TMOD=0X15; TH0=0; TL0=0; TH1=-(50000/256); TL1=-(50000%256); TR0=1; TR1=1; EA=1; EX0=1; EX1=1; ET1=1; check_ds12887();void delay(void) u
27、nsigned char i,j; for(i=0;i<100;i+) for(j=0;j<150;j+) ; ; void check_lcd(void) uint i; lcd_busy();w_c_add=0x30;/* 功能設(shè)置:8位數(shù)據(jù) */for(i=0;i<255;i+)lcd_busy();w_c_add=0x0c; /* 顯示狀態(tài):整體顯示,游標位置無效*/lcd_busy();w_c_add=0x01;/* 清除顯示:將DDRAM填滿“20H”,并且設(shè)定DDRAM的地址計數(shù)器到“00”*/lcd_busy();w_c_add=0x02;/* 地址歸位:設(shè)定
28、DDRAM的地址計數(shù)器到“00”,將游標移到開頭原點位置 */void show_lcd (uchar *b1,uchar *c1,uchar *d1)unsigned char add;unsigned char i; check_lcd(); lcd_busy();add=0x90; /* 設(shè)置顯示坐標,90H對應(yīng)字符的第二行第一列 */ lcd_busy();w_c_add=add; /* 送命令 */for(i=0;i<8;i+) lcd_busy(); w_d_add=b12*i; lcd_busy(); w_d_add=b12*i+1; add=0x88; /* 設(shè)置顯示坐標
29、,88H對應(yīng)字符的第三行第一列 */ lcd_busy();w_c_add=add; /* 送命令 */for(i=0;i<8;i+) lcd_busy(); w_d_add=c12*i; lcd_busy(); w_d_add=c12*i+1; add=0x98; /* 設(shè)置顯示坐標,98H對應(yīng)字符的第四行第一列 */ lcd_busy();w_c_add=add; /* 送命令 */for(i=0;i<8;i+) lcd_busy(); w_d_add=d12*i; lcd_busy(); w_d_add=d12*i+1; delay(); clock();void lcd_b
30、usy(void) /*LCD忙狀態(tài)檢測函數(shù) */do status=r_s_add; /* 讀狀態(tài)字地址的第7位 */while(busy);void compute(void) uint f1,l1; f1=fate; l1=length; p=l1%10; /*數(shù)字位拆分*路程*/ l1/=10; o=l1%10; l1/=10; n=l1%10; l1/=10; m=l1%10; t=f1%10; /*數(shù)字位拆分*價錢*/ f1/=10; s=f1%10; f1/=10; r=f1%10; f1/=10; q=f1%10; hz211=hz213=0xB0; /*清零*/ hz39=h
31、z311=hz313=0xB0; hz49=hz411=hz413=0xB0; hz211+=a; /*賦值*/ hz213+=b; hz37+=m; hz39+=n; hz311+=o; hz313+=p; hz47+=q; hz49+=r; hz411+=s; hz413+=t; void change_pri() show_lcd(hz2,hz5,hz6); if(key=15) /15 -> Finish COM=0xd1; /* 清除顯示*/ pri=0; state=0; tt=0; hz211=hz67; hz213=hz69; show_lcd(hz2,hz3,hz4);
32、 else if(nn) if(tt=1) a=key; if(tt=2)b=key;tt=0; hz67=0xB0; hz67+=a; hz69=0xB0; hz69+=b; show_lcd(hz2,hz5,hz6); void change_time(void) uint hh,mm,ss,temper; if(key=15) tim=0; state=0; cc=0; tt=0; COM=0xd1; /* 清除顯示*/ else if(nn) if(cc=1) h1=key;if(h1>2)e();/*cc=0;h1=0;*/ if(cc=2) h2=key;if(h1=2)&a
33、mp;&(h2>3)e();/*cc=0;h2=0;h1=0;*/ if(cc=3) m1=key;if(m1>=6)e();/*cc=0;m1=0;h2=0;h1=0;*/ if(cc=4) m2=key; if(cc=5) s1=key;if(s1>=6)e();/*cc=0;s1=0;m1=0;h2=0;h1=0;m2=0;*/ if(cc=6) s2=key;cc=0; temper=h1*16; hh=temper|h2; temper=m1*16; mm=temper|m2; temper=s1*16; ss=temper|s2; hour=hh; minute=mm; s
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)療行業(yè)中的數(shù)字化人才發(fā)展與培養(yǎng)
- 票務(wù)代理電子客票系統(tǒng)應(yīng)用考核試卷
- 紙張的老化機理與防護考核試卷
- 連續(xù)搬運設(shè)備環(huán)境適應(yīng)性測試考核試卷
- 窄軌機車車輛關(guān)鍵性能指標考核試卷
- 糕點店品牌定位與市場推廣策略考核試卷
- 期貨市場交易員職業(yè)技能提升考核試卷
- 畜牧機械人機工程考核試卷
- 蜜柚土壤改良技術(shù)考核試卷
- 車庫玻璃屋頂考核試卷
- DB32T 2334.4-2013 水利工程施工質(zhì)量檢驗與評定規(guī)范 第4部分 電氣設(shè)備與自動化
- 導(dǎo)尿術(shù)課件完整版
- 寧夏銀川市一中2025屆高考數(shù)學(xué)押題試卷含解析
- 院感防控應(yīng)急演練方案
- 高考3500詞匯表(完整版)
- 中國咳嗽基層診療與管理指南(2024年)解讀
- 2024年度-工程造價培訓(xùn)課件全新
- 13馬爾可夫鏈公開課獲獎?wù)n件
- 江蘇省高速公路施工標準化技術(shù)指南-工地建設(shè)篇
- 銀行行長任職表態(tài)發(fā)言稿(7篇)
- 中國急性缺血性卒中診治指南(2023版)
評論
0/150
提交評論