第一篇:單片機數碼管顯示課程設計
單片機數碼管顯示課程設計
目錄引言...............設計任務和要求.............1
2.1 設計目的............1
2.2 設計意義............1總原理圖及主要模塊的流程圖......1
3.1 總原理圖及元器件清單..............1
3.2 主要流程圖..........1性能測試與分析.............35 結論與心得..........4致謝...........4
參考文獻.............4
單片機數碼管顯示課程設計引言
從上世紀70年代第一批單片機問世,短短二三十年時間,單片機技術已經成為計算機技術的一個重要分支,廣泛運用到工業控制、儀器、儀表、消費產品,汽車、辦公自動化和通信等領域。因此,單片機技術已經成為電子、測控、自動化、通信等許多工科專業學生的必備技能。
我用AT89C51芯片來設計一個簡單的數碼管顯示。此設計給出了源代碼,通過仿真測試,其性能指標達到了設計要求。
關鍵詞:單片機,AT89C51,數碼管設計任務和要求
2.1 設計目的1.學習基本理論在實踐中綜合運用的初步經驗,掌握模擬電路設計的基本方法、設計步驟,培養綜合設計與調試能力。
2.了解AT89C51這個芯片的使用和性能指標測試方法。
3.培養實踐技能,提高分析和解決實際問題的能力。
2.2 設計意義
為了更好地熟悉和掌握單片機的基本功能和編程,掌握數碼管動態掃描顯示原理及實現方法。自我動態掃描顯示電路驅動程序的編寫方法。通過課程設計,達到理論與實際應用相結合,提高學生對微機硬件結構的軟件設計方法的理解,使學生能夠根據實際應用,初步實現硬件及軟件的設計,對硬件開發有更深層的認識,為今后打軟硬件開發,打下堅實的基礎。總原理圖及及主要模塊的流程圖
3.1 總原理圖及元器件清單
(1)我用Proteus 7 professional來畫出我設計的總原理圖,如圖3-1。
如圖3-1
此電路圖就用到AT89C51這個芯片,和一個數碼管。
3.2 主要流程圖(四號宋體加粗)
1.主程序的流程圖
圖3.2-1主流程圖
2.子程序的流程圖
圖3.2-2子流程圖性能測試與分析
主程序和子程序都存放在AT89C51單片機中。主程序的功能是:顯示數字。子程序的功能有:延時。程序代碼:
ORG 0000H;初始化
LJMP START;轉入主程序
ORG 0010H;初始化
START:
CLR P2.7;P2.7←00H
MOVR0,#00H;R0←00H
MOV R2,#10;R2←10
MAIN:
MOV DPTR,#TAB;DPTR←TAB
MOV A,R0;A←(RO)
MOVC A,@A+DPTR;A←((A)+(DPTR))
MOV P0,A;P0←(A)
LCALL DELAY;調用延時程序
INC R0;RO←(R0)+1
DJNZR2,MAIN;判斷
JMP START;循環
DELAY:;延時程序
MOV R3,#11
D1: MOV R4,#100
D2: MOV R5,#100
DJNZ R5,$
DJNZ R4,D2
DJNZ R3,D1
RET
TAB:
DB 00101000B;0
DB 11101011B;1
DB 00110010B;2
DB 10100010B;3
DB 11100001B;4
DB 10100100B;5
DB 00100100B;6
DB 11101010B;7
DB 00100000B;8
DB 10100000B;9
END
我用Proteus 7 professional 軟件來測試我設計的電路圖。當運行時,數碼管顯示0。如圖4-1。
圖4-1
當221ms后,數碼管顯示1。如圖
4-2.圖4-2
我的程序是一個循環的,一直到顯示9,之后又重新開始顯示0。在此不一一列出來。
為了能在實際在到應用,我用開發板來驗證我所設計的電路圖。其結果如下:
圖4-3顯示1
圖4-4顯示8
從仿真的結果可以看出,我的設計是滿足我設計的要求的。結論與心得
通過單片機課程設計,我不僅加深了對單片機理論的理解,將理論很好地應用到實際當中去,而且我還學會了如何去培養我們的創新精神,從而不斷地戰勝自己,超越自己。創新,是要我們學會將理論很好地聯系實際,并不斷地去開動自己的大腦,從為人類造福的意愿出發,做自己力所能及的,別人卻沒想到的事。使之不斷地戰勝別人,超越前人。同時,更重要的是,我在這一設計過程中,學會了堅持不懈,不輕易言棄。設計過程,也好比是我們人類成長的歷程,常有一些不如意,也許這就是在對我們提出了挑戰,勇敢過,也戰勝了,勝利的鐘聲也就一定會為我們而敲響。
這個設計過程中,我遇到過許多次失敗的考驗,就比如,我在軟件上仿真軟件上能實現其功能,但是把它寫進開發板就無法運行,我不停地找原因。最后我找到了答案,這樣我明白,做設計不但是軟件可以運行,用在硬件上一樣是那么重要的。我做的這個設計主要是用AT89C51這個芯片來實現,這個芯片具有很多優點,程序簡單易讀,結構清楚,最重要的是成本低。很適合我們學生用來學生。在做這個設計的過程中,我也了解到了自己的不足,在日后的學習中,我還需加倍努力學習。
參考文獻)
[1]梁炳東.單片機原理與應用。北京:人民郵電出版社,2009
[2]
[3]http://wenku.baidu.com/album/view/702db2c7aa00b52acfc7cae7
致謝(小三號 宋體 加粗)
在此次課程設計中,我遇到不懂的問題,老師和同學都幫我,讓我把問題順利地得到解決,最后完成此次課程設計報告。從中我學到了很多東西,在此,謝謝我的老師和同學,感謝你們在我遇到難題的時候幫我解答。
第二篇:單片機數碼管顯示實驗
實驗一
數碼管實驗
一、實驗目的
1.了解數碼管的顯示原理;2.掌握JXARM9-2440 中數碼管顯示編程方法
二、實驗儀器
JXARM9-2440教學實驗箱、ADT1000仿真器和ADT IDE集成開發環境、串口連接線、PC機。
三、實驗原理
7段LED由7個發光二極管按“日”字形排列,所有發光二極管的陽極連在一起稱共陽極接法,陰極連在一起稱為共陰極接法。
LED顯示器的接口一般有靜態顯示與動態顯示接口兩種方式。
本實驗中采用的是動態顯示接口,其中數碼管掃描控制地址為0x20007000,位0-位5每位分別對應一個數碼管,將其中某位清0 來選擇相應的數碼管,地址0x20006000 為數碼管的數據寄存器。數碼管采用共陽方式,向該地址寫一個數據就可以控制LED 的顯示,數據中的1對應的不亮,0對應的亮,數碼管各位從高到低排列為dp-g-f-e-d-c-b-a,例如當數據寄存器是11111111時則不亮,當是01111111時則顯示8,其原理圖如圖所示。
四、實驗內容
1、編程實現:六個數碼管同時正向顯示0-F,然后反向顯示F-0。
2、編程實現:在六個數碼管上依次顯示與自己姓名有關的內容,可分辨出輪流顯示。
3、編程實現:在六個數碼管上依次顯示與自己姓名有關的內容,分辨不出輪流顯示。
4*、編程實現:在每個數碼管上遞增顯示0—9。5*、自行開發。
五、實驗程序
1, /****************************************************************************/ /*文件名稱: LEDSEG7.C
*/ /*實驗現象: 數碼管依次顯示出0、1,2、??
9、a、b、C、d、E、F
*/ /****************************************************************************/ #define U8 unsigned char unsigned char seg7table[16] = {
/* 0
7*/
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,/* 8
A
B
C
D
E
F*/
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e, };void Delay(int time);/****************************************************************************/ /* 函數說明: JXARM9-2410 7段構共陽數碼管測試
*/ /* 功能描述: 依次在7段數碼管上顯示0123456789ABCDEF
*/ /* 返回代碼: 無
*/ /* 參數說明: 無
*/ /****************************************************************************/ void Test_Seg7(void){
int i;
*((U8*)0x20007000)=0x00;/*6個數碼管都亮*/ for(;;){
/*數碼管從0到F依次將字符顯示出來*/
for(i=0;i<0x10;i++)
{
*((U8*)0x20006000)=seg7table[i];
Delay(10000);
}
/*數碼管從F到0依次將字符顯示出來*/
for(i=0x0f;i>0x00;i--)
{
*((U8*)0x20006000)=seg7table[i];
Delay(10000);
} }
// TODO } /****************************************************************************/
/* Function name : 循環延時子程序
*/ /* Description : 循環 'time' 次
*/ /* Return type :void
*/ /* Argument
: 循環延時計數器
*/ /****************************************************************************/ void Delay(int time){
int i;int delayLoopCount=10000;
for(;time>0;time--);
for(i=0;i 2, /****************************************************************************/ /*文件名稱: LEDSEG7.C */ /*實驗現象: 數碼管依次顯示ZHAngg,并能看出輪流顯示 */ /****************************************************************************/ #define U8 unsigned char unsigned char seg7table[16] = { /* Z H A n g g 7*/ 0xa4,0x89,0x88,0xc8,0x90,0x90,0x82,0xf8,/* 8 A B C D E F*/ 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,/* H I N*/ 0x89,0xcf,0x48 };void Delay(int time);/****************************************************************************/ /* 函數說明: JXARM9-2410 7段構共陽數碼管測試 */ /* 功能描述: 在六個數碼管上分別顯示字母,與姓名有關 */ /* 返回代碼: 無 */ /* 參數說明: 無 */ /****************************************************************************/ void Test_Seg7(void){ int i; *((U8*)0x20007000)=0x00; for(;;) { *((U8*)0x20007000)=0x1f; *((U8*)0x20006000)=seg7table[0]; Delay(10000); *((U8*)0x20007000)=0x2f; *((U8*)0x20006000)=seg7table[1]; Delay(10000); *((U8*)0x20007000)=0x37; *((U8*)0x20006000)=seg7table[2]; Delay(10000); *((U8*)0x20007000)=0x3b; *((U8*)0x20006000)=seg7table[3]; Delay(10000); *((U8*)0x20007000)=0x3d; *((U8*)0x20006000)=seg7table[4]; Delay(10000); *((U8*)0x20007000)=0x3e; *((U8*)0x20006000)=seg7table[5]; Delay(10000);} // TODO } /***************************************************************************/ /* Function name : 循環延時子程序 */ /* Description : 循環 'time' 次 */ /* Return type :void */ /* Argument : 循環延時計數器 */ /****************************************************************************/ void Delay(int time){ int i;int delayLoopCount=10000; for(;time>0;time--); for(i=0;i 3, /****************************************************************************/ /*文件名稱: LEDSEG7.C */ /*實驗現象: 數碼管依次顯示出ZHAngg,并看不出輪流顯示 */ /****************************************************************************/ #define U8 unsigned char unsigned char seg7table[16] = { /* Z H A n g g 7*/ 0xa4,0x89,0x88,0xc8,0x90,0x90,0x82,0xf8,/* 8 A B C D E F*/ 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,/* H I N*/ 0x89,0xcf,0x48 };void Delay(int time);/****************************************************************************/ /* 函數說明: JXARM9-2410 7段構共陽數碼管測試 */ /* 功能描述: 在六個數碼管上分別顯示字母,與姓名有關 */ /* 返回代碼: 無 */ /* 參數說明: 無 */ /****************************************************************************/ void Test_Seg7(void){ int i; *((U8*)0x20007000)=0x00; for(;;) { *((U8*)0x20007000)=0x1f; *((U8*)0x20006000)=seg7table[0]; Delay(10000); *((U8*)0x20007000)=0x2f; *((U8*)0x20006000)=seg7table[1]; Delay(10000); *((U8*)0x20007000)=0x37; *((U8*)0x20006000)=seg7table[2]; Delay(10000); *((U8*)0x20007000)=0x3b; *((U8*)0x20006000)=seg7table[3]; Delay(10000); *((U8*)0x20007000)=0x3d; *((U8*)0x20006000)=seg7table[4]; Delay(10000); *((U8*)0x20007000)=0x3e; *((U8*)0x20006000)=seg7table[5]; Delay(1);} // TODO } /***************************************************************************/ /* Function name : 循環延時子程序 */ /* Description : 循環 'time' 次 */ /* Return type :void */ /* Argument : 循環延時計數器 */ /****************************************************************************/ void Delay(int time){ int i;int delayLoopCount=10000; for(;time>0;time--); for(i=0;i 4, /****************************************************************************/ /*文件名稱: LEDSEG7.C */ /*實驗現象: 數碼管依次顯示出0、1,2、?? 9、a、b、C、d、E、F */ /****************************************************************************/ #define U8 unsigned char unsigned char seg7table[16] = { /* 0 7*/ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,/* 8 A B C D E F*/ 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e, };void Delay(int time);/****************************************************************************/ /* 函數說明: JXARM9-2410 7段構共陽數碼管測試 */ /* 功能描述: 依次在7段數碼管各自遞增顯示0—9 */ /* 返回代碼: 無 */ /* 參數說明: 無 */ /****************************************************************************/ void Test_Seg7(void){ int i;for(;;){ for(i=0;i<=0x09;i++) { *((U8*)0x20007000)=0x1f; *((U8*)0x20006000)=seg7table[i]; Delay(10000); } for(i=0;i<=0x09;i++) { *((U8*)0x20007000)=0x2f; *((U8*)0x20006000)=seg7table[i]; Delay(10000); } for(i=0;i<=0x09;i++) { *((U8*)0x20007000)=0x37; *((U8*)0x20006000)=seg7table[i]; Delay(10000); } for(i=0;i<=0x09;i++) { *((U8*)0x20007000)=0x3b; *((U8*)0x20006000)=seg7table[i]; Delay(10000); } for(i=0;i<=0x09;i++) { *((U8*)0x20007000)=0x3d; *((U8*)0x20006000)=seg7table[i]; Delay(10000); } } // TODO } /****************************************************************************/ /* Function name : 循環延時子程序 */ /* Description : 循環 'time' 次 */ /* Return type :void */ /* Argument : 循環延時計數器 */ /****************************************************************************/ void Delay(int time){ int i;int delayLoopCount=10000; for(;time>0;time--); for(i=0;i 六、實驗結果與分析 實驗一結果:六個數碼管同時顯示相同的符號,從0-F再由F-0之間的循環變換。 分析:在數碼管掃描控制地址處選中六個數碼管,使其同時亮,在給其數碼管的數據寄存器存入不同符號對應的數值,加上相應的延遲,就 可以是輪流變換的循環的符號變換。 實驗二結果:第一個數碼管顯示Z后,第二個顯示H,接著第三個顯示A,接著第四個顯示n,接著第五個顯示g,接著第六個顯示g,接著第一個再顯示Z…..如此循環。 分析:設置控制地址使其單獨并且循環顯示,每個數碼管的數據寄存器送入不同的符號的數值,并設置較大的延遲時間即可產生該現象。 實驗三結果:六個數碼管一起顯示“ZHAngg”。 分析:原理同實驗二,只是將延遲時間改小到人眼無法分辨的地步即使一起顯示。 實驗四結果:第一個數碼管顯示0—9之后,第二個接著顯示0—9,接著第三個,第四個….分析:設置循環使六個數碼管循環單獨顯示,在每個數碼管顯示中再加入循環,使其遞增顯示0—9,設置較大的延遲,是我們可以看清實驗現象。 七、實驗總結與心得體會 本次試驗需要了解數碼管的基本工作原理,基于C語言設計編程完成實驗,實驗的關鍵在于把握實現各種現象的本質上的差異,在程序上作出修改。通過本次試驗對于實驗的嚴謹性有了進一步的體驗,稍有不小心實驗結果就適得其反,以后要更加用心,更加認真的做實驗。 一、前言 1.1設計制作產品的背景、目的及設計要求 本項目為16x16點陣漢字顯示“新年快樂”的設計,首先將本次實訓的電路圖在仿真軟件上繪制完成,將點陣文件存入ROM,形成漢字編碼,再進行相關轉換,以新編碼提取相應的點陣漢字顯示。將相應編碼代入運行程序,進行調試和準備。 1.2分工情況、工作計劃及本人所承擔工作 1.周一 1~4 進行分組,選題 和軟件的安裝 2.周二 1~4 進行電路的設計及程序編寫 3.周三 1~4 進行電路的設計及程序編寫 4.周四 1~4 進行說明書的填寫 5.周五 1~4 答辯 本人在本次課程設計中承擔電路圖的繪制及相關程序的編寫與調試。 1.3本課題的設計重點及難點 本次課程設計重點在于單片機控制系統程序采用單片機匯編語言進行編輯,通過編程控制各顯示點對應LED陽極和陰極端的電平,就可以有效的控制各顯示點的亮滅。而其中的難點就在于運行程序的編寫及相關漢字的點陣數據,這種顯示字符的點陣數據可以自行編寫,也可以標準字庫中提取。 在進行課題設計時需要熟練掌握相關電路軟件及編程軟件的使用,編寫程序時需掌握一定的C語言邏輯關系的運用。在電路圖的繪制時需要清楚的了解各個電路設備的功能及用途。 二、實訓內容 2.1實訓原理 本設計應用的掃描方法為水平方向(X方向)掃描。 每一個字由16行16列的點陣形成顯示,即每個字均由256個點陣來表示,我們可以把每一個點理解為一個像素。一般我們使用的16×16的點陣宋體字庫,即所謂的16×16,是每一個漢字在縱橫各16點的區域內顯示的。漢字庫從該位置起的32字節信息記錄了該字的字模信息。事實上這個漢字屏不僅可以顯示漢字,也可以顯示在256像素范圍內的任何圖形。 上半部分第一列完成之后,繼續掃描下半部分的第一列,為了接線的方便,我們仍設計成由上往下的掃描方式,即從A8向A15方向掃描,按照這個方法,繼續進行下面的掃描,一共掃描32個8位,可以得出漢字。 2.2硬件設計 2.3軟件設計 #include for(j=q;j<32+q;j++) { P1=sm[t]; P0=seg[j]; j++; P2=seg[j]; delay(50);t--; if(t==0) t=16;} q=q+32; if(q==128) q=0;} } 三.結論 3.1 實訓過程中遇到的問題及解決措施 在本次實驗中,我組在制作的16x16點陣顯示漢字“新年快樂”的課程設計中,首先在使用單片機仿真軟件找尋相關設備時沒有找到16x16的點陣設備,繼而用四個8x8的點陣排列組合予以替代。 依據相關教材及指導教師的參考和建議,我組對于本次設計的電路圖采用了通用模板設計。 此次課程設計的運行程序是我組在設計中的最大難點,后經多方查資料及參考詢問,我組找到了相應漢字在點陣中的排序規律,順利編寫出代碼。 3.2 今后的學習展望 經過這次的單片機課程設計,從產生設計想法到實際操作,到最終的設計完成,中間遇到的困難及困難的解決,讓我更進一步了解了單片機,讓我不再僅僅局限于書本上。 本次的設計經驗對于我們日后的學習工作有非常重要的作用,在遇到困難時可以不僅僅從書本上找解決方案,還可以自己親自動手實踐來驗證相關問題及找到解決方法。 這次難得的課程設計過程中我鍛煉了自己的思考能力和動手能力。通過題目選擇和設計電路的過程中,加強了我思考問題的完整性和實際生活聯系的可行性。在方案設計選擇和芯片的選擇上,培養了我們綜合應用單片機的能力,對單片機的各個管腳的功能也有了進一步的認識。還鍛煉我們個人的查閱技術資料的能力,動手能力,發現問題,解決問題的能力。并且我們熟練掌握了有關器件的性能及測試方法。 四、心得體會 本次的設計經驗對于我們日后的學習工作有非常重要的作用,在遇到困難時可以不僅僅從書本上找解決方案,還可以自己親自動手實踐來驗證相關問題及找到解決方法。 單片機這門課是一科非常重視動手實踐的科目,不能總是看書,但是也不能完全不看書。單片機并不象傳統的數字電路或模擬電路那樣比較直觀,原因是除了“硬件”之外還存在一個“軟件”的因素。正是這個“軟件”的原因使得許多初學者怎么也弄不懂單片機的工作過程,怎么也不明白為什么將幾個數送來送去就能讓數碼管顯示一串字符或控制一個電機的變速。對初學單片機的人來說,需要從書中大概了解一下單片機的各個功能寄存器,如果看的多了反而容易搞亂,現在市場上大多數講單片機的書一開始就講解較復雜的內存、地址、存儲器什么的,更讓初學者感到不知所云、難以入門。如果按教科書式的學法,上來就是一大堆指令、名詞,學了半天還搞不清這些指令起什么作用,能夠產生什么實際效果,那么也許用不了幾天就會覺得枯燥乏味而半途而廢。簡單的說,使用單片機實際上就是用我們自己編寫的軟件去控制單片機的各個功能寄存器。再簡單些,就是控制單片機哪些引腳的電平什么時候輸出高電平,什么時候輸出低電平。由這些高低變化的電平來控制外圍電路,實現我們需要的各個功能。 經過這次的單片機課程設計,從產生設計想法到實際操作,到最終的設計完成,中間遇到的困難及困難的解決,讓我更進一步了解了單片機,讓我不再僅僅局限于書本上。 《單片機原理與應用》 課程設計報告 題 目:LCD數字式溫度濕度測量計 專 業:自動化 班 級:A1332 學 號:10 姓 名:曾志勇 指導老師:查兵 2016-06-08 目 錄 1.設計題目、要求及分工..................................1 1.1.設計要求.........................................1 1.2.分工.............................................1 2.系統設計方案論證與選擇................................1 3.系統硬件電路設計......................................1 3.1.單片機的選擇......................................1 3.2.溫度傳感器電路的設計..............................2 3.3.LCD1602顯示設計..................................3 4.系統軟件設計..........................................4 4.1.主程序...........................................4 4.2.讀出溫度子程序....................................6 5.系統仿真調試結果記錄及分析...........................11 6.總結.................................................13 參考文獻................................................14 設計題目、要求及分工 1.1.設計要求 (1)熟悉掌握單片機的中斷,定時器及各并行口的應用;(2)熟悉掌握單片機溫度濕度的測量方法;(3)利用溫度傳感器及單片機完成對溫度的檢測;(4)掌握將檢測的溫度信號轉換為數碼管顯示的數字信號; (5)設計一個簡單數字溫度計,能夠測量通常環境下的溫度,能夠實現零下溫度的測量,能夠測量小數,精度為0.01度。 1.2.分工 經過我和隊友的商討,為了能最大發揮各自的長處。我主要負責程序的編寫與單片機的調試。他主要負責一些相關資料文獻的查找與課程設計報告。 1.系統設計方案論證與選擇 在日常生活和生產中,我們經常要測量環境的溫度濕度,傳統的測量方式采用水銀溫度計和干濕球濕度計查算法,存在著誤差大,操作使用不便等問題,采用工業級測量儀表價格昂貴。采用AT89C51和溫度傳感器等構成的LCD數字式溫度濕度測量計精度高且價格便宜。 由于本設計是測溫電路,可以使用一只溫度傳感器DS18B20,此傳感器,可以很容易直接讀取被測溫度值,進行A/D轉換,將數據傳入80C51單片機中,單片機處理后,通過LED顯示出當前實測溫度。 2.系統硬件電路設計 2.1.單片機的選擇 單片80C51具有低電壓供電和體積小等特點,四個端口只需要兩個口就能滿足電路系統的設計需要,很適合便攜手持式產品的設計使用系統。 本次設計需要注意的幾個端口: P0口(39—32):是一組8位漏極開路行雙向I/O口,也既地址/數據總線復用口。可作為輸出口使用時,每位可吸收電流的方式驅動8個TTL邏輯電路,對端口寫“1”可作為高阻抗輸入輸入端用。在訪問外部數據存儲器時,這組口線分時轉換地址(低8位)和數據總線復用,在訪問期間激活內部上拉電阻。在Flash編程時,PO口接收指令字節,而在程序校驗時,輸出指令字節,校驗時,要求接上拉電阻。P3口(10—17):是一組帶有內部上拉電阻的8位雙向I/O口,P1的輸入緩沖級可驅動(吸收或輸出電流)4個TTL邏輯門電路。對P3口寫入“1”時,它們被內部上拉電阻拉高并可作為輸出端口。作輸出端口時,被外部拉低的P3口將用上拉電阻輸出電流。 2.2.溫度傳感器電路的設計 DS18B20溫度傳感器是美國DALLAS半導體公司最新推出的一種改進型智能溫度傳感器,與傳統的熱敏電阻等測溫元件相比,它能直接讀出被測溫度,并且可根據實際要求通過簡單的編程實現9~12位的數字值讀數方式。 64位ROM的結構開始8位是產品類型的編號,接著是每個器件的惟一的序號,共有48位,最后8位是前面56位的CRC檢驗碼,這也是多個DS18B20可以采用一線進行通信的原因。溫度報警觸發器TH和TL,可通過軟件寫入戶報警上下限。DS18B20溫度傳感器的內部存儲器還包括一個高速暫存RAM和一個非易失性的可電擦除的EERAM。高速暫存RAM的結構為8字節的存儲器,結構如圖2.3所示。頭2個字節包含測得的溫度信息,第3和第4字節TH和TL的拷貝,是易失的,每次上電復位時被刷新。第5個字節,為配置寄存器,它的內容用于確定溫度值的數字轉換分辨率。DS18B20工作時寄存器中的分辨率轉換為相應精度的溫度數值。該字節各位的定義:低5位一直為1,TM是工作模式位,用于設置DS18B20在工作模式還是在測試模式,DS18B20出廠時該位被設置為0,用戶要去改動,R1和R0決定溫度轉換的精度位數,來設置分辨率S18B20溫度轉換的時間比較長,而且分辨率越高,所需要的溫度數據轉換時間越長。因此,在實際應用中要將分辨率和轉換時間權衡考慮。溫度傳感器18B20匯編程序,采用器件默認的12位轉化,最大轉化時間750微秒,可以將檢測到的溫度直接顯示到80C51的兩個數碼管上。 高速暫存RAM的第6、7、8字節保留未用,表現為全邏輯1。第9字節讀出前面所有8字節的CRC碼,可用來檢驗數據,從而保證通信數據的正確性。 當DS18B20接收到溫度轉換命令后,開始啟動轉換。轉換完成后的溫度值就以16位帶符號擴展的二進制補碼形式存儲在高速暫存存儲器的第1、2字節。單 片機可以通過單線接口讀出該數據,讀數據時低位在先,高位在后,數據格式以0.0625℃/LSB式表示。 當符號位S=0時,表示測得的溫度值為正值,可以直接將二進制位轉換為十進制;當符號位S=1時,表示測得的溫度值為負值,要先將補碼變成原碼,再計算十進制數值。表2是一部分溫度值對應的二進制溫度數據。 DS18B20完成溫度轉換后,就把測得的溫度值與RAM中的TH、TL字節內容作比較。若T>TH或T<TL,則將該器件內的報警標志位置位,并對主機發出的報警搜索命令做出響應。因此,可用多只DS18B20同時測量溫度并進行報警搜索。 在64位ROM的最高有效字節中存儲有循環冗余檢驗碼(CRC)。主機ROM的前56位來計算CRC值,并和存入DS18B20的CRC值作比較,以判斷主機收到的ROM數據是否正確。 另外,由于DS18B20單線通信功能是分時完成的,它有嚴格的時隙概念,因此讀寫時序很重要。系統對DS18B20的各種操作按協議進行。操作協議為:初使化DS18B20(發復位脈沖)→發ROM功能命令→發存儲器操作命令→處理數據。 圖 2-1 溫度傳感器電路 2.3.LCD1602顯示設計 圖 2-2 LCD顯示電路圖 LCD1602顯示流程: 圖3-3 流程圖 3.系統軟件設計 3.1.主程序 主程序的主要功能是負責溫度的實時顯示、讀出并處理DS18B20的測量溫度值。溫度測量每1s進行一次。主程序流程圖如圖4.1所示: #include //初始化LCD1602 //寫地址 80表示初始地址 LcdWriteCom(0x88);LcdWriteData('C');while(1){ LcdDisplay(Ds18b20ReadTemp());Delay1ms(1000);//1s鐘刷一次 // } } /* 函數名 : LcdDisplay()* 函數功能 : LCD顯示讀取到溫度/ void LcdDisplay(int temp)//lcd顯示 { unsigned char datas[] = {0, 0, 0, 0, 0};//定義數組 float tp;if(temp< 0) //當溫度值為負數 { LcdWriteCom(0x80); //寫地址 80表示初始地址 LcdWriteData('-');//顯示負 temp=temp-1; temp=~temp; tp=temp; temp=tp*0.0625*100+0.5;} else { LcdWriteCom(0x80); LcdWriteData('+'); tp=temp; temp=tp*0.0625*100+0.5; } datas[0] = temp / 10000;datas[1] = temp % 10000 / 1000;datas[2] = temp % 1000 / 100;datas[3] = temp % 100 / 10;datas[4] = temp % 10;LcdWriteCom(0x82); //寫地址 80表示初始地址 LcdWriteData('0'+datas[0]);//百位 LcdWriteCom(0x83); //寫地址 80表示初始地址 LcdWriteData('0'+datas[1]);//十位 LcdWriteCom(0x84); //寫地址 80表示初始地址 LcdWriteData('0'+datas[2]);//個位 LcdWriteCom(0x85); //寫地址 80表示初始地址 //顯示 ‘.’ //寫地址 80表示初始地址 LcdWriteData('.');LcdWriteCom(0x86); LcdWriteData('0'+datas[3]);//顯示小數點 LcdWriteCom(0x87); //寫地址 80表示初始地址 } LcdWriteData('0'+datas[4]);//顯示小數點 圖 3-1主程序流程圖 3.2.讀出溫度子程序 讀出溫度子程序的主要功能是讀出RAM中的9字節。在讀出時必須進行CRC 校驗,校驗有錯時不能進行溫度數據的改寫。讀出溫度子程序流程圖如下圖所示: #include“temp.h” void Delay1ms(uint y){ uint x; } uchar Ds18b20Init(){ uchar i;DSPORT = 0;i = 70; //將總線拉低480us~960us for(;y>0;y--){ for(x=110;x>0;x--);} while(i--);//延時642us DSPORT = 1; //然后拉高總線,如果DS18B20做出反應會將在15us~60us后總線拉低 } void Ds18b20WriteByte(uchar dat)i = 0;while(DSPORT)//等待DS18B20拉低總線 { } return 1;//初始化成功 i++;if(i>5)//等待>5MS { } Delay1ms(1);return 0;//初始化失敗 { uint i, j;for(j=0;j<8;j++) { DSPORT = 0;i++;DSPORT = dat & 0x01;//然后寫入一個數據,從最低位開始 i=6;while(i--);//延時68us,持續時間最少60us DSPORT = 1; //然后釋放總線,至少1us給總線恢復時間才能接 //每寫入一位數據之前先把總線拉低1us 著寫入第二個數值 } uchar Ds18b20ReadByte(){ uchar byte, bi;uint i, j;for(j=8;j>0;j--){ DSPORT = 0;//先將總線拉低1us i++;DSPORT = 1;//然后釋放總線 i++;i++;//延時6us等待數據穩定 bi = DSPORT;//讀取數據,從最低位開始讀取 /*將byte左移一位,然后與上右移7位后的bi,注意移動之后移掉 } dat >>= 1;那位補0。*/ byte =(byte >> 1)|(bi << 7); } i = 4;//讀取完之后等待48us再接著讀取下一個數 while(i--); } return byte;void Ds18b20ChangTemp(){ Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc); //跳過ROM操作命令 Ds18b20WriteByte(0x44);//溫度轉換命令 //等待轉換成功,而如果你是一直刷著的話,就不// Delay1ms(100);用這個延時了 } void Ds18b20ReadTempCom(){ Ds18b20Init(); } int Ds18b20ReadTemp(){ int temp = 0; 命令 tml = Ds18b20ReadByte();tmh = Ds18b20ReadByte();temp = tmh;temp <<= 8;Delay1ms(1);Ds18b20WriteByte(0xcc);//跳過ROM操作命令 Ds18b20WriteByte(0xbe);//發送讀取溫度命令 uchar tmh, tml;Ds18b20ChangTemp();Ds18b20ReadTempCom(); //先寫入轉換命令 //然后等待轉換完后發送讀取溫度 //讀取溫度值共16位,先讀低字節 //再讀高字節 } temp |= tml;return temp;讀出溫度子程序 讀出溫度子程序的主要功能是讀出RAM中的9字節。在讀出時須進行CRC校驗,校驗有錯時不進行溫度數據的改寫。得出溫度子程序流程圖如下圖所示。 圖 3-2 溫度轉換命令子程序 溫度轉換命令子程序主要是發溫度轉換開始命令。當采用12位分辨率時,轉換時間約為750ms。在本程序設計中,采用1s顯示程序延時法等待轉換的完成。溫度轉換命令子程序流程圖如下圖所示。 圖 3-2 4.系統仿真調試結果記錄及分析 硬件調試比較簡單,首先檢查電感的焊接是否正確,然后可用萬用表測試或通電檢測。軟件調試可以先編寫顯示程序并進行硬件的正確性檢驗,然后分別進行主程序、讀出溫度子程序、溫度轉換命令子程序、計算溫度子程序和現實數據刷新子程序等的編程及調試 由于DS18B20與單片機采用串行數據傳送,因此,對DS18B20進行讀/寫編程時必須嚴格地保證讀/寫時序;否則將無法讀取測量結果。 電路Isis仿真測試 燒寫程序至單片機: 液晶顯示室溫為+28.06度 用手觸摸DS18B20,發現溫度上升為+32.75度,證明溫度傳感正常工作。 5.總結 這次課程設計,主要是以STC89C51單片機為核心的,對溫度的檢測與顯示進行了簡單的設計與闡述。因沒有濕度傳感器模塊,所以未進行濕度檢測。本次課程設計可以說是軟硬結合,又以硬件為主。當今科技發展迅速,單片機開發有著光明的前景。由于單片機經濟實用、開發簡便等特點依然在工業控制、家電等領域占據了廣泛的市場。所以我選擇這樣的設計課題,并且能通過此次設計來提高自己軟件編制和硬件電路設計的能力。在我完成這次課程設計的過程中,當看到自己將專業知識用于解決實際的問題時,那份成就感和喜悅感是難以形容的。在這次實際的編程以及調試程序過程中,我發現自己學很多課本以外的東西。光靠自己在書本上所學過的這點知識是遠遠不夠的,真正地認識到了工作就是學習的道理。尤其是對于編程來說,需要硬件的功底,也需要軟件的能力。當程序有一點點錯誤時,將使整個程序無效,需要自己靜下心來發現錯誤,改正錯誤,一次又一次得進行調試,鍛煉了沉著踏實的心態。 通過這次對數字溫度計的設計與制作,讓我們了解了設計電路的程序,也讓我們了解了關于數字溫度計的原理與設計理念,要設計一個電路總要先用仿真,仿真成功之后才實際接線的。 但是最后的成品卻不一定與仿真時完全一樣,因為,在實際接線中有著各種各樣的條件制約著。并且,在仿真中無法成功的電路接法,在實際中因為芯片本身的特性而能夠成功。所以,在設計時應考慮兩者的差異,從中找出最適合的設計方法。 通過這次學習,讓我們對各種電路都有了大概的了解,所以說,坐而言不如立而行,對于這些電路還是應該自己動手實際操作才會有深刻理解。從這次的課程設計中,我真正的意識到,在以后的學習中,要理論聯系實際,把我們所學的理論知識應用到實際當中,學習單機片機更是如此,程序只有在經常寫和讀的過程中才能提高,這就是我在這次課程設計中的最大收獲。這次課程設計對我來說是一次比較全面的、富有創造性和探索性的鍛煉,令我深有感觸,對于我今后的學習、工作和生活都將是受益非淺。 參考文獻 (1)江世明.單片機原理與應用.上海交通大學出版社.2013;(2)朱清慧.電子線路設計、制版與仿真.清華大學出版社.2011.6; (3)黃同成.程序設計基礎與教程(C語言).湖南人民出版社.2011.12; (4)王東峰等.單片機C語言應用100例[M].北京電子工業出版社,2009; (5)陳海宴.51單片機原理及應用[M].北京航空航天大學出版社.2010; (6)胡漢才.單片機原理及接口技術[M].北京清華大學出版社.1996; (7)高稚允,高岳.光電檢測技術[M].北京國防工業出版社.1983; 仲愷農業工程學院實驗報告紙 信息學院(院、系)專業班組單片機原理及接口技術課實驗四單片機鍵盤輸入以及數碼管顯示編程 一、實驗目的1、掌握單片機鍵盤以及數碼管顯示的工作原理; 2、掌握單片機鍵盤以及數碼管顯示的編程方法。 二、實驗內容 1、學習單片機鍵盤檢測、消抖以及譯碼等; 2、學習單片機數碼管靜態以及動態的顯示方式; 3、利用單片機鍵盤以及數碼管編寫程序驅動開發板上的蜂鳴器以及數碼管按一定規律工作。 三、實驗設備 1、STC單片機開發板; 2、PC機以及串口線。 四、實驗步驟 參考實驗指導書。 五、實驗總結第三篇:單片機16點陣漢字顯示課程設計
第四篇:單片機課程設計報告LCD顯示溫度
第五篇:實驗四 單片機鍵盤輸入以及數碼管顯示編程