第一篇:單片機課程設計教案
《單片機技術及其應用》課程設計教案
一、課程設計的目的
課程設計是在學完《單片機原理及接口技術》課程之后綜合利用所學單片機知識完成一個單片機應用系統(tǒng)設計并在實驗室實現(xiàn),從而加深對單片機軟硬知識的理解,獲得初步的應用經(jīng)驗,為走出校門從事單片機應用的相關工作打下基礎.1.了解并掌握單片機的原理、結構、指令、接口及應用。2.提高綜合運用所學的理論知識獨立分析和解決問題的能力。3.掌握匯編語言程序設計和調(diào)試。4.掌握C51語言的設計和調(diào)試。
二、課程設計的要求
1. 根據(jù)設計要求,畫出硬件接線圖及程序的總體流程圖,然后進行各控制模塊的硬件設計及軟件設計。
2.掌握如何應用單片機仿真器來開發(fā)應用系統(tǒng)及仿真調(diào)試的過程。
三、課程設計的安排
1.時間安排,課程設計時間分為三個階段:
第一階段(8學時):主要是學生接受課程設計的準備階段。包括: 1)學生集中介紹課程設計的具體內(nèi)容和具體要求,學生選題。(4學時)
2)安排學生收集相關資料,確定課程設計的總體方案。(4學時)第二階段(20學時):主要是學生具體課程設計的過程。包括:
學生做的工作
1)確定電路中使用的電子元器件(包括元件名稱和及參數(shù)值)
2)軟件設計與仿真(畫出軟件流程圖,并編寫具體的代碼)老師做的工作
1)輔導學生解決在制作過程中出現(xiàn)的問題 2)協(xié)助學生購買設計中需要的電子元器件 3)輔導學生焊接電路板和相關元器件 4)輔導學生完成程序的燒寫和硬件測試
提供燒寫器給學生,由學生能夠進行軟件仿真調(diào)試程序。學生在焊接完畢后,將程序下載到主芯片里并測試電路。由輔導老師輔導學生調(diào)試硬件和軟件部分,共同解決測試過程中出現(xiàn)的問題,使學生在測試過程進一步學習。
第三階段(8學時):主要是文檔資料整理和答辯 1)安排學生交課程設計報告并總結
2)每組隨機抽取3個人進行答辯,取平均成績作為小組每個人的答辯成績
課程設計結束后,將學生的設計的實物做課程設計匯報,在實驗中心1樓做一個展覽。
2.分組安排
學生可以自由組合,3-6名學生成立一個小課題組,選一名組長,確定課題后由組長進行分工。3.課題選擇
以小組為單位,一組選擇一個課題,可以自己選定題目,也可以在指導教師提供的課題中選擇。
四、可供選擇的課題
1、搶答器的設計
技術要求:以拔動開關K0—K5中的某個丌關為0N作為搶答按鍵,無人搶答時,6個數(shù)碼管循環(huán)輪流顯示1—6跑馬,誰先搶答,數(shù)碼管停止跑馬,6個數(shù)碼管同時亮誰的編號,其后再有鍵按下,系統(tǒng)不予響應,直到此位拔為OFF,恢復l—6跑了馬,開始下一輪搶答。
2、波形發(fā)生器的設計
技術要求:可以產(chǎn)生正弦波、方波、三角波等常用標準波形,由按鍵選擇并用不同符號顯示在數(shù)碼管上。
3、簡易電子琴設計
技術要求:由16個按鍵組成4X4鍵盤矩陣,設置成16個音,可隨意彈奏想要表現(xiàn)的音樂。
4、秒表設計
技術要求:開始時,顯示“00”,第一次按下按鈕后開始從0-99s計時,顯示精度為1s;對用有4個功能按鍵,第1個按鍵開始按鈕,第2個按鍵停止按鈕,第3個按鍵及時歸零按鈕,第4個按鈕復位按鈕。
5、ADC0808 A/D轉換設計
技術要求:用ADC0808對模擬信號進行轉換,轉換結果送7段數(shù)碼管顯示,同時用發(fā)光二極管顯示轉換值的二進制碼。5位數(shù)碼管的前兩位顯示“AD”。字樣,后三位顯示A/D轉換結果,采用串行顯示方法。
6、溫度采集報警系統(tǒng)的設計
技術要求:可以顯示被測的溫度并存儲,可以設置報警溫度,到達報警溫度時聲光報警。
7、數(shù)字頻率計的設計
技術要求:利用單片機的定時器和計數(shù)器實現(xiàn)對方波信號的頻率測
量,用數(shù)碼管顯示出來。
8、模擬計算器數(shù)字輸入顯示系統(tǒng)設計
技術要求:開機時,顯示“0”。第一次按下數(shù)字鍵時,顯示“D1”;第二次按下時,顯示“D1D2”,第三次按下時,顯示“D1D2D3”8個數(shù)字完全顯示完,再按下按鍵時,發(fā)出“滴”提示音,并返回初始顯示狀態(tài)。
9、數(shù)字鐘設計
技術要求:利用單片機的定時器和數(shù)碼管,設計一個電子時鐘,顯示格式為“XX:XX:XX”,由左向右分別是時、分、秒。開機時,顯示00:00:00的時間開始計時;當時間不準時,可校時,P0.0控制“秒”的調(diào)整,每按一次加1s;P0.1控制“分”的調(diào)整,每按一次加1min;P2.0控制“時”的調(diào)整,每按一次加1h。計時滿23:59:59時,返回00:00:00重新計時。
10、模擬交通燈的設計
技術要求:單片機的并行口接發(fā)光二極管,模擬交通燈的變化規(guī)律。首先,東西路口紅燈亮,南北路口綠燈亮,同時開始25秒倒計時,以7段數(shù)碼管顯示時間。25秒倒計時結束后開始5秒倒計時,南北路口的綠燈閃爍,計時到最后2秒時,南北路口黃燈亮。完成一次這樣的循環(huán)需要30秒。30秒結束后,南北路口紅燈亮,東西路口綠燈亮,并重新30秒倒計時,依次循環(huán)。
五、課程設計成績評定方法
滿分100分;平時成績占10分;報告占20分;完成情況占30分;答辯占40分。
第二篇:單片機課程設計
設計題目: 單片機課程設計
學生姓名:
學
院: 電氣與信息工程學院
班
級: 電子111班 指導教師:
日 期: 2014年9月20日
一、課程設計目的:
了解電子元器件的功能與原理,掌握單片機的結構和原理,學會使用單片機應用開發(fā)技術的相關軟件如 keill、STC_ISP_V394等,能夠使用c語言的語言編程簡單的功能。
二、設計的思想:
利用所提供的單片機和開發(fā)板的原理圖用keill軟件編程程序以實現(xiàn)一些功能。然后用STC_ISP_V394.exe軟件將編譯完全正確的程序生成的hxe文件下載到開發(fā)板上,再調(diào)試編譯的程序能否實現(xiàn)其所設計的功能。
1、對蜂鳴器的了解:
蜂鳴器是一種一體化結構的電子訊響器,采用直流電壓供電,它由振蕩器、電磁線圈、磁鐵、振動膜片及外殼組成,接通電源后,振蕩器產(chǎn)生的音頻信號由電流通過電磁線圈,使電磁線圈產(chǎn)生磁場,振動膜片在電磁線圈和磁鐵的相互作用下,周期性的振動發(fā)聲。
2、設計:
我們所使用的開發(fā)板實物圖如圖一,單片機對右上角蜂鳴器的控制是加入三極管接入vcc,單片機的第22引腳和負極上,以此來控制蜂鳴器工作。單片機我們選擇STC89C52RC+1602液晶來實現(xiàn)對蜂鳴器的控制及顯示所需要的信息。
圖一 調(diào)試說明:
首先用Keil軟件創(chuàng)建一個工程,將程序源代碼輸入并編譯生成單片可執(zhí)行的.hex文件。其次,打開單片機實踐板的電源,接好串口線,用STC-ISP燒錄軟件,將.hex文件燒錄入單片機中。程序下載完畢后,單片機會自動執(zhí)行程序功能。最后,觀察程序功能的執(zhí)行情況,看是否達到了設計要求。
如果單片機實踐板硬件電路的執(zhí)行結果與設計結果一致,則說明設計過程及流程沒有問題,完全符合設計要求。否則,先檢查單片機實踐板的硬件電路是否完好,是否有斷點、漏焊、虛焊以及元器件是否完好等情況,排除故障重新連接后重新進行調(diào)試。如果仍然無法正
常實現(xiàn),則說明程序編寫有誤,需要認真檢查程序流程,然后經(jīng)過反復的修改與調(diào)試排除故障,實現(xiàn)設計要求的各項功能。編譯和燒寫該程序到單片機:
(1)用Keil編譯上面的代碼,并設置產(chǎn)生16進制代碼文件*.hex.(2)用專用下載線,連接好實驗板和電腦串口(DB9)(2)運行hex文件燒寫軟件STC_ISP_V394.exe
選單片機的型號,并打開編譯產(chǎn)生好的hex文件
點擊下載,給開發(fā)板上電。
3、實現(xiàn)的功能:使用單片機將歌曲《八月桂花》的調(diào)子通過蜂鳴器播放出來,用1602液晶將想要表達的信息有步驟地顯示在液晶顯示屏上,并且調(diào)子與顯示內(nèi)容可以任意通過修改的程序燒錄到單片機內(nèi),實現(xiàn)設計產(chǎn)品的使用性與靈活性。
三、實驗程序:
/************************************************************************
[主題] C51音樂程序《八月桂花》
[功能]
通過單片機演奏音樂,顯示一些內(nèi)容
/**********************************************************************/
#include
#include
//本例采用89C52, 晶振為11.0592MHZ
//關于如何編制音樂代碼, 其實十分簡單,各位可以看以下代碼.//頻率常數(shù)即音樂術語中的音調(diào),而節(jié)拍常數(shù)即音樂術語中的多少拍;
//所以拿出譜子, 試探編吧!
unsigned char i=0;sbit Beep = P2^7;
unsigned char p,m;
//m為頻率常數(shù)變量
unsigned char n=0;//n為節(jié)拍常數(shù)變量
unsigned char code music_tab[] ={
0x18, 0x30, 0x1C , 0x10, //格式為: 頻率常數(shù), 節(jié)拍常數(shù), 頻率常數(shù), 節(jié)拍常數(shù),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);
// 寫入指令數(shù)據(jù)到LCD //設定顯示位置
}
lcd_wdat(BYTE dat)
{
//寫入字符顯示數(shù)據(jù)到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位數(shù)據(jù)//顯示開,關光標 //移動光標 //清除LCD的顯示內(nèi)容
// 初始化LCD
lcd_wcmd(0x06);
//向右移動光標
lcd_pos(0);
//設置顯示位置為第一行的第1個字符
j = 0;
while(dis1[ j ]!= '