第一篇:單片機課程設計報告
DS18B20測溫及按鍵控制
課 程 設 計
課程名稱 單片機基礎課程設計 題目名稱 18B20測溫及按鍵控制 學生學院 **** 專業班級 **** 班號 **** 學生組員 ****** 指導教師 *****
DS18B20測溫及按鍵控制
第一章系統的概述及設計任務書
摘要和關鍵詞【摘要】:
本設計所介紹的數字溫度計與傳統的溫度計相比,具有讀數方便,測溫范圍廣,測溫準確,其輸出溫度采用數字顯示,主要用于對測溫比較準確的場所,或科研實驗室使用,該設計控制器使用單片機STC89C52,測溫傳感器使用DS18B20,用4位共陽極LED數碼管以串口傳送數據,實現溫度顯示,能準確達到以上要求。
【關鍵詞】:單片機,數字控制,溫度計,DS18B20,STC89C52 設計任務與技術指標
要求:1.基本范圍-50℃-125℃
2.精度誤差小于0.5℃ 3.LED數碼直讀顯示
總體設計方案
數字溫度計設計方案論證
方案一
由于本設計是測溫電路,可以使用熱敏電阻之類的器件利用其感溫效應,在將隨被測溫度變化的電壓或電流采集過來,進行A/D轉換后,就可以用單片機進行數據的處理,在顯示電路上,就可以將被測溫度顯示出來,這種設計需要用到A/D轉換電路,感溫電路比較麻煩。方案二
進而考慮到用溫度傳感器,在單片機電路設計中,大多都是使用傳感器,所以這是非常容易想到的,所以可以采用一只溫度傳感器DS18B20,此傳感器,可以很容易直接讀取被測溫度值,進行轉換,就可以滿足設計要求。
從以上兩種方案,很容易看出,采用方案二,電路比較簡單,軟件設計也比較簡單,故采用了方案二。
方案二的總體設計框圖
溫度計電路設計總體設計方框圖如圖1所示,控制器采用單片機AT89S51,溫度傳感器采用DS18B20,用3位LED數碼管以串口傳送數據實現溫度顯示。
第二章 單元模塊的設計與分析
主控制器:
單片機STC89C52,具有低電壓供電和體積小等特點,四個端口只需要兩個口就能滿足電路系統的設計需要,很適合便攜手持式產品的設計使用。
DS18B20測溫及按鍵控制
個字節,為配置寄存器,它的內容用于確定溫度值的數字轉換分辨率。DS18B20工作時寄存器中的分辨率轉換為相應精度的溫度數值。該字節各位的定義如圖3所示。低5位一直為1,TM是工作模式位,用于設置DS18B20在工作模式還是在測試模式,DS18B20出廠時該位被設置為0,用戶要去改動,R1和R0決定溫度轉換的精度位數,來設置分辨率。
系統軟件算法分析
系統程序主要包括主程序,讀出溫度子程序,溫度轉換命令子程序,計算溫度子程序,顯示數據刷新子程序等。
主程序
主程序的主要功能是負責溫度的實時顯示、讀出并處理DS18B20的測量的當前溫度值,溫度測量每1s進行一次。這樣可以在一秒之內測量一次被測溫度,其程序流程見圖7所示。3.2讀出溫度子程序
讀出溫度子程序的主要功能是讀出RAM中的9字節,在讀出時需進行CRC校驗,校驗有錯時不進行溫度數據的改寫。其程序流程圖如圖8示
3.3溫度轉換命令子程序
溫度轉換命令子程序主要是發溫度轉換開始命令,當采用12位分辨率時轉換時間約為750ms,在本程序設計中采用1s顯示程序延時法等待轉換的完成。溫度轉換命令子程序流程圖如上圖,圖9所示
3.4 計算溫度子程序
計算溫度子程序將RAM中讀取值進行BCD碼的轉換運算,并進行溫度值正負的判定,其程序流程圖如圖10所示。
DS18B20測溫及按鍵控制
第三章 實驗程序
else
{ b=0-b;
if(b%10==1)f-=1;b=10-(b%10);/*zhwy.c*/ if(b==10)b=0;
for(i=16;i>0;i--)#include
led(a,b,c,d);} #include“DS18B20.h” return f;unsigned char table[]= } {0xC0,0xF9,0xA4,0xB0, void main(void)
0x99,0x92,0x82,0xF8, { unsigned int Sum,k;0x80,0x90,};//不帶小數點的編碼
signed int h,j;extern unsigned int temp;LED_init();extern float f_temp;h=0;j=0;unsigned int i;while(1)void LED_init(void){tempchange();{ P2=0x0f;Sum=get_temp();P0=0x00;P2=0xff;} for(k=0;k<100;k++)void led(signed int m,signed int { n,signed int p,signed int q)if(P2==0xf7){ P2=0xef;
{delay(10);
P0=table[q];
if(P2==0xf7)
delay(5);
h+=1;
P2=0xdf;h=display(Sum,h,j);
P0=table[p];
}
delay(5);if(P2==0xfb)
P2=0xbf;
{delay(10);
P0=table[n]+0x80;
if(P2==0xfb)
delay(5);
h-=1;
P2=0x7f;
h=display(Sum,h,j);
P0=table[m];
}
delay(5);if(P2==0xfd)}
{delay(10);unsigned int display(unsigned int
if(P2==0xfd)y,signed int f,signed int g)
j+=1;{ signed int a,b,c,d;
h=display(Sum,h,j);
a=y/1000;
} b=(y%1000)/100+f;if(P2==0xfe)c=(y%100)/10+g;
{delay(10);d=(y%10)/1;
if(P2==0xfe)if(b<=9&&b>=0)
j-=1;for(i=16;i>0;i--)
h=display(Sum,h,j);
led(a,b,c,d);
} else if(b>9)
} {a+=b/10;b=b%10;
display(Sum,h,j);for(i=16;i>0;i--)} }
led(a,b,c,d);} void delay(unsigned int z)//延 時函數
/*DS18B20.h */ {unsigned int x,y;sbit ds=P3^5;//溫度傳感器信號線 for(x=z;x>0;x--)unsigned int temp;for(y=110;y>0;y--);float f_temp;} unsigned int warn_l1=260;void dsreset(void)//18B20復位,unsigned int warn_l2=250;初始化函數 unsigned int warn_h1=300;{unsigned int i;unsigned int warn_h2=320;ds=0;
i=103;
DS18B20測溫及按鍵控制
總電路圖結構圖
4總結與體會
經過將近四周的單片機課程設計,我終于在參考了眾多程序之后完成了我的數字溫度計的設計,雖然沒有完全達到設計要求,但我還是高興的,畢竟這次設
第二篇:單片機課程設計報告
單片機課程設計報告
? 課程名稱:單片機原理及接口課程設計
? 題目:基于
? 學院:電氣信息學院
? 專業班級:測控技術與儀器
? 姓名:江讓
? 學號:
? 指導老師:劉升老師
? 時間:
C51單片機的ADC0809數模轉換103班1090640772013/1/16
第三篇:單片機課程設計報告
單片機課程設計報告
題目:小直流電機調速實驗
教學單位: 機 電 工 程 系
專業: 機械設計制造及其自動化
班級: 0803班學號: 0811050342姓名: 程懷虎
2011 年 11月
(以下內容用宋體,五號,單倍行距)
第四篇:單片機課程設計報告
課程設計報告
題 目: 自動滴灌系統設計
課程名稱: 單片機原理及應用 學 院: 信息工程學院
專 業: 計算機科學與技術 班 級: 2014 級計本 1 班
學生姓名: *** 學 號: 201403031 指導教師: 巫 宗 賓
成 績:
開課時間: 2016~2017 學年 2 學期
目錄
第一章 系統概要.........................................................................................................................2 1.1系統背景............................................................................................................................2 1.2系統功能............................................................................................................................2 1.3設計要求............................................................................................................................2 第二章 系統硬件原理...............................................................................................................3 2.1AW60主要模塊和特點........................................................................................................3 2.2 LCD模塊............................................................................................................................3 2.3 LED模塊............................................................................................................................4 第三章 系統軟件設計.................................................................................................................6 3.1系統流程............................................................................................................................6 3.2主程序(main.c)............................................................................................................7 3.2中斷處理程序(isr.c)..................................................................................................7 3.3構件組成............................................................................................................................9 第四章 系統測試.......................................................................................................................27 4.1測試結果..........................................................................................................................27 第五章 總結展望........................................................................................................................31 5.1總結..................................................................................................................................31 5.2展望..................................................................................................................................31 參考文獻.....................................................................................................................................32
第一章 系統概要
1.1系統背景
隨著科學技術的發展電子技術產業結構調整,單片機開始迅速發展,由于單片機本身的易于控制,精度高,自動化全面,市場對于智能控制系統的需求也越來越大。自動滴灌系統,就是在單片機程序的控制下實現濕度監測、滴灌控制的設備。單片機系統座位一種典型的嵌入式系統,其系統設計包括硬件設計和軟件設計編程設計兩個方面,其調試過程一般分為軟件調試,硬件調試,系統調試。自動滴灌系統需要實現濕度采集,A/D轉換,濕度顯示,工作狀態顯示,電機驅動的功能。
1.2系統功能
首先要進行濕度監測,每隔固定的時間就采集一次濕度,在內部轉換后與標準值進行比較如果濕度值低于給定值的話就切換至工作狀態,滴灌結束時自動切換至結束模式,繼續監測濕度。
仿真狀態下濕度監測采用軟件模擬實現,采集濕度信息使用LED顯示,每隔5s采集一次。工作狀態由LCD顯示。分別有滴灌開始(“Drip-irrigation is starting..”),和滴灌結束(“Drip-irrigation has ended..”)。滴灌時間為5s。結束后切換至結束模式。
1.3設計要求
學生在設計中可以引用所需的參考資料,避免重復工作,加快設計進程,但必須和題目的要求相符合,保證設計的正確。學生要在老師的指導下制定好自己各環節的詳細設計進程計劃,按給定的時間計劃保質保量的完成個階段的設計任務。設計中可邊設計,邊修改,軟件設計與硬件設計可交替進行,問題答疑與調試和方案修改相結合,提高設計的效率,保證按時完成設計工作并交出合格的設計報告。1
第二章 系統硬件原理
2.1AW60主要模塊和特點
AW60系列主要常規模塊和特點:
(1)最高達40MHz的CPU工作頻率和20MHz的內部總線工作頻率;時鐘源選項包括晶振,諧振器,外部時鐘或,內部產生的時鐘。
(2)相比HC08CPU指令集,S08CPU增加了BGND指令。
(3)單線后臺調試模式接口:增強的斷點能力,允許單一的斷點設置在線調試(在片內調試模塊增加了多于兩個的斷點)。
(4)內含32個中斷/復位源;內含2KB的片內RAM;內含60KB的片內在線可編程的Flash存儲器,帶有 塊保護和安全選項。
(5)可選的計算機正常操作(COP)復位;低電壓檢測與復位或中斷;非法操作碼檢測與復位;非法地址檢測與復位。
(6)ADC:多達16個通道,10個A/D轉換器與動動比較功能;兩個串行通信接口SCI模塊與可選的13位中斷;一個串行外設接口SPI模塊;集成電路互聯總線IIC模塊運行高達100kbps的最高總線負載;8引腳鍵盤中斷KBI模塊。
(7)Timers:1個2 通道和一個6通道16位定時器/脈沖寬度調制器模塊。既有輸入捕獲,輸出比較,脈寬調制功能。AW子系列MCU的4種封裝形式只是引腳數量和形式有所區別,其他方面是一致的。
2.2 LCD模塊
LCD作為電子信息產品的主要顯示器件,相對于其他類型的顯示器件來說有其自身的特點,主要包括:
(1)低電壓,低功耗;(2)平板型結構;
(3)使用壽命長;
(4)被動顯示;
(5)顯示信息量大且易于彩色化; 1
(6)無電磁輻射。
點陣字符型LCD是專門用于顯示數字,字母,圖形符號及少量自定義符號的液晶顯示器。這類顯示器把LCD控制器,點陣驅動器,字符存儲器,顯示體及少量的阻容元件等集成一個液晶顯示模板。鑒于字符型液晶顯示模塊目前在國際上已經規范化,其電特性及接口特性是統一的,只要設計出一種型號的接口電路,在指令上稍加修改即可使用各種規格的字符型液晶顯示器模塊。
字符型液晶顯示器模塊的特點如下:
(1)液晶顯示屏是以若干5*8或5*11點陣塊等組成的顯示字符群。每個點陣塊塊為一個字符位,字符間距和行間距都是一個點的寬度。
(2)主控制電路為HD44780(HITACHI及其他公司的兼容電路。從程序員的角度來看LCD顯示接口與編程是面向HD44780的,只要了解HD44780的編程結構即可進行LCD的顯示編程。
(3)內部具有字符發生器ROM,可顯示192種字符。
(4)具有64字節的字符發生器RAM,可以定義8個5*8點陣字符或4個5*11的點陣字符。
(5)具有64字節的數據顯示RAM,供顯示器編程使用。(6)標準接口特性,與MC9S08系列的MCU容易接口。(7)模塊結構緊湊,輕巧,裝配容易。
(8)單+5V電源供電(寬溫型需要加-7V驅動電源)。(9)低功耗,高可靠性。
2.3 LED模塊
LED發光二極管分為共陰極和共陽極數碼管,若為共陰極數碼管則公共端接地,若為共陽極數碼管則公共端接電源正極。如圖1: 1
圖1
實際應用中是多個LED共同使用,MCU通過一個稱為數據口的8位數據端口來控制位段而原來8段數碼管的公共端,原來接到公共電平,現在接MCU的一個引腳,由MCU來控制,通常叫做位選信號,這樣MCU的8個端口就可以控制8連排的數碼管了。若要控制更多數碼管則需加一個譯碼芯片。每個時刻只讓一個數碼管有效,由于人的視覺暫留效應(100ms)可以達到同時顯示的效果。
圖2是MCU與4排8段數碼管的連接:
圖2 1
第三章 系統軟件設計
3.1系統流程
開始初始化土壤濕度數據采集顯示濕度N小于設定值Y顯示滴灌開始計時結束,結束滴灌顯示滴灌結束 圖3 圖3是系統流程圖,開始時先初始化各個部件,LCD顯示結束滴灌信息,LED顯示為全零。后每隔五秒采集一次濕度數據用LED顯示濕度。判斷濕度值是否低于設定值,低于設定值的話立即啟動滴灌,此時濕度上升,結束滴灌。若沒有低于設定值的話,則繼續監測。LED不斷刷新顯示當前濕度值。1
3.2主程序(main.c)
#include “includes.h” //包涵總頭文件 int main(void){ work = 0;shidu = 75;enter_critical();LEDInit();//LED初始化 LCDInit();//LCD初始化 tpm_init(TPM0,TPM_CLKSRC_PLL,1000);//初始化TPM模塊,1ms中斷一次
light_init(LIGHT_PORT, LIGHT_PIN_RED, LIGHT_OFF);light_init(LIGHT_PORT, LIGHT_PIN_GREEN, LIGHT_OFF);tpm_enable_int(0);init_critical();for(;;){
}
} return 0;3.2中斷處理程序(isr.c)
//================== //文件名稱:isr.c //功能概要: 中斷底層驅動構件源文件
//版權所有:蘇州大學飛思卡爾嵌入式中心(sumcu.suda.edu.cn)1
//================== #include “includes.h” void tpm0_isr(void){ static uint_32 TPMCounter = 0;//計時器 static uint_8 LEDindex=0;//位選口聲明 uint_8 LEDDataBuffer[4];//LED顯示緩沖區
changeCode(shidu,LEDDataBuffer);//將濕度值轉化為對應字符輸出 uint_8 i;uint_8 * working;uint_8 * stop;working =(uint_8 *)“Drip-irrigation is starting......”;stop =(uint_8 *)“Drip-irrigation has ended......”;if((TPM_SC_REG(TPM0_BASE_PTR)TPM_SC_TOF_MASK){ TPMCounter++;
&
TPM_SC_TOF_MASK)
== } BSET(TPM_SC_TOF_SHIFT,TPM_SC_REG(TPM0_BASE_PTR));//中斷置標志位寫1清0 LEDindex++;//位選位+1 if(LEDindex>=4)LEDindex=0;//大于4位選口置0 i=LEDchangeCode(LEDDataBuffer[LEDindex]-'0');//轉碼 LEDshow1(LEDindex,i);if(TPMCounter>5000){
shidu = sdmn(shidu);if(shidu <= 65){ 1
} changeState(&work);//改變工作狀態
if(work == 0)
{ LCDShow(stop);TPMCounter = 0;light_control(LIGHT_PORT, LIGHT_PIN_RED, LIGHT_ON);light_control(LIGHT_PORT, LIGHT_PIN_GREEN, LIGHT_OFF);} if(work == 1){
LCDShow(working);
TPMCounter = 0;shidu = 80;light_control(LIGHT_PORT, LIGHT_PIN_GREEN, LIGHT_ON);light_control(LIGHT_PORT, LIGHT_PIN_RED, LIGHT_OFF);changeState(&work);}
} }
3.3構件組成
1、TPM構件:
//=================== //文件名稱:tpm.c //功能概要:tpm底層驅動構件源文件 1
//版權所有:蘇州大學飛思卡爾嵌入式中心(sumcu.suda.edu.cn)//====================== #include “tpm.h” //定時器模塊0,1,2地址映射 Const TPM_MemMapPtr TPM_ARR[]={TPM0_BASE_PTR,TPM1_BASE_PTR,TPM2_BASE_PTR};//====================== //函數名稱:tpm_enable_int //功能概要:使能tpm模塊中斷。
//參數說明:tpmModule:模塊號:0、1、2 //函數返回:無
//====================== void tpm_enable_int(uint_8 tpmModule){ } //====================== //函數名稱:tpm_disable_int //功能概要:禁止tpm模塊初始化。enable_irq(tpm0_irq_no + tpmModule);//參數說明:tpmModule:模塊號:0、1、2 //函數返回:無
//====================== void tpm_disable_int(uint_8 tpmModule){ } //====================== //函數名稱:tpm_init //功能概要:初始化tpm模塊.1
disable_irq(tpm0_irq_no + tpmModule);
//參數說明:tpmModule:模塊號:0、1、2 //clk_src_sel:時鐘源選擇:1:PLL/FLL(推薦)、2:晶振、3:內部參考時鐘。1,2可用
// int_us:中斷毫秒數,中斷時間間隔,單位為毫秒,10ms=10000 //函數返回:函數執行狀態:0=正常;非0=異常
//====================== uint_8 tpm_init(uint_8 tpmModule,uint_8 clk_src_sel,uint_32 int_us){
if(tpmModule>2)//防止越界值 { } //開啟SIM時鐘門 tpmModule=2;BSET(SIM_SCGC6_TPM0_SHIFT+tpmModule,SIM_SCGC6);//使能TPM時鐘
//中斷時間計算:(48000/8)*10000/1000=0x7530 10ms中斷一次 switch(clk_src_sel){ case 1: //MCGPLL/2或者MCGFLL作為時鐘源 BSET(SIM_SOPT2_PLLFLLSEL_SHIFT,SIM_SOPT2);
//使能PLL為時鐘源
int_us=(48000/8)*int_us/1000;break;case 2: //晶振作為時鐘源
int_us=(8000/8)*int_us/1000;OSC0_CR|=OSC_CR_ERCLKEN_MASK;//開啟晶振輸出時鐘
break;case 3: //內部參考時鐘,由MCG決定 break;
default: 1
} return 1;//傳參錯誤,返回
SIM_SOPT2 |= SIM_SOPT2_TPMSRC(clk_src_sel);//使能時鐘選擇 TPM_ARR[tpmModule]->CNT=0x00;TPM_ARR[tpmModule]->MOD=int_us;//TOF寫1清0,TOIE中斷使能,CMOD選擇每次時鐘加1,PS=0x011 選擇8分頻;TPM_ARR[tpmModule]->SC=TPM_SC_TOF_MASK|TPM_SC_TOIE_MASK|TPM_SC_CMOD(1)|TPM_SC_PS(3);return 0;} //====================== //函數名稱:tpm_stop //功能概要:禁止tpm模塊。
//參數說明:tpmModule:模塊號:0、1、2 //函數返回:無
//====================== void tpm_stop(uint_8 tpmModule){ } Tpm.h //====================== //文件名稱:tpm.c //功能概要:tpm底層驅動構件源文件
//版權所有:蘇州大學飛思卡爾嵌入式中心(sumcu.suda.edu.cn)//====================== #ifndef TPM_H 1
TPM_ARR[tpmModule]->SC&=~TPM_SC_CMOD(3);
#define TPM_H
#include “common.h” #include “sysinit.h” //中斷號
#define tpm0_irq_no 17 #define tpm1_irq_no 18 #define tpm2_irq_no 19 //時鐘選擇
#define TPM_CLKSRC_PLL 1 #define TPM_CLKSRC_OSC 2 #define TPM_CLKSRC_IRC 3 //模塊號 #define TPM0 0 #define TPM1 1 #define TPM2 2
//====================== //函數名稱:tpm_enable_int //功能概要:使能tpm模塊中斷。
//參數說明:tpmModule:模塊號:0、1、2 //函數返回:無
//====================== void tpm_enable_int(uint_8 tpmModule);//====================== //函數名稱:tpm_disable_int //功能概要:禁止tpm模塊初始化。
//參數說明:tpmModule:模塊號:0、1、2 //函數返回:無 1
//====================== void tpm_disable_int(uint_8 tpmModule);//====================== //函數名稱:tpm_init //功能概要:初始化tpm模塊.//參數說明:tpmModule:模塊號:0、1、2 //clk_src_sel:時鐘源選擇:1:PLL/FLL(推薦)、2:晶振、3:內部參考時鐘。1,2可用
// int_us:中斷毫秒數,中斷時間間隔,單位為毫秒,10ms=10000 //函數返回:函數執行狀態:0=正常;非0=異常
//====================== uint_8 tpm_init(uint_8 tpmModule,uint_8 clk_src_sel,uint_32 int_us);//====================== //函數名稱:tpm_stop //功能概要:禁止tpm模塊。
//參數說明:tpmModule:模塊號:0、1、2 //函數返回:無
//====================== void tpm_stop(uint_8 tpmModule);#endif
2、LED構件
//===================== // 文件名稱:led.c // 功能概要:led構件源文件
// 版權所有: 蘇州大學飛思卡爾嵌入式中心(sumcu.suda.edu.cn)//====================== #include “led.h” //led位選端口 struct GPIO led_cs[4]= 1
{
{LED_CS0_PORT,LED_CS0}, {LED_CS1_PORT,LED_CS1}, {LED_CS2_PORT,LED_CS2}, {LED_CS3_PORT,LED_CS3}, };//led數據端口 struct GPIO led_d[8]= {
{LED_D1_PORT,LED_D1}, {LED_D2_PORT,LED_D2}, {LED_D3_PORT,LED_D3}, {LED_D4_PORT,LED_D4}, {LED_D5_PORT,LED_D5}, {LED_D6_PORT,LED_D6}, {LED_D7_PORT,LED_D7}, {LED_D8_PORT,LED_D8}, };
//====================== //函數名稱:LEDInit //函數返回:無 //參數說明:無 //功能概要:LED初始化。
//====================== void LEDInit(){ uint_8 i = 0;//定義8根數據線為輸出,初始輸出0 for(i = 0;i < 8;i++)gpio_init(led_d[i].gpio_port, led_d[i].gpio_pin, 1, 0);1
//定義4位選線定義為輸出,初始輸出0 for(i = 0;i < 4;i++)gpio_init(led_cs[i].gpio_port, led_cs[i].gpio_pin, 1, 0);} //====================== //函數名稱:LEDshow1 //函數返回:無
//參數說明:i:指定LED哪一位顯示,c:顯示的內容 //功能概要:指定LED的第i位顯示c。
//====================== void LEDshow1(uint_8 i, uint_8 c){ uint_8 temp;uint_8 j;//位選全部置0 for(j=0;j<=3;j++)gpio_set(led_cs[j].gpio_port, led_cs[j].gpio_pin, 0);//數據上線 for(j=0;j<=7;j++){ temp =(c>>j)& 0x01;
gpio_set(led_d[j].gpio_port, led_d[j].gpio_pin, temp);} //選擇的位選置1 gpio_set(led_cs[i].gpio_port, led_cs[i].gpio_pin, 1);}
//顯示碼表
const uint_8 Dtable[24] = 1
// 0 1 2 3 4 5 6 7 8 9 {0x3F,0x06,0x5B,0x4F,0x66, 0x6D,0x7D,0x07,0x7F,0x6F, // 11 12 13 14 15 16 17 18 19 20 // 0.1.2.3.4.5.6.7.8.9.0xBF,0x86,0xDB,0x4F,0x66, 0x6D,0x7D,0x07,0xFF,0x6F, // 21 22 23(全亮)24(全滅)// E F 0x79,0x71, 0xFF, 0x00};//====================== //函數名稱:LEDchangeCode //函數返回:返回數據num對應的顯示碼 //參數說明:num:需要轉換成顯示碼的數字 //功能概要:數字轉成顯示碼
//===================== uint_8 LEDchangeCode(uint_8 num){ return Dtable[num];} LED.h //====================== // 文件名稱:led.h // 功能概要:led構件頭文件
// 版權所有: 蘇州大學飛思卡爾嵌入式中心(sumcu.suda.edu.cn)//======================
#ifndef led_H //防止重復定義(開頭)#define led_H #include “GPIOapp.h” //LED數據口分別接PORTB的{11,10,9,8,3,2,1,0}引腳 1
#define LED_D1_PORT PORTB #define LED_D1 11 #define LED_D2_PORT PORTB #define LED_D2 10 #define LED_D3_PORT PORTB #define LED_D3 9 #define LED_D4_PORT PORTB #define LED_D4 8 #define LED_D5_PORT PORTB #define LED_D5 3 #define LED_D6_PORT PORTB #define LED_D6 2 #define LED_D7_PORT PORTB #define LED_D7 1 #define LED_D8_PORT PORTB #define LED_D8 0 //LED位選口分別接PORTB的{19,18,17,16}引腳 #define LED_CS0_PORT PORTB #define LED_CS0 19 #define LED_CS1_PORT PORTB #define LED_CS1 18 #define LED_CS2_PORT PORTB #define LED_CS2 17 #define LED_CS3_PORT PORTB #define LED_CS3 16 //====================== //函數名稱:LEDInit //函數返回:無 //參數說明:無 1
//功能概要:LED初始化。
//====================== void LEDInit();//====================== //函數名稱:LEDshow1 //函數返回:無
//參數說明:i:指定LED哪一位顯示,c:顯示的內容 //功能概要:指定LED的第i位顯示c。
//====================== void LEDshow1(uint_8 i, uint_8 c);//====================== //函數名稱:LEDchangeCode //函數返回:返回數據num對應的顯示碼 //參數說明:num:需要轉換成顯示碼的數字 //功能概要:數字轉成顯示碼
//====================== uint_8 LEDchangeCode(uint_8 num);#endif //防止重復定義(結尾)
3、LCD構件
//====================== // 文件名稱:lcd.c // 功能概要:lcd構件頭文件
// 版權所有: 蘇州大學飛思卡爾嵌入式中心(sumcu.suda.edu.cn)//====================== #include “lcd.h”//lcd控制位和數據位端口及引腳號 struct GPIO LCD[11]= { {LCD_RS_PORT,LCD_RS}, 1
{LCD_RW_PORT,LCD_RW}, {LCD_E_PORT,LCD_E}, {LCD_D0_PORT,LCD_D0}, {LCD_D1_PORT,LCD_D1}, {LCD_D2_PORT,LCD_D2}, {LCD_D3_PORT,LCD_D3}, {LCD_D4_PORT,LCD_D4}, {LCD_D5_PORT,LCD_D5}, {LCD_D6_PORT,LCD_D6}, {LCD_D7_PORT,LCD_D7}, };//內部函數原型說明
extern void LCDCommand(uint_8 cmd);//====================== //函數名稱:LCDInit //函數返回:無 //參數說明:無
//功能概要:LCD初始化。
//====================== void LCDInit(){ uint_32 i = 0; //定義數據口和控制口為輸出 for(i = 0;i < 11;i++){ gpio_init(LCD[i].gpio_port, LCD[i].gpio_pin, 1,0);} //設置指令,RS,R/W = 00, 寫指令代碼
gpio_set(LCD[0].gpio_port, LCD[0].gpio_pin, 0);gpio_set(LCD[1].gpio_port, LCD[1].gpio_pin, 0);1
//功能設置-//設置指令
LCDCommand(0x38);//5*7點陣模式,2行顯示,8位數據總線 LCDCommand(0x08);//關顯示,關光標顯示,不閃爍
LCDCommand(0x01);//清屏
for(i=0;i<40000;i++)asm(“NOP”);//延時 LCDCommand(0x06);LCDCommand(0x14);//光標右移一個字符位,AC自動加1 LCDCommand(0x0C);//開顯示,關光標顯示,不閃爍 } //====================== //函數名稱:LCDShow //函數返回:無
//參數說明:需要顯示的數據 //功能概要:液晶顯示data中的數據。
//====================== void LCDShow(uint_8 data[32]){ uint_8 i;LCDInit();//LCD初始化 //顯示第1行16個字符
gpio_set(LCD[0].gpio_port, LCD[0].gpio_pin, 0);gpio_set(LCD[1].gpio_port, LCD[1].gpio_pin, 0);//后7位為DD RAM地址(0x00)LCDCommand(0x80);//寫16個數據到DD RAM gpio_set(LCD[0].gpio_port, LCD[0].gpio_pin, 1);gpio_set(LCD[1].gpio_port, LCD[1].gpio_pin, 0);//將要顯示在第1行上的16個數據逐個寫入DD RAM中 1
for(i = 0;i < 16;i++){ } //顯示第2行16個字符
gpio_set(LCD[0].gpio_port, LCD[0].gpio_pin, 0);gpio_set(LCD[1].gpio_port, LCD[1].gpio_pin, 0);//后7位為DD RAM地址(0x40)LCDCommand(0xC0);gpio_set(LCD[0].gpio_port, LCD[0].gpio_pin, 1);gpio_set(LCD[1].gpio_port, LCD[1].gpio_pin, 0);//將要顯示在第2行上的16個數據逐個寫入DD RAM中 for(i = 16;i < 32;i++){ } } //====================== //函數名稱:LCDCommand //函數返回:無
//參數說明:cmd:待執行的命令
//功能概要:執行給定的cmd命令,且延時。
//====================== void LCDCommand(uint_8 cmd){
uint_8 i;uint_16 j;uint_8 temp;LCDCommand(data[i]);LCDCommand(data[i]);//等待延遲防止重復調用此函數而LCD卡死 1
for(j=0;j<1600;j++);asm(“NOP”);//數據送到LCD的數據線上 for(i = 3;i < 11;i++){ gpio_set(LCD[i].gpio_port, LCD[i].gpio_pin, 0);} for(i = 3;i < 11;i++){ temp = 0x01 &(cmd>>(i-3));gpio_set(LCD[i].gpio_port, LCD[i].gpio_pin, temp);} //給出E信號的下降沿(先高后低),使數據寫入LCD gpio_set(LCD[2].gpio_port, LCD[2].gpio_pin, 1);for(j=0;j<25;j++)asm(“NOP”);gpio_set(LCD[2].gpio_port, LCD[2].gpio_pin, 0);} LCD.h //====================== // 文件名稱:lcd.h // 功能概要:lcd構件頭文件
// 版權所有: 蘇州大學飛思卡爾嵌入式中心(sumcu.suda.edu.cn)// 版本更新: 2013-03-17 V1.2 //====================== #ifndef LCD_H #define LCD_H #include “GPIOapp.h” //LCD寄存器選擇信號引腳 #define LCD_RS_PORT PORTD #define LCD_RS 7 //LCD讀寫信號引腳 1
#define LCD_RW_PORT PORTD #define LCD_RW 6 //LCD讀寫信號引腳
#define LCD_E_PORT PORTD #define LCD_E 5 //LCD數據引腳
#define LCD_D0_PORT PORTD #define LCD_D0 4 #define LCD_D1_PORT PORTD #define LCD_D1 3 #define LCD_D2_PORT PORTD #define LCD_D2 2 #define LCD_D3_PORT PORTD #define LCD_D3 1 #define LCD_D4_PORT PORTD #define LCD_D4 0 #define LCD_D5_PORT PORTC #define LCD_D5 17 #define LCD_D6_PORT PORTC #define LCD_D6 16 #define LCD_D7_PORT PORTC #define LCD_D7 13 //====================== //函數名稱:LCDInit //函數返回:無 //參數說明:無
//功能概要:LCD初始化。
//====================== extern void LCDInit();1
//====================== //函數名稱:LCDShow //函數返回:無
//參數說明:data[32]:需要顯示的數組 //功能概要:LCD顯示數組的內容。
//====================== extern void LCDShow(uint_8 data[32]);#endif //防止重復定義(結尾)
4、輔助函數 /* * qzh.h * * Created on: Jun 5, 2017 * Author: administrator */
#ifndef QZH_H_ #define QZH_H_ #include “GPIOapp.h” void changeState(int*);//改變工作狀態函數 int sdmn(int);//濕度變化模擬函數
void changeCode(int,uint_8 s[4]);//LED顯示轉碼函數 #endif /* QZH_H_ */ /* * fun.c * * Created on: Jun 5, 2017 1
* Author: administrator */ #include“qzh.h” void changeState(int *a){
} int sdmn(int a){ } void changeCode(int a,uint_8 s[4]){
} 1
if(*a == 0){ } else { } *a = 0;*a = 1;return a-=5;uint_8 c[10] = {'0','1','2','3','4','5','6','7','8','9'};s[3] = c[a%10];s[2] = c[a/10];s[1] = c[a/100];s[0] = c[a/1000];
第四章 系統測試
4.1測試結果
圖4 圖4 是開始是濕度顯示是72%,工作狀態顯示為停止。1
圖5 圖5 是第二次采集濕度顯示為69%,工作狀態顯示為停止。1
圖6 圖6 是第三次采集濕度顯示為66%度,已經逼近設定值65%,此時工作狀態顯示為停止。1
圖7 再次采集時濕度低于65%,滴灌立即開始,濕度上升至75%。1
第五章 總結展望
5.1總結
通過本次課程設計,對中斷處理有了更加深入的理解。對于計時器,LED和LCD的工作原理也有了更深的認識。LCD在試驗中遇到的問題不大,主要問題在于中斷處理函數的編寫和LED顯示上,LED顯示是每次中斷顯示一個數,所以要每次中斷顯示,才能使得四個值看起來是同時顯示的且沒有閃爍效果。
其次LED的顯示是要求是字符,所以在顯示濕度是加上了轉碼函數加以轉換。這里又涉及到了參數為數組的函數的寫法,因為學過好幾種語言,其傳遞方式偶所不同所以在這里也出現了不少問題。
通過此次課程設計不僅對單片機應用有了很好的實踐經驗,而且也幫助鞏固了以前的知識。
5.2展望
1、滴灌系統可以增加通信模塊,使得所有者可以實時監測農作物生長環境,也可以遠程操控進行滴灌等功能。
2、滴灌系統可以增加溫度監測,土壤酸堿性監測,空氣CO2濃度監測,并配套處理設備使得對農作物的管理更加智能化。
1
參考文獻
[1] 王宜懷、張書奎、王林、吳瑾著.嵌入式技術基礎與實踐(第3版),北京:清華大學 出版社,2011.[2] 田澤.嵌入式系統開發與應用.北京:北京航天航空大學出版社,[3] 王宜懷、陳建明、蔣銀珍著.基于32位ColdFire構建嵌入式系統.北京:電子工業出
版社,2006.[4] 王粉花、王志良.嵌入式系統與單片機實踐教程.北京:清華大學出版社,2010.32 1
第五篇:單片機課程設計報告
《單片機原理與接口技術》
課程設計報告
設計題目: 基于80C51單片機系統實驗板的制作
與程序設計
專
業:應用電子專業
班
級: 11應電班
姓
名: 丁文俊
指導教師: 余靜老師
2013 年 5 月20 日
目錄 前 言………………………………………………………………… 2 課程設計的目的及要求…………………………………………… 3 硬件電路設計……………………………………………………… 4 軟件程序設計…………………………………………………… 5 小結………………………………………………………………
參考文獻 附錄A 電路總圖 附錄B 程序清單
基于80C51單片機系統實驗板的制作與程序設計
1.前言
2、課程設計的目的及要求 2.1課程設計目的
2.2課程設計要求
3、系統主要硬件電路設計
3.1 STC89C51單片機簡介
MCS-51是美國Intel公司生產的一系列單片機的總稱,包括多個品種,如8031、8051、8751、8032、80C52、8752等。其中8051是最典型的產品,其他單片機都是在其基礎上進行功能增減而來的,所以人們習慣于用8051來稱呼MCS-51系列單片機。Intel公司將MCS-51的核心技術授權給了多家公司,這些廠家生產的單片機在功能上或多或少有些改變,以滿足不同的需求,其中美國的ATMEL公司生產的AT89C51是曾經在我國非常流行的51單片機。當前AT89C51/52已經停產,其替代產品為AT89S51/52。深圳宏晶公司出品的STC89C51可以直接代替傳統的AT89S51和AT89C51芯片,也可以代替菲利普、華幫等其他公司的89C51,由于時代的發展,工藝的進步,STC89C51功能更強,壽命更長(4K字節Flash存儲器、128字節片內RAM、支持ISP下載編程)
圖2.1 STC89c51單片機
單片機的時鐘信號用來提供單片機片內各種微操作的時間基準,時鐘信號通常用兩種電路形式得到:內部振蕩和外部振蕩。MCS-51單片機內部有一個用于構成振蕩器的高增益反向放大器,引腳XTALl和XTAL2分別是此放大電器的輸入端和輸出端,由于采用內部方式時,電路簡單,所得的時鐘信號比較穩定,實際使用中常采用這種方式,如圖2-2所示在其外接晶體振蕩器(簡稱晶振)或陶瓷諧振器就構成了內部振蕩方式,片內高增益反向放大器與作為反饋元件的片外石英晶體或陶瓷諧振器一起可構成一個自激振蕩器并產生振蕩時鐘脈沖。
圖2-2中外接晶體以及電容C2和C1構成并聯諧振電路,它們起穩定振蕩頻率、快速起振的作用,其值均為30P左右,晶振頻率選11.0592MHz。
為了初始化單片機內部的某些特殊功能寄存器,必須采用復位的方式,復位后可使CPU及系統各部件處于確定的初始狀態,并從初始狀態開始正常工作。單片機的復位是靠外電路來實現的,在正常運行情況下,只要RST引腳上出現兩個機器周期時間以上的高電平,即可引起系統復位,但如果RST引腳上持續為高電平,單片機就處于循環復位狀態。復位后系統將輸入/輸出(1/0)端口寄存器置為FFH,堆棧指針SP置為07H, SBUF內置為不定值,其余的寄存器全部清0,內部RAM的狀態不受復位的影響,在系統上電時RAM的內容是不定的。復位操作有兩種情況,即上電復位和手動(開關)復位。本系統采用上電復位方式。圖2-2中R9和Cl組成上電復位電路,其值R取為10K, C取為10μF.4
圖2.2 最小系統結構圖
3.2 電平轉換電路 3.3
4、軟件程序設計
5、小結
參考文獻
[1] 張偉,《單片機原理及應用》,機械工業出版社,2005(這是格式)
附錄
江西工業職業技術學院電子與信息工程系
課程設計指導教師評語
班級:
學生姓名:
學號:
指導教師評語(包括工作態度,遵守紀律;基本理論、知識、技能;獨立工作能力和分析解決問題的能力;完成任務情況及水平):
學生成績(五級分制):
指導教師簽名:
****年**月**日