這是我做去年做的設計,51單片機檢測電動機溫度并控制電動的啟停同時蜂鳴器報警,LCD1602顯示數(shù)據(jù),按鍵輸入設定溫度.DS18B20測定溫度。附件包含protues仿真圖與單片機源碼
選用51系列單片機或其他型號的單片機,設計步進電機溫度監(jiān)控電路。
一、設計DS18B20溫度檢測電路,當溫度超過每個設定值的時候,可自動停止步進電機電機轉(zhuǎn)動(可實現(xiàn)溫度自動控制);
二、根據(jù)需要將溫度值顯示在數(shù)碼管上(本次設計個人采用LCD1602顯示屏),顯示相應的輸入?yún)?shù);
三,可通過按鍵改變溫度設定值。
本設計的整體思路是:首先利用溫度傳感器DS18B20檢測環(huán)境溫度并直接輸出數(shù)字溫度信號給單片機AT89C52進行處理,在LCD1602顯示屏上顯示當前環(huán)境溫度值與設定溫度值。其中設定溫度值只能為三位整數(shù)加兩位小數(shù)形式,最高設定溫度為655攝氏度。檢測到的當前環(huán)境溫度可精確到小數(shù)點后兩位。通過十三個按鍵改變預設溫度值,其中十一個鍵設定溫度,另兩個確認與取消設定溫度值。防誤觸碰系統(tǒng),當不知情誤碰按鍵的情況下,系統(tǒng)自動顯示按鍵值在若干秒后沒有得到確定命令時自動回歸顯示設定值。在觸發(fā)溫度報警后電機停轉(zhuǎn)、峰鳴報警,其余各部件正常工作,必須等電機溫度下降低于40攝氏度且低于設定溫度電機自動開始工作。系統(tǒng)結構框圖如圖一所示: 
圖一 系統(tǒng)構成框圖 2.2 方案選擇 本設計要實現(xiàn)直流電機的溫度控制,使電機能根據(jù)環(huán)境溫度的變化自動啟停與報警,需要比較高的溫度變化分辨率以及穩(wěn)定可靠的換擋停機控制部件。 2.3 溫度傳感器的選擇 采用數(shù)字式的集成溫度傳感器DS18B20作為溫度檢測的核心元件,由其檢測并直接輸出數(shù)字溫度信號給單片機進行處理。 原理圖如圖六:
圖六 原理圖 3.6 PCB圖 PCB圖如圖七: 圖七 PCB圖
5 系統(tǒng)調(diào)試仿真 程序中溫度的設定值為60℃,即當溫度大于或等于60℃時,電機自動停機。可通過按鍵改變設定值。 5.1 電機正常工作 在Proteus軟件中調(diào)節(jié)溫度傳感器溫度到37℃,電機正常工作。下圖分別為LCD1602,溫度傳感器,電機仿真圖。 分別如圖九、圖十:
圖九 LCD1602
圖十 溫度傳感器與電機
5.2 電機停止工作 在Proteus軟件中調(diào)節(jié)溫度傳感器溫度到61℃,電機停止工作。下圖分別為1602,溫度傳感器,電機仿真圖。 分別如圖十一、圖十二:
圖十一 LCD1602
圖十二 溫度傳感器與電動機 5.3 按鍵改變設定溫 按鍵改變設定值如圖十三、圖十四:
圖十三 默認設定溫度 圖十四 按鍵改變設定溫度
6總結 ,本人首次學習、采用分層編程思想,在c51語言的編寫上大大的減少了程序的復雜性,為今后的編程打下了堅實的基礎。通過對各種傳感器、芯片、元件的使用,我了解了傳感器的基本理論知識,更深入的了解單片機的開發(fā)應用和PC編程控制,同時也讓我明白各種芯片元件、傳感器的出廠數(shù)據(jù)對于我們編寫程序有著不可忽略的作用。總的來說,這次學習為我們以后從事單片機軟硬件產(chǎn)品的設計開發(fā)、PC軟件開發(fā)打下了良好的基礎,樹立獨立從事產(chǎn)品研發(fā)的信心,同時也培養(yǎng)了我們認真的做事態(tài)度與動手實踐的能力。學以致用,用以溫學,這個過程就是經(jīng)驗知識與動手能力的雙重收獲過程。 本設計的重點、難點是: (1) 要掌握溫度傳感器的原理、結構、應用;LCD1602的原理、結構、應用。 (2) 考慮從非電量信號到電量信號的電路實現(xiàn)原理以及與單片機的接口; (3) 熟悉c51編程的技術,實現(xiàn)單片機對溫度的調(diào)節(jié)控制; (4) 整體電路的仿真調(diào)試。 本次設計優(yōu)點:采用的單片機AT89C52 性價比高;熱敏電阻溫度傳感器轉(zhuǎn)化溫度的方法非常簡潔且精度高、測試范圍較廣;LCD1602顯示簡潔明了! 實物圖如圖十五:
圖十五 實物圖
單片機源程序:
- /*********************************************************************
- **********************************************************************
- 實驗任務: 驅(qū)動DS18B20檢測溫度值并顯示在LCD1602上。按鍵輸入設置溫度,顯示
- 在LCD1602上控制電機運行,檢測溫度超過設定值,電機停止運行。電機
- 停止運行后當電機溫度下降到50攝氏度以下,電機重新運行。
- 實現(xiàn)現(xiàn)象:程序執(zhí)行后LCD1602上面一排顯示溫度值,格式類似于:"ACT T:031.28℃"
- (表示實際溫度)在LCD1602下面一排顯示設定溫度值,
- 格式類似于:"Seted T:055.29℃"(表示設定好的溫度值)
- "STING T:55.02℃" (表示正在設定的溫度值)
- 如果輸入錯誤或超出量程LCD1602下面一排顯示"set error"后顯示上一次設定的
- 有效值
- 注意事項:溫度輸入范圍(0~~655℃)初始報警溫度60度
- **********************************************************************/
- /*
- **********************************************************************
- * 本地宏定義
- **********************************************************************
- */
- #include "ds18b20.h" //溫度采集程序
- #include "lcd1602.h" //液晶屏程序
- #define moto P1 // 矩陣按鍵接在P1端口
- sbit qxkey=P3^0 ;// 獨立按鍵 取消鍵
- sbit move=P1^0 ;// 電動機
- sbit k1=P1^1; // 按鍵值
- sbit k2=P1^2; //**
- sbit k3=P1^3; //**
- sbit k4=P1^4; //**
- sbit k5=P1^5; //**
- sbit k6=P1^6; //**
- sbit k7=P1^7; //**
- /*
- **********************************************************************
- * 本地全局變量
- **********************************************************************
- */
- unsigned int zcsj=0; //暫存輸入設定值整數(shù)部分
- unsigned int zcxs=0; //暫存輸入設定值小數(shù)部分
- unsigned char zc; //一位輸入設定值暫存
- unsigned char xsd=0; //判斷是否有小數(shù)點xsd
- unsigned char i=8; //輸入顯示x位置坐標值
- unsigned char j=0; //輸入整數(shù)數(shù)字位數(shù)值
- unsigned char xsdw=0; //輸入小數(shù)數(shù)字位數(shù)
- unsigned int chssj=6000; //初始溫度設定值100度
- unsigned int tdisp; //實際溫度值
- unsigned char cs=0; //整個程序循環(huán)次數(shù),目的當有鍵值輸入但沒有確認或取消
- // 在程序執(zhí)行20次以后自動恢復原來的設定值
- unsigned char key = 0; // 實時獲取的掃描鍵值
- unsigned char h = 0; //按鍵行值
- unsigned char l = 0; //按鍵列值
- /*
- **********************************************************************
- * 函數(shù)原型聲明
- **********************************************************************
- */
- void TempDisplayTest(void); //溫度傳感器顯示函數(shù)
- void delay1ms(void); //延時1ms
- void delay1s(void) ; //延時1s
- void keypanduan(void); //判斷按鍵值
- void baojin(void); //溫度超過設定值蜂鳴器工作
- void delay100us(void);
- /*********************************************************************
- * 函 數(shù) 名 : main
- * 函數(shù)功能 : 主函數(shù)
- * 參數(shù)列表 : 無
- * 函數(shù)輸出 : 無
- *********************************************************************/
- void main(void)
- {
-
- Lcd1602Init();
- move=1;
- Lcd1602ShowStr(0, 0, "ACT T:");
- Lcd1602ShowStr(0, 1, "Seted T:");
- Lcd1602ShowTempU16(8, 1, chssj);
- while (1)
- {
- uchar key = 0; // 實時獲取的掃描鍵值
- uchar h = 0; // 行鍵值
- uchar l = 0; //列鍵值
- while (1)
- {
- TempDisplayTest();
- keypanduan();
- cs++;
- if(chssj<tdisp){move=0;baojin();}//電動機控制程序
- else if(tdisp<4000)move=1;
- }
- }
- }
- void TempDisplayTest(void)
- {
- extern Ds18b20ReadByte(); //聲明變量
- u16 temp = 0; // 用來暫存12位的AD值
- u8 tmh = 0 ;
- u8 tml = 0; // 用來暫存2個8位的AD值
- u16 tDisp = 0; // 用來存儲乘以100倍后的溫度值
- double t = 0; // 用來存儲轉(zhuǎn)換后以攝氏度為單位的溫度值
- Ds18b20TempConvertCmd(); // 先寫入轉(zhuǎn)換命令
- Ds18b20TempReadCmd(); // 然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
- tml = Ds18b20ReadByte(); // 讀取溫度值共16位,先讀低字節(jié)
- tmh = Ds18b20ReadByte(); // 再讀高字節(jié)
- temp = tml | (tmh << 8); // 默認是12位分辨率,前面4個S位是符號位
-
- // 正溫度時符號位為0,下面代碼計算沒有考慮負溫度情況,因為我們實驗是在
- // 室溫下做的,如果要考慮到負溫度的情況,代碼中要先判斷S位,若S位為1則
- // 必須點去掉S的1再計算,計算后的值加負號即可。
- t = temp * 0.0625;
- tDisp = (u16)(t * 100); // 為方便顯示將溫度值乘以100后強轉(zhuǎn)為u16
- // 調(diào)用LCD1602的顯示函數(shù)來顯示乘以100倍后的溫度值
- tdisp=tDisp;
- Lcd1602ShowTempU16(6, 0, tDisp);
- }
- /*********************************************************************
- * 函 數(shù) 名 : keypanduan
- * 函數(shù)功能 : 輸入報警設置溫度
- * 參數(shù)列表 : 無
- * 函數(shù)輸出 : 無
- *********************************************************************/
- void keypanduan(void)
- {
- key = 0;
- h=0;
- l=0;
- if(qxkey==0){ //獨立按鍵取消程序
- Lcd1602ShowStr(0, 1, "Seted T:");
- Lcd1602ShowTempU16(8, 1, chssj);
- j=0;i=8;xsdw=0;xsd=0;zcsj=0;zcxs=0;cs=0; }
- if(cs==20){ //輸入等待程序
- Lcd1602ShowStr(0, 1, "Seted T:");
- Lcd1602ShowTempU16(8, 1, chssj);
- j=0;i=8;xsdw=0;xsd=0;zcsj=0;zcxs=0;cs=0;}
- //判斷按鍵值程序
- k1=1;k2=1;k3=1;k4=0;k5=0;k6=0;k7=0;// P1.1-1.3輸出高電平,P1.4-P1.7輸出低電平
- if (k1!=1||k2!=1||k3!=1) // 讀取KEY_PORT看是否有按鍵按下
- {
- delay100us(); // 延時消抖
- if (k1!=1||k2!=1||k3!=1) // 確認確實有按鍵按下
- {
- Lcd1602ShowStr(i, 1, " ");
- // 先確定按鍵發(fā)生在第幾列
- l=k3*8+k2*4+k1*2;
- switch (l)
- {
- case 0x0c : key = 1; break;
- case 0x0a : key = 2; break;
- case 0x06 : key = 3; break;
- default : break;
- }
- // 再確定按鍵發(fā)生在第幾行
- k1=0;k2=0;k3=0;k4=1;k5=1;k6=1;k7=1;
- if(k4==1)h=k7*8+k6*4+k5*2+1;
- if(k4==0)h=k7*8+k6*4+k5*2;
- switch (h)
- {
- case 7: key = key + 0; break;
- case 11: key = key + 3; break;
- case 13: key = key + 6; break;
- case 14: key = key + 9; break;
- }
- if (key != 0&&key!=12) // 有按鍵按下
- {
- zc=key; Lcd1602ShowStr(0, 1, "STING T:");
- if(key==10)zc=0;
- if(key==11){xsd++;zc=0;Lcd1602ShowStr(i, 1, ".");Lcd1602ShowshujuU16(i+1, 1,zc);}
- else Lcd1602ShowshujuU16(i, 1,zc );i++;
- if(key!=11&&key!=12&&xsd==0){zcsj=zcsj*10+zc;j++;}
- if(key!=11&&key!=12&&xsd!=0){zcxs=zcxs*10+zc;j++;xsdw++;}
- }
- //判斷輸入值為多少,是否有效
- if(((xsd==0&&j<4&&zcsj<656)||(xsd==1&&j<6&&xsdw<3)))//確認輸出設定值
- {
- if(key==12&&(zcsj!=0||zcxs!=0)){
- if(xsdw==1) zcsj=zcsj*100+zcxs*10;
- else zcsj=zcsj*100+zcxs;
- Lcd1602ShowStr(0, 1, "Seted T:");
- Lcd1602ShowTempU16(8, 1, zcsj);
- chssj=zcsj;
- j=0;i=8;xsdw=0;xsd=0;zcsj=0;zcxs=0;cs=0;}
- else if(key==12&&zcsj==0&&zcxs==0){Lcd1602ShowTempU16(8, 1, chssj);}
- }
- else {Lcd1602ShowStr(0, 1, " set error ");
- delay1s();
- Lcd1602ShowStr(0, 1, " ");
- Lcd1602ShowStr(0, 1, "Seted T:");
- Lcd1602ShowTempU16(8, 1, chssj);
- j=0;i=8;xsdw=0;xsd=0;zcsj=0;cs=0;}
- }
- }
-
- }
- /*********************************************************************
- * 函 數(shù) 名 :
- * 函數(shù)功能 : 以下函數(shù)為延時函數(shù)
- * 參數(shù)列表 : 無
- * 函數(shù)輸出 : 無
- *********************************************************************/
- void delay100us(void) //誤差 0us
- {
- unsigned char a,b;
- for(b=71;b>0;b--)
- for(a=2;a>0;a--);
- }
- void delay1ms(void) //誤差 0us
- {
- unsigned char a,b,c;
- for(c=1;c>0;c--)
- for(b=124;b>0;b--)
- for(a=2;a>0;a--);}
- void delay1s(void) //誤差 0us
- {
- unsigned char a,b,c;
- for(c=167;c>0;c--)
- for(b=171;b>0;b--)
- for(a=16;a>0;a--);
- _nop_(); //if Keil,require use intrins.h
- }
- /*********************************************************************
- * 函 數(shù) 名 : baojin
- * 函數(shù)功能 : 峰鳴器工作
- * 參數(shù)列表 : 無
- * 函數(shù)輸出 : 無
- *********************************************************************/
- void baojin(void)
- {
- uint a;
- for(a=0;a<150;a++){k5 = 1;delay100us();k5 = 0;delay100us();}
- }
復制代碼
無標題.png (200.33 KB, 下載次數(shù): 74)
下載附件
2019-3-15 22:39 上傳
PCB_NEW-PCB_20180627002001.png (21.75 KB, 下載次數(shù): 71)
下載附件
PCB圖
2019-3-15 22:38 上傳
QQ圖片20180625162226.jpg (4.67 MB, 下載次數(shù): 78)
下載附件
實物圖
2019-3-15 22:37 上傳
全部資料51hei下載地址:
課設原理圖及說明書.zip
(7.21 MB, 下載次數(shù): 89)
2019-3-15 22:41 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
課設程序.zip
(67.9 KB, 下載次數(shù): 95)
2019-3-15 22:41 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
PCB_NEW-PCB_20180627001603.pdf
(18.82 KB, 下載次數(shù): 34)
2019-3-15 22:40 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
說明書.pdf
(1.07 MB, 下載次數(shù): 46)
2019-3-15 22:39 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|