壹、硬件部分
1、MCS-51單片機簡述
MCS51是指由美國INTEL公司(對了,就是大名鼎鼎的INTEL)生產的壹系列單片機的總稱,這壹系列單片機包括了好些品種,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的產品,該系列其它單片機都是在8051的基礎上進行功能的增、減、改變而來的,所以人們習慣於用8051來稱呼MCS51系列單片機,而8031是前些年在我國最流行的單片機,所以很多場合會看到8031的名稱。INTEL公司將MCS51的核心技術授權給了很多其它公司,所以有很多公司在做以8051為核心的單片機,當然,功能或多或少有些改變,以滿足不同的需求,其中89C51就是這幾年在我國非常流行的單片機,它是由美國ATMEL公司開發生產的。以後我們將用89C51、89S51來完成壹系列的實驗。
2、51單片機的結構及其組成
1、中央處理單元(8位)
數據處理、測試位,置位,復位 位操作
2、只讀存儲器(4KB或8KB)
永久性存儲應用程序,掩模ROM、EPROM、EEPROM
3、隨機存取內存(128B、128B SFR)
在程序運行時存儲工作變量和資料
4、並行輸入/輸出口(I / O)(32條)
作系統總線、擴展外存、I / O接口芯片
5、串行輸入/輸出口(2條)
串行通信、擴展I / O接口芯片
6、定時/計數器(16位、加1計數)
計滿溢出、中斷標誌置位、向CPU提出中斷請求,與CPU之間獨立工作
7、時鐘電路
內振、外振。
8、中斷系統
五源中斷、2級優先。
3、51單片機的引腳
(1)引腳功能:
l P0.0~P0.7 P0口8位雙向口線(在引腳的39~32號端子)。
l P1.0~P1.7 P1口8位雙向口線(在引腳的1~8號端子)。
l P2.0~P2.7 P2口8位雙向口線(在引腳的21~28號端子)。
l P3.0~P3.7 P2口8位雙向口線(在引腳的10~17號端子)。
4、51單片機CPU的內部結構
MCS-51中斷系統的結構:
8031單片機的中斷系統簡單實用,其基本特點是:有5個固定的可屏蔽中斷源,3個在片內,2個在片外,它們在程序存儲器中各有固定的中斷入口地址,由此進入中斷服務程序;5個中斷源有兩級中斷優先級,可形成中斷嵌套;2個特殊功能寄存器用於中斷控制和條件設置的 編程。
5、中斷系統的結構:
5個中斷源的符號、名稱及產生的條件如下。
INT0:外部中斷0,由P3.2端口線引入,低電平或下跳沿引起。
INT1:外部中斷1,由P3.3端口線引入,低電平或下跳沿引起。
T0:定時器/計數器0中斷,由T0計滿回零引起。
T1:定時器/計數器l中斷,由T1計滿回零引起。
TI/RI:串行I/O中斷,串行端口完成壹幀字符發送/接收後引起。
整個中斷系統的結構框圖見下圖壹所示。
由圖壹可見,外部中斷有下跳沿引起和低電平引起的選擇;串行中斷有發送(TI)相接收(R1)的區別;各個中斷源打開與否,受中斷自身的允許位和全局允許位的控制,並具有高優先級和低優先級的選擇。
6、什麽是單片機系統
單片機最小系統,或者稱為最小應用系統,是指用最少的元件組成的單片機可以工作的系統.
對51系列單片機來說,最小系統壹般應該包括:單片機、晶振電路、復位電路.
給出壹個51單片機的最小系統電路如圖所示.
圖2.2 單片機的最小系統電路圖
復位電路:由電容串聯電阻構成,由圖並結合"電容電壓不能突變"的性質,可以知道,當系統壹上電,RST腳將會出現高電平,並且,這個高電平持續的時間由電路的RC值來決定.典型的51單片機當RST腳的高電平持續兩個機器周期以上就將復位,所以,適當組合RC的取值就可以保證可靠的復位.壹般教科書推薦C 取10u,R取8.2K.當然也有其他取法的,原則就是要讓RC組合可以在RST腳上產生不少於2個機周期的高電平.至於如何具體定量計算,可以參考電路分析相關書籍.
晶振電路:典型的晶振取11.0592MHz(因為可以準確地得到9600波特率和19200波特率,用於有串口通訊的場合)/12MHz(產生精確的uS級時歇,方便定時操作)
7、部分電路功能
(1)晶振電路如圖所示。
圖2.3 晶振電路圖
(2)復位電路如圖所示。
圖2.4 復位電路圖
8、元件及硬件電路
(1)元件清單
名稱 數量(個)
兩位***陰數碼管 3
按鍵 4
鎖存器74hc573 2
排阻10k 1
晶振12MHZ 1
無極電容30pf 2
電解電容22uf 1
電阻200Ω、1k 各1
電源接口 1
AT89S51單片機 1
(2)PROTEUS 仿真圖
二、軟件部分
1、設計基本要求
(1)不同情況有不同收費
白天 1元/公裏
晚上 2元/公裏
途中等待(>30秒) 1元/30秒
(2)數據輸出(6個LED數碼管顯示)
單價(元)輸出2位
路程(公裏)輸出2位
總金額(元)輸出2位
2、輸入輸出口分配
如下圖:
3、程序流程圖
4、程序
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar lg,ls,jgg,jgs,jbg,jbs,jwg,jws;
uint lz,jz,dai;
sbit mm1=P1^0;
sbit mm0=P1^1;
sbit weed=P1^2;
sbit dued=P1^3;
bit mm7;//白晚標誌位
void display();
void dely(uint a);
void chu()
{
P1=0XFF;
P0=0XFF;
jbg=1;
jbs=0;
jwg=2;
jws=0;
jgg=3;
jgs=0;
lg=0;
ls=0;
jz=3;dai=0;
TMOD=0x16;
IT0=1;
TH1=0X3c;
TL1=0XB0;
TH0=245;
TL0=245;
PT1=1;
EX0=1;
ET0=1;
ET1=1;
EA=1;
if(mm1==0)
mm7=1;
display();
}
void display()
{
weed=1;
P0=0XFE;
weed=0;
dued=1;
if(mm7==1)
P0=tab[jwg];
else P0=tab[jbg];
dued=0;
dely(5);
dued=1;
P0=0X00;
dued=0;//單價個位
weed=1;
P0=0Xfd;
weed=0;
dued=1;
if(mm7==1)
P0=tab[jws];
else P0=tab[jbs];
dued=0;
dely(5);
dued=1;
P0=0X00;
dued=0;//單價十位
weed=1;
P0=0Xfb;
weed=0;
dued=1;
P0=tab[lg];
dued=0;
dely(5);
dued=1;
P0=0X00;
dued=0;//路程個位
weed=1;
P0=0Xf7;
weed=0;
dued=1;
P0=tab[ls];
dued=0;
dely(5);
dued=1;
P0=0X00;
dued=0;//路程十位
weed=1;
P0=0Xef;
weed=0;
dued=1;
P0=tab[jgg];
dued=0;
dely(5);
dued=1;
P0=0X00;
dued=0;//付錢個位
weed=1;
P0=0Xdf;
weed=0;
dued=1;
P0=tab[jgs];
dued=0;
dely(5);
dued=1;
P0=0X00;
dued=0;//付錢十位
dely(5);
}
void waibu0 (void) interrupt 0
{
dai=0;
}
void timer0 (void) interrupt 1
{
lz=lz+1;
ls=lz/10;
lg=lz%10;
if(mm7==1)
jz=jz+2;
else jz=jz+1;
jgs=jz/10;
jgg=jz%10;
}
void timer1 (void) interrupt 3
{
TH1=0X3c;
TL1=0XB0;
dai=dai+1;
if(dai==600)
{
if(mm7==1)
jz=jz+2;
else jz=jz+1;
jgs=jz/10;
jgg=jz%10;
dai=0;
}
}
void main()
{
chu();
if(mm1==0)
mm7=1;
else mm7=0;
while(mm0==0)
{
TR0=1;
TR1=1;
display();
}
}
void dely(uint a)
{
uint x,y;
for(x=a;x>0;x--)
for(y=122;y>0;y--);
}
5、調試過程中遇到的問題及解決
(1)問題
1、數碼管顯示數字時壹閃壹閃看的眼睛不舒服
2、只能顯示1、5、6、7、8、9其他數字顯示不全
(2)解決
1、數碼管顯示數字時壹閃壹閃主要是因為數碼動態掃描時頻率慢把短延時時間參數從5改為3就解決了
2、只能顯示數1、5、7、8、9其他數字顯示不全剛開始以為是碼寫錯了,把程序看壹遍後發現沒什麽問題;再看是否是數碼管管腳接錯,用數字測壹遍後也沒出現問題;當時就不知道怎麽辦了,後來拿個表把數碼管管腳亂測壹通,發現壹個數碼有兩個管腳給短接起了,把那兩個管腳的先拆下從新焊接上後再試壹遍竟然能夠全部顯示出來了。
三、參考文獻
[1]徐煜明 編著《C51單片機及應用系統設計》 北京:電子工業出版社,2009.2
[2]陳寧 王文寧 編著 《單片機項目教程》南京:東南大學出版社,2008.9
[3]何立民 編著《單片機高級教程》北京:北京航空航天大學出版社,2001
[4]郭天祥 錄制 《十天學會單片機和C語言》