一、 系統設計 該搶答器系統的設計是以單片機為中心控制模塊,采用模塊化設計的八路搶答器,具有五個模塊,分別為:按鍵輸入模塊、顯示模塊、時鐘與復位模塊、核心控制模塊、報警模塊。 1.1按鍵輸入模塊 按鍵輸入模塊共有14個按鍵,分為搶答按鍵和控制按鍵。搶答按鍵共有八個,分別為S0―S7,供搶答選手進行搶答使用,P2.0-P2.7口為八個按鍵搶答信號的輸入口,低電平有效。控制按鍵有4個,分別為 “加時間”“減時間”“開始鍵”“復位鍵”,其對應的I∕O接口分P1.0,P1.1,P1.2和P1.3。 1.2顯示模塊 顯示模塊既可以選用液晶顯示器,也可以選用數碼管顯示。我們采用的是液晶顯示電路來搶答選手及時間。 1.3時鐘與復位模塊 時鐘與復位模塊包括時鐘電路和復位電路,單片機的最小系統就是由時鐘電路、復位電路、電源電路及單片機構成。單片機的時鐘信號用來提供單片機片內各種操作的時間基準,單片機的時鐘信號通常用兩種電路形式得到:內部振蕩方式和外部振蕩方式。復位操作則使單片機的片內電路初始化,使單片機從一種確定的初態開始運行。根據應用的要求,復位操作通常有兩種基本形式:上電復位或開關復位。當5l系列單片機的復位引腳RST(全稱RESET)出現2個機器周期以上的高電平時,單片機就執行復位操作。如果RST持續為高電平,單片機就處于循環復位狀態。 1.4核心控制模塊 核心控制模塊就是人們所謂的CPU,它是整個系統的總控制部分,本系統的核心控制模塊為51系列的單片機,只有我們通過軟件程序的編寫,并將程序寫入單片機,該系統才會正確的工作。 主控制器選擇即為單片機的選擇,單片機實際上就是把CPU、RAM、ROM、定時器/計數器、I/O接口電路等微型機的主要部件集成在一塊芯片上,因此稱之為單片機。 AT89C51單片機主要有以下部件構成:八位微處理器CPU、振蕩電路、總線控制部件、中斷控制部件、片內Flash存儲器、片內RAM、并行I/O接口、定時器和串行I/O接口。AT89C51單片機內部由CPU、4KB的FPEROM ,128B的RAM,兩個16位的定時/計數器T0和T1,4個8位的I/O端P0、P1、P2、P3等組成。單片微機內部最核心的部分是CPU,CPU按其功能可分為運算器和控制器兩部分。控制器由程序計數器PC、指令儲存器、指令譯碼器、實時控制與條件轉移邏輯電路等組成。它的功能是對來自存儲器中的指令進行譯碼,通過實時控制電路,在規定的時刻發出各種操作所需的內部和外部的控制信號,使各部分協調工作,完成指令所規定的操作。運算器由算術邏輯器部件ALU、累加器ACC、暫存器、程序狀態字寄存器PSW,BCD碼運算調整電路等組成。為了提高數據處理和位操作功能,片內增加了一個通用寄存器B和一些專用寄存器,還增加了位處理邏輯電路的功能。 1.5報警模塊 報警電路用于報警,當遇到報警信號時,發出警報。報警模塊是由一個NPN型的三極管和一個喇叭組成的。 二、系統硬件設計 2.1核心控制模塊設計 單片機的最小系統就是由時鐘電路、復位電路、電源電路及單片機構成。如圖1。 圖1
2.2按鍵輸入模塊設計 鍵盤在單片機應用系統中能實現向單片機輸入數據、傳送命令功能,是人工干預單片機的主要手段。鍵盤實質上是一組按鍵開關集合。通常鍵盤所用開關為機械彈性開關,均利用了機械觸點的合、斷作用。鍵的閉合與否,反映在輸出電壓是呈現高電平或低電平,如果高電平表示斷開的話,那么低電平則表示鍵閉合,所以通過對電平高低狀態的檢測,便可確認按鍵按下與否。為了確保CPU對一次按鍵動作只確認一次按鍵,必須消除抖動的影響,這樣才能使鍵盤在單片機系統中的使用得更加穩定。 搶答器的輸入按鈕使用常開開關。這些常開開關組成了搶答按鍵,硬件電路簡單,在程序設計上也不復雜,只要在程序中消除在按鍵過程中產生的“毛刺”現象就可以了。這里采用最常用的方法即延時法,其的原理為:因為“毛刺”脈沖一般持續時間短,約為幾ms,而按鍵的時間一般遠遠大于這個時間,所以當單片機檢測到有按鍵動靜后再延時一段時間(這里取10ms)后再判斷此電平是否保持原狀態,如果是則為有效按鍵,否則無效。 AT89C51單片機P2.0-P2.7端口分別與S0-S7按鈕相連對應8個不同的選手的搶答按鍵。選手通過搶答按鍵進行搶答,單片機接收信號后內部進行處理并在顯示屏上顯示選手編號。內部進行鎖存。如圖2.2所示。 圖2.2 2.3顯示模塊設計 在單片機的應用系統中,顯示器是最常見的輸出設備,也是人機對話必不可少的部分。顯示電路運用的是LCD顯示器,如圖2.3.1所示 圖2.3.1 引腳圖如圖2.3.2所示 圖2.3.2 端口定義:RS為寄存器選擇,高電平1時選擇數據寄存器、低電平0時選擇指令寄存器。RW為讀寫信號線,高電平(1)時進行讀操作,低電平(0)時進行寫操作。E(或EN)端為使能(enable)端,高電平(1)時讀取信息,負跳變時執行指令。D0~D7為8位雙向數據端。VEE為液晶對比度調整端,接正電源時對比度最弱,接地電源時對比度最高,對比度過高時會產生“鬼影”,使用時通過接一個10K的電位器調整對比度。 2.4時鐘電路 單片機必須在時鐘的驅動下才能工作。AT89C51單片機的時鐘產生方法有兩種:內部時鐘方式和外部時鐘方式。無論何種形式,都需要外部附加電路,產生時鐘脈沖。
外部時鐘方式就是直接將外部的振蕩脈沖通過XTALl或XTAL2接入單片機,外部時鐘方式多用于多機系統,以便各個單片機能夠同時工作。對外部震蕩信號無特殊要求,但需保證脈沖寬度不小于20ns,且頻率應低于單片機所支持的最高頻率。
內部時鐘方式就是利用單片機芯片內部的振蕩器,通過在引腳XTALl和XTAL2兩端跨接晶體振蕩器,構成穩定的自激振蕩器的方法,再由獲得的自激振蕩器發出穩定的脈沖,直接送入芯片內部的時鐘電路的方式。跨接的晶體振蕩器如果已經起振,則會向XTAL2引腳上輸出一定幅值的正弦波。自激振蕩器的頻率取決于晶體振蕩器的頻率,常見的晶體振蕩器頻率有6MHz和12MHz。 本系統中采用的是內部時鐘方式。時鐘電路如圖2.4所示。 圖2.4 從時鐘電路的示意圖中可以看到,單片機所跨接的晶體振蕩器旁邊還有兩個電容器C2和C3。C2和C3被稱為諧振電容,主要作用有兩點:一是可以促使單片機系統快速起振;二是C2、C3具有對頻率進行微調作用,有利于單片機系統振蕩頻率的穩定,維持單片機的正常運行。諧振電容的容值選擇,與所用的晶體振蕩器的頻率值有關。晶體振蕩器的振蕩頻率越高,相應的諧振電容的容值也要提高。二者如果配合的好,可以發揮諧振電容的積極作用。反之,自激振蕩器頻率的穩定性將受到影響。經過大量的實際應用,晶體振蕩器的頻率與諧振電容的容值之間形成了一定的固定搭配。例如:當晶體振蕩器的頻率為12MHz時,諧振電容的容值一般為30pF左右。
單片機在工作時,由內部振蕩器產生或由外直接輸入的送至內部控制邏輯單元的時鐘信號的周期稱為時鐘周期。其大小是時鐘信號頻率的倒數,常用T=1/fosc表示。圖中時鐘頻率為12MHz,即fosc=12MHz,則時鐘周期為1/12μs。此電路在加電大約延遲10ms后振蕩器起振,在XTAL2引腳產生幅度為3V左右的正弦波時鐘信號。
為了減小寄生電容,更好地保證振蕩器穩定、可靠地工作。在設計電路板時,晶體振蕩器和諧振電容的位置應盡可能地靠近單片機的XTALl和XTAL2引腳 。 2.5復位電路 使CPU進入初始狀態,從0000H地址開始執行程序的過程叫系統復位。單片機本身不能自動進行復位,必須配合相應的外部復位電路才能實現。從實現系統復位的方法來看,系統復位可分為硬件復位和軟件復位。
硬件復位必須通過CPU外部的硬件電路給CPU的RESET端加上足夠時間的高電位才能實現。上電復位,人工按鈕復位和硬件看門狗復位均為硬件復位。硬件復位后,各專用寄存器的狀態均被初始化,且對片內通用寄存器的內容沒有影響。
軟件復位就是用一系列指令來模擬硬件復位功能,最后通過轉移指令使程序從0000H地址開始執行。對各專用寄存器的復位操作是容易的,也沒有必要完全模擬,可根據實際需要去主程序初始化過程中完成。而對中斷激活標志的清除工作常被遺忘,因為它沒有明確的位地址可供編程。有的編程人員用020000(LJMP 0000H)作為軟件陷阱,認為直接轉向0000H地址就完成了軟件復位,就是這類錯誤的典型代表。軟件復位是使用軟件陷阱和軟件看門狗后必須進行的工作,這時程序出錯完全有可能發生在中斷子程序中,中斷激活標志已置位,它將阻止同級中斷響應。由于軟件看門是高級中斷,它將阻止說要中斷響應,由此可見清除中斷激活標志的重要性。
單片機的第9腳RST為硬件復位端,只要將該端持續4個機器周期的高電平即可實現復位,復位后單片機的各狀態都恢復到初始化狀態,其電路圖如圖2.5所示。 圖2.5 復位電路的原理是單片機RST引腳接收到2uS以上的電平信號,只要保證電容的充放電時間大于2uS,即可實現復位,所以電路中的電容值是可以改變的。值得注意的是,在設計當中使用到了硬件復位和軟件復位兩種功能,軟復位實際上就是當程序執行完畢之后,將程序指針通過一條跳轉指令讓它跳轉到程序執行的起始地址。 2.6報警模塊設計 報警模塊的功能是在無人搶答和闡述超時的情況下報警。具體電路如圖2.6。 圖2.6 端口定義:三極管是NPN型小功率三極管,基極連接單片機,發射極連接喇叭并進行驅動。 2.7總體設計圖 三、系統軟件設計 實驗的軟件設計可以分為主程序和外部中斷程序部分。 主流程圖: 外部中斷操作流程: 
源程序:
#include<reg51.h>
#include<lcd1602.h>
sbit sjjia=P1^0; //定義時間加按鈕
sbit sjjian=P1^1; //定義時間減按鈕
sbit kaishi=P1^2; //定義開始按鈕
sbit fuwei=P1^3; //定義復位按鈕
sbit soud=P1^4; //報警按鈕
sbit led_r=P1^5; //定義搶答成功指示
sbit led_y=P1^6; //定義闡述時間到指示
unsigned char num[]={'0','1','2','3','4','5','6','7','8','9'},num2;
unsigned char model,time,temp;
void init() //初始化函數
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=0;
EA=1;
P1=0x0f;
model=0;
time=30;
}
void delay(unsigned char i) //延時函數
{
unsigned char j,k;
while(i--)
for(j=100;j>0;j--)
for(k=100;k>0;k--);
}
void star() //啟動
{
lcd_xml(0x80);lcd_xsj(" welcome ");
delay(100);
lcd_xml(0xc0);lcd_xsj(" 8 Way Responder");
delay(80);
}
void led_num() //刷新倒計時
{
lcd_xml(0x80);lcd_xsj(" Countdown : ");
lcd_xml(0x8d);lcd_xsj2(num[time/10]);
lcd_xml(0x8e);lcd_xsj2(num[time%10]);
}
void reset() //復位
{
TR0=0;
P1=0x0f;
led_r=0;
led_y=0;
P2=0xff;
model=0;
time=10;
led_num();
lcd_xml(0xc0);lcd_xsj(" Not started ");
}
void Not_started()
{
if(sjjia==0)
{
delay(10);
if(sjjia==0)
{
time++;
if(time==100) time=0;
led_num();
}
}
if(sjjian==0)
{
delay(10);
if(sjjian==0)
{
time--;
if(time==0) time=99;
led_num();
}
}
if(kaishi==0)
{
delay(10);
if(kaishi==0)
{
model=1;
TR0=1;
lcd_xml(0xc0);lcd_xsj(" Start Responder");
soud=1;delay(10);soud=0;
}
}
}
void anjian()
完整的Word格式文檔51黑下載地址:
http://www.zg4o1577.cn/bbs/dpj-180994-1.html
|