第一篇:單片機課程設計
鎮(zhèn)江高等??茖W校課程設計1 項目要求
基于AT89S51單片機的密碼鎖設計,具體功能如下:(1)總共可以設置8位密碼,每位密碼值范圍為1~8。(2)用戶可自行設定和修改密碼。(3)按每個密碼時都有聲音提示。
(4)若鍵入的8位開鎖密碼不完全正確,則報警5s已提醒他人注意。
(5)開鎖密碼連續(xù)錯3次要報警1分鐘,報警期間輸入密碼無效,以防竊賊多次試探密碼。
(6)鍵入的8位開鎖密碼完全正確才能開鎖,開鎖時要有1s的提示音。(7)電磁鎖的電磁線圈每次充電5s,然后恢復初態(tài)。
(8)密碼鍵盤上只允許有8個密碼按鍵。鎖內有備用電池,只有內部上電復位才能設置或修改密碼,因此,僅僅在門外按鍵是不能修改或設置密碼的。(9)密碼設置完畢后要有2s的提示音。硬件設計
2.1 設計思路
按照系統設計的要求和功能,將系統分為主控模塊;按鍵掃描模塊;蜂鳴器;電源電路;復位電路晶振電路;驅動電路幾個模塊,系統組成框圖如圖1-1所示。主控模塊采用AT89S51單片機。
電源電路復位電路主控模塊晶振電路AT89S51按鍵掃描模塊驅動器蜂鳴器 圖1-1 基于AT89S51單片機的密碼鎖組成框圖 鎮(zhèn)江高等??茖W校課程設計2.2 硬件圖及說明(硬件圖見圖1-2,)
元件型號單片機晶振電容型號數量/個用途元件型號蜂鳴器電阻型號數量/個用途AT89S52 1 控制核心12MHz 1 晶振電路30pF 2 晶振電路1 報警電路1kΩ10kΩ4.7kΩ1 上拉電路1 復位電路1 放大電路電阻電阻繼電器電源電解電容20uF/10V 1 復位電路按鍵三極管二極管9 按鍵電路8550 2 放大電路IN4004 1 5V 1 控制對象+5V/0.5A 1 提供+5V電源 圖1-3 基于AT89S51單片機的密碼鎖元件清單
注:1.AT89S51是一個低功耗,高性能CMOS 8位單片機,片內含4k Bytes ISP(In-system programmable)的可反復擦寫1000次的Flash只讀程序存儲器,器件采用ATMEL公司的高密度、非易失性存儲技術制造,兼容標準MCS-51指令系統及80C51引腳結構,芯片內集成了通用8位中央處理器和ISP Flash存儲單元,功能強大的微型計算機的AT89S51可為許多嵌入式控制應用系統提供高性價比的解決方案。
2.蜂鳴器的工作原理: 軟件設計
2.1 設計思路 鎮(zhèn)江高等??茖W校課程設計應位置的,分析程序時可以仔細對照參考。該密碼鎖中RAM存儲單元的分配方案如下所示
如圖1-3所示給出了該單片機密碼鎖電路的軟件軟件流程圖。圖中AA1~AA8以及START,SET,SAVE是程序中的標號,是為了理解程序而專門標在流程圖的對? 31H~38H;依次存放8位設定的密碼,首位密碼存放在31H單元中。? R0:只指向密碼地址 ? R2;已經輸入密碼的位數
? R3:存放允許的錯碼次數3與實際錯碼次數的差值。? R4~ R7:延時用。? 00H:錯碼標志位。
對于ROM存儲單元的分配,由于程序比較短,而且占用的存儲空間的較少,因此,在無特殊要求時,可以從0030H單元(其他地址也可以)開始存放主程序。3.2 程序流程圖
開始初始化1s提示音等待設置密碼NN有鍵按下?Y短音提示保存設置密碼N是否夠8位?Y長音提示錯誤次數清零錯誤標識清零N有鍵按下?Y短音提示密碼對否?Y是否夠8位?Y標志=1?N開鎖并長音提示延時鎖恢復錯誤清零錯3次?Y報警1 min錯誤次數清零報警5s錯誤標志清零Y錯誤次數加1NN錯誤標志置1 圖1-4 基于AT89S51單片機的密碼鎖程序流程圖
3.3 程序清單(注釋)
LOC OBJ LINE SOURCE
0000 1 ORG 0000H 0000 0130 2 AJMP START 0030 3 ORG 0030H 鎮(zhèn)江高等??茖W校課程設計0030 11A1 4 START:ACALL BP 0032 7831 5 MOV R0,#31H 0034 7A08 6 MOV R2,#8 0036 7590FF 7 SET1:MOV P1,#0FFH 0039 E590 8 MOV A,P1 003B B4FF02 9 CJNE A,#0FFH,L8 003E 0136 10 AJMP SET1
0040 11B0 11 L8: ACALL DELAY 0042 B4FF02 12 CJNE A,#0FFH,SAVE 0045 0136 13 AJMP SET1 0047 11A1 14 SAVE: ACALL BP 0049 F6 15 MOV @R0,A 004A 08 16 INC R0 004B DAE9 17 DJNZ R2,SET1 004D 7D10 18 MOV R5,#16 004F 11A1 19 D2S: ACALL BP 0051 DDFC 20 DJNZ R5,D2S 0053 7831 21 MOV R0,#31H 0055 7B03 22 MOV R3,#3 0057 7A08 23 AA1: MOV R2,#8 0059 7590FF 24 AA2: MOV P1,#0FFH 005C E590 25 MOV A,P1 005E B4FF02 26 CJNE A,#0FFH, L9 0061 0159 27 AJMP AA2 0063 11B0 28 L9:ACALL DELAY 0065 B4FF02 29 CJNE A,#0FFH,AA3 0068 0159 30 AJMP AA2 006A 11A1 31 AA3: ACALL BP 006C C3 32 CLR C 006D 96 33 SUBB A, @R0 006E 08 34 INC R0 006F B40002 35 CJNE A,#00H,AA4 0072 0176 36 AJMP AA5 0074 D200 37 AA4: SETB 00H 鎮(zhèn)江高等專科學校課程設計0076 DAE1 38 AA5: DJNZ R2,AA2 0078 20000E 39 JB 00H,AA6 007B C2B5 40 CLR P3.5 007D 7D08 41 L3:MOV R5,#8 007F 11A1 42 ACALL BP 0081 DCFA 43 DJNZ R4,L3 0083 7B03 44 MOV R3,#3
0085 D2B5 45 SETB P3.5 0087 0157 46 AJMP AA1 0089 DB0C 47 AA6: DJNZ R3,AA7 008B 7D18 48 MOV R5,#24 008D 7CC8 49 L5: MOV R4,#200 008F 11A1 50 L4: ACALL BP 0091 DCFC 51 DJNZ R4,L4 0093 DDF8 52 DJNZ R5,L5 0095 7B03 53 MOV R3,#3 0097 7D28 54 AA7: MOV R5,#40 0099 11A1 55 ACALL BP 009B DDFA 56 DJNZ R5,AA7 009D C200 57 AA8: CLR 00H 009F 0157 58 AJMP AA1 00A1 C2B7 59 BP: CLR P3.7 00A3 7FFA 60 MOV R7,#250 00A5 7E7C 61 L2: MOV R6,#124 00A7 DEFE 62 L1: DJNZ R6,L1 00A9 B2B7 63 CPL P3.7 00AB DFF8 64 DJNZ R7,L2 00AD D2B7 65 SETB P3.7 00AF 22 66 RET 00B0 7F14 67 DELAY:MOV R7,#20 00B2 7E7D 68 L7: MOV R6,#125 00B4 DEFE 69 L6: DJNZ R6,L6 00B6 DFFA 70 DJNZ R7,L7 00B8 22 71 RET 鎮(zhèn)江高等??茖W校課程設計 72 END 3.4 程序調試
按鍵AN1~AN7分別代表數碼1~7,按鍵AN0代表8。在沒有鍵按下時,P1.0~P1.7全是高電平1;若某個鍵被按下,相應的口就變?yōu)榈碗娖?.加入設定的密碼是612345678,當按鍵AN6被按下時,P1.6變?yōu)榈碗娖剑琍1端口其余口線為高電平,此時從P1口輸入的數值為10111111,存到31H單元的密碼值就是10111111,也就是BFH。以此類推,存到32H至38H單元的密碼值分別是FDH,FBH,F7H,EFH,DFH,7FH,FEH。開鎖時必須先按AN6,使從P1口讀入的第一個密碼值與31H單元存儲的設定值相同,再按順序按AN1,AN2,AN3,AN4,AN5,AN7,AN0才能開鎖。否則不能開鎖,同時開始報警。小結
通過此次課程設計,使我更加扎實的掌握了有關單片機方面的知識,在設計過程中雖然遇到了一些問題,但經過一次又一次的思考,一遍又一遍的檢查終于找出了原因所在,也暴露出了前期我在這方面的知識欠缺和經驗不足。實踐出真知,通過親自動手制作,使我們掌握的知識不再是紙上談兵。
實驗過程中,也對團隊精神的進行了考察,讓我們在合作起來更加默契,在成功后一起體會喜悅的心情。果然是團結就是力量,只有互相之間默契融洽的配合才能換來最終完美的結果。
此次設計也讓我明白了思路即出路,有什么不懂不明白的地方要及時請教或上網查詢,只要認真鉆研,動腦思考,動手實踐,就沒有弄不懂的知識,收獲頗豐
參考文獻:(另起一頁)
【1】楊居義。單片機課程設計指導。北京:北京大學出版社,2009。
【2】王效華,張詠梅。單片機原理與應用。北京:北京交通大學出版社,2007?!?】楊光義,馬寧,靳光明等。單片機原理與工程應用。北京:清華大學出版社,2009。
第二篇:單片機課程設計
設計題目: 單片機課程設計
學生姓名:
學
院: 電氣與信息工程學院
班
級: 電子111班 指導教師:
日 期: 2014年9月20日
一、課程設計目的:
了解電子元器件的功能與原理,掌握單片機的結構和原理,學會使用單片機應用開發(fā)技術的相關軟件如 keill、STC_ISP_V394等,能夠使用c語言的語言編程簡單的功能。
二、設計的思想:
利用所提供的單片機和開發(fā)板的原理圖用keill軟件編程程序以實現一些功能。然后用STC_ISP_V394.exe軟件將編譯完全正確的程序生成的hxe文件下載到開發(fā)板上,再調試編譯的程序能否實現其所設計的功能。
1、對蜂鳴器的了解:
蜂鳴器是一種一體化結構的電子訊響器,采用直流電壓供電,它由振蕩器、電磁線圈、磁鐵、振動膜片及外殼組成,接通電源后,振蕩器產生的音頻信號由電流通過電磁線圈,使電磁線圈產生磁場,振動膜片在電磁線圈和磁鐵的相互作用下,周期性的振動發(fā)聲。
2、設計:
我們所使用的開發(fā)板實物圖如圖一,單片機對右上角蜂鳴器的控制是加入三極管接入vcc,單片機的第22引腳和負極上,以此來控制蜂鳴器工作。單片機我們選擇STC89C52RC+1602液晶來實現對蜂鳴器的控制及顯示所需要的信息。
圖一 調試說明:
首先用Keil軟件創(chuàng)建一個工程,將程序源代碼輸入并編譯生成單片可執(zhí)行的.hex文件。其次,打開單片機實踐板的電源,接好串口線,用STC-ISP燒錄軟件,將.hex文件燒錄入單片機中。程序下載完畢后,單片機會自動執(zhí)行程序功能。最后,觀察程序功能的執(zhí)行情況,看是否達到了設計要求。
如果單片機實踐板硬件電路的執(zhí)行結果與設計結果一致,則說明設計過程及流程沒有問題,完全符合設計要求。否則,先檢查單片機實踐板的硬件電路是否完好,是否有斷點、漏焊、虛焊以及元器件是否完好等情況,排除故障重新連接后重新進行調試。如果仍然無法正
常實現,則說明程序編寫有誤,需要認真檢查程序流程,然后經過反復的修改與調試排除故障,實現設計要求的各項功能。編譯和燒寫該程序到單片機:
(1)用Keil編譯上面的代碼,并設置產生16進制代碼文件*.hex.(2)用專用下載線,連接好實驗板和電腦串口(DB9)(2)運行hex文件燒寫軟件STC_ISP_V394.exe
選單片機的型號,并打開編譯產生好的hex文件
點擊下載,給開發(fā)板上電。
3、實現的功能:使用單片機將歌曲《八月桂花》的調子通過蜂鳴器播放出來,用1602液晶將想要表達的信息有步驟地顯示在液晶顯示屏上,并且調子與顯示內容可以任意通過修改的程序燒錄到單片機內,實現設計產品的使用性與靈活性。
三、實驗程序:
/************************************************************************
[主題] C51音樂程序《八月桂花》
[功能]
通過單片機演奏音樂,顯示一些內容
/**********************************************************************/
#include
#include
//本例采用89C52, 晶振為11.0592MHZ
//關于如何編制音樂代碼, 其實十分簡單,各位可以看以下代碼.//頻率常數即音樂術語中的音調,而節(jié)拍常數即音樂術語中的多少拍;
//所以拿出譜子, 試探編吧!
unsigned char i=0;sbit Beep = P2^7;
unsigned char p,m;
//m為頻率常數變量
unsigned char n=0;//n為節(jié)拍常數變量
unsigned char code music_tab[] ={
0x18, 0x30, 0x1C , 0x10, //格式為: 頻率常數, 節(jié)拍常數, 頻率常數, 節(jié)拍常數,0x20, 0x40, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x10,0x1C, 0x10, 0x18 , 0x40,0x1C, 0x20, 0x20 , 0x20,0x1C, 0x20, 0x18 , 0x20,0x20, 0x80, 0xFF , 0x20,0x30, 0x1C, 0x10 , 0x18,0x20, 0x15, 0x20 , 0x1C,0x20, 0x20, 0x20 , 0x26,0x40, 0x20, 0x20 , 0x2B,0x20, 0x26, 0x20 , 0x20,0x20, 0x30, 0x80 , 0xFF,0x20, 0x20, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x20, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x30, 0x1C , 0x10,0x18, 0x20, 0x15 , 0x20,0x1C, 0x20, 0x20 , 0x20,0x26, 0x40, 0x20 , 0x20,0x2B, 0x20, 0x26 , 0x20,0x20, 0x20, 0x30 , 0x80,0x20, 0x30, 0x1C , 0x10,0x20, 0x10, 0x1C , 0x10,0x20, 0x20, 0x26 , 0x20,0x2B, 0x20, 0x30 , 0x20,0x2B, 0x40, 0x20 , 0x15,0x1F, 0x05, 0x20 , 0x10,0x1C, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x30, 0x1C , 0x10,0x18, 0x20, 0x15 , 0x20,0x1C, 0x20, 0x20 , 0x20,0x26, 0x40, 0x20 , 0x20,0x2B, 0x20, 0x26 , 0x20,0x20, 0x20, 0x30 , 0x30,0x20, 0x30, 0x1C , 0x10,0x18, 0x40, 0x1C , 0x20,0x20, 0x20, 0x26 , 0x40,0x13, 0x60, 0x18 , 0x20,0x15, 0x40, 0x13 , 0x40,0x18, 0x80, 0x00
};
void int0()interrupt 1
//采用中斷0 控制節(jié)拍
{ TH0=0xd8;
TL0=0xef;
n--;
}
void delay(unsigned char m)
//控制頻率延時
{
unsigned i=3*m;
while(--i);
}
void delayms(unsigned char a)//豪秒延時子程序
{
while(--a);
//采用while(--a)不要采用while(a--);各位可編譯一下看看匯編結果就知道了!
}
typedef unsigned char BYTE;typedef bit BOOL;
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;sbit LCD_EP = P2^2;
BYTE code dis1[] = {“
WLCOME TO
”};BYTE code dis2[] = {“
DanPianJi ”};BYTE code dis3[] = {“
111iZnaiD
”};BYTE code dis4[] = {“
eiXeiX ”};
delays(int ms){
// 延時子程序 int i;while(ms--){
for(i = 0;i< 250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
} } }
BOOL lcd_bz(){
// 測試LCD忙碌狀態(tài) BOOL result;LCD_RS = 0;LCD_RW = 1;LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();result =(BOOL)(P0 & 0x80);LCD_EP = 0;return result;}
lcd_wcmd(BYTE cmd){
while(lcd_bz());LCD_RS = 0;LCD_RW = 0;LCD_EP = 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();_nop_();LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();LCD_EP = 0;
}
lcd_pos(BYTE pos){
lcd_wcmd(pos | 0x80);
// 寫入指令數據到LCD //設定顯示位置
}
lcd_wdat(BYTE dat)
{
//寫入字符顯示數據到LCD while(lcd_bz());LCD_RS = 1;LCD_RW = 0;LCD_EP = 0;P0 = dat;_nop_();_nop_();_nop_();_nop_();LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();LCD_EP = 0;}
lcd_init(){
lcd_wcmd(0x38);
delays(1);lcd_wcmd(0x0c);
delays(1);lcd_wcmd(0x06);
delays(1);lcd_wcmd(0x01);
delays(1);}
void main()
{
BYTE j;
lcd_init();
delays(10);
//LCD初始化設定
//16*2顯示,5*7點陣,8位數據//顯示開,關光標 //移動光標 //清除LCD的顯示內容
// 初始化LCD
lcd_wcmd(0x06);
//向右移動光標
lcd_pos(0);
//設置顯示位置為第一行的第1個字符
j = 0;
while(dis1[ j ]!= '