1 開發(fā)環(huán)境
仿真圖:proteus8.9以上
程序代碼:KEIL4/KEIL5
原理圖:AD
設計編號:A0007
2 功能說明介紹
結(jié)合實際情況,基于51單片機設計一個排隊叫號系統(tǒng)設計。該系統(tǒng)應滿足的功能要求為:
系統(tǒng)由51單片機、DS18B20溫度傳感器、LCD1602液晶顯示屏、繼電器、風扇、加熱膜、按鍵、蜂鳴器組成。
可實現(xiàn)以下基本功能:
1、可進行溫度值的實時顯示,精度為0.1攝氏度;
2、使用數(shù)碼管作為顯示設備;
3、檢測范圍是-55~125攝氏度;
4、可通過按鍵設置溫度的報警范圍;
5、一旦溫度過低,綠色指示燈亮,蜂鳴器響,加熱膜加熱,模擬升溫裝置;
6、一旦溫度過高,紅色指示燈亮,蜂鳴器響,小風扇轉(zhuǎn)動,模擬降溫裝置;
本資料下載鏈接(可點擊)
https://docs.qq.com/doc/DTk5xUXRZdHFqem5O文章來源地址http://www.zghlxwxcb.cn/news/detail-407458.html
3 仿真圖
AT89C51可以替換為AT89C52,實物可以換做STC89C51,STC89C52
AT89C51是美國ATMEL公司生產(chǎn)的低電壓,高性能CMOS16位單片機,片內(nèi)含4k bytes的可反復擦寫的只讀程序存儲器和128 bytes的隨機存取數(shù)據(jù)存儲器,期間采用ATMEL公司的高密度、非易失性存儲技術(shù)生產(chǎn),兼容標準MCS-51指令系統(tǒng),片內(nèi)置通用16位中央處理器和Flash存儲單元,功能強大的AT89C51單片機可靈活應用于各種控制領(lǐng)域。
AT89C51提供以下標準功能:4k字節(jié)Flash閃速存儲器,128字節(jié)內(nèi)部RAM,32個I/O口線,兩個1 6位定時/計數(shù)器,一個5向量兩級中斷結(jié)構(gòu),一個全雙工串行通信口,片內(nèi)振蕩器及時鐘電路。同時,AT89C51可降至0Hz的靜態(tài)邏輯操作,并支持兩種軟件可選的節(jié)電工作模式。空閑方式停止CPU的工作,但允許RAM,定時/計數(shù)器,串行通信口及中斷系統(tǒng)繼續(xù)工作。掉電方式保存RAM中的內(nèi)容,但振蕩器停止工作并禁止其它所有部件工作直到下一個硬件復位。
本系統(tǒng)中央控制器采用的AT89C51單片機,復位電路采用上電復位電路。外接的晶振為12MHz晶振。
4 程序
工程文件使用Keil4/keil5打開。編譯產(chǎn)生hex加載到對應的單片機中。
代碼
#include <reg52.h> // 包含頭文件
#include <intrins.h>
#define uchar unsigned char // 以后unsigned char就可以用uchar代替
#define uint unsigned int // 以后unsigned int 就可以用uint 代替
sbit DQ = P1^1; // DS18B20傳感器的引腳定義
sbit w1 = P2^4; // 數(shù)碼管第1位的控制引腳
sbit w2 = P2^5; // 數(shù)碼管第2位的控制引腳
sbit w3 = P2^6; // 數(shù)碼管第3位的控制引腳
sbit w4 = P2^7; // 數(shù)碼管第4位的控制引腳
sbit Buzzer = P1^0; // 蜂鳴器引腳
sbit JdqLow = P2^0; // 溫度過低繼電器控制(加熱)
sbit JdqHig = P2^1; // 溫度過高繼電器控制(降溫)
sbit LedLow = P2^2; // 溫度低指示燈
sbit LedHig = P2^3; // 溫度高指示燈
sbit KeySet = P3^2; // 設置按鍵
sbit KeyDown = P3^3; // 減按鍵
sbit KeyUp = P3^4; // 加按鍵
/* 數(shù)碼管的顯示值: 0 1 2 3 4 5 6 7 8 9 - */
uchar code Array1[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40 };
/* 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. */
uchar code Array2[]={ 0xBf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef };
uchar Buff[4]; // 顯示緩沖區(qū)
uchar ShowID=1; // 當前顯示的是哪一個數(shù)碼管
int AlarmLow=150; // 默認報警的溫度下限值是15度
int AlarmHig=300; // 默認報警的溫度上限值是30度
/*********************************************************/
// 毫秒級的延時函數(shù),time是要延時的毫秒數(shù)
/*********************************************************/
void DelayMs(uint time)
{
uint i,j;
for(i=0;i<time;i++)
for(j=0;j<112;j++);
}
/*********************************************************/
// 延時15微秒
/*********************************************************/
void Delay15us(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/*********************************************************/
// 復位DS18B20(初始化)
/*********************************************************/
void DS18B20_ReSet(void)
{
uchar i;
DQ=0;
i=240;
while(--i);
DQ=1;
i=30;
while(--i);
while(~DQ);
i=4;
while(--i);
}
/*********************************************************/
// 向DS18B20寫入一個字節(jié)
/*********************************************************/
void DS18B20_WriteByte(uchar dat)
{
uchar j;
uchar btmp;
for(j=0;j<8;j++)
{
btmp=0x01;
btmp=btmp<<j;
btmp=btmp&dat;
if(btmp>0) // 寫1
{
DQ=0;
Delay15us();
DQ=1;
Delay15us();
Delay15us();
Delay15us();
Delay15us();
}
else // 寫0
{
DQ=0;
Delay15us();
Delay15us();
Delay15us();
Delay15us();
DQ=1;
Delay15us();
}
}
}
/*********************************************************/
// 讀取溫度值
/*********************************************************/
int DS18B20_ReadTemp(void)
{
uchar j;
int b,temp=0;
DS18B20_ReSet(); // 產(chǎn)生復位脈
DS18B20_WriteByte(0xcc); // 忽略ROM指令
DS18B20_WriteByte(0x44); // 啟動溫度轉(zhuǎn)換指令
DS18B20_ReSet(); // 產(chǎn)生復位脈
DS18B20_WriteByte(0xcc); // 忽略ROM指令
DS18B20_WriteByte(0xbe); // 讀取溫度指令
for(j=0;j<16;j++) // 讀取溫度數(shù)量
{
DQ=0;
_nop_();
_nop_();
DQ=1;
Delay15us();
b=DQ;
Delay15us();
Delay15us();
Delay15us();
b=b<<j;
temp=temp|b;
}
temp=temp*0.0625*10; // 合成溫度值并放大10倍
return (temp); // 返回檢測到的溫度值
}
/*********************************************************/
// 定時器初始化
/*********************************************************/
void TimerInit()
{
TMOD = 0x01; // 使用定時器0,工作方式1
TH0 = 248; // 給定時器0的TH0裝初值
TL0 = 48; // 給定時器0的TL0裝初值
ET0 = 1; // 定時器0中斷使能
EA = 1; // 打開總中斷
TR0 = 1; // 啟動定時器0
}
/*********************************************************/
// 顯示溫度值
/*********************************************************/
void ShowTemp(int dat)
{
if(dat<0) // 負號
{
Buff[0]=Array1[10];
dat=0-dat;
}
else // 百位
{
Buff[0]=Array1[dat/1000];
}
Buff[1]=Array1[dat%1000/100]; // 十位
Buff[2]=Array2[dat%100/10]; // 個位
Buff[3]=Array1[dat%10]; // 小數(shù)后一位
}
/*********************************************************/
// 報警判斷
/*********************************************************/
void AlarmJudge(int dat)
{
if(dat<AlarmLow) // 判斷溫度是否過低
{
LedLow=0; // 溫度低指示燈亮
LedHig=1; // 溫度高指示燈滅
JdqLow=0; // 溫度過低的繼電器閉合(開始加熱)
JdqHig=1; // 溫度過高的繼電器斷開(停止降溫)
Buzzer=0; // 蜂鳴器報警
}
else if(dat>AlarmHig) // 判斷溫度是否過高
{
LedLow=1; // 溫度低指示燈滅
LedHig=0; // 溫度高指示燈亮
JdqLow=1; // 溫度過低的繼電器斷開(停止加熱)
JdqHig=0; // 溫度過高的繼電器閉合(開始降溫)
Buzzer=0; // 蜂鳴器報警
}
else // 溫度正常
{
LedLow=1; // 溫度低指示燈滅
LedHig=1; // 溫度高指示燈滅
JdqLow=1; // 溫度過低的繼電器斷開(停止加熱)
JdqHig=1; // 溫度過高的繼電器斷開(停止降溫)
Buzzer=1; // 蜂鳴器停止報警
}
}
/*********************************************************/
// 按鍵掃描
/*********************************************************/
void KeyScanf()
{
if(KeySet==0) // 如果設置按鍵被按下
{
/* 設置溫度下限 */
LedLow=0; // 點亮綠色燈(代表當前正在設置溫度下限)
LedHig=1; // 熄滅紅色燈
Buzzer=1; // 關(guān)閉蜂鳴器
ShowTemp(AlarmLow); // 顯示溫度下限值
DelayMs(10); // 延時去抖
while(!KeySet); // 等待按鍵釋放
DelayMs(10); // 延時去抖
while(1)
{
if(KeyDown==0) // 如果“減”按鍵被按下
{
if(AlarmLow>-550) // 判斷當前溫度下限是否大于-55度
{
AlarmLow--; // 溫度下限值減去0.1度
ShowTemp(AlarmLow); // 刷新顯示改變后的溫度下限值
DelayMs(200); // 延時
}
}
if(KeyUp==0) // 如果“加”按鍵被按下
{
if(AlarmLow<1250) // 判斷當前溫度下限是否小于125度
{
AlarmLow++; // 溫度下限值加上0.1度
ShowTemp(AlarmLow); // 刷新顯示改變后的溫度下限值
DelayMs(200); // 延時
}
}
if(KeySet==0) // 如果“設置”按鍵被按下
{
break; // 退出溫度下限值的設置,準備進入上限值的設置
}
}
/* 設置溫度上限 */
LedLow=1; // 熄滅綠色燈
LedHig=0; // 點亮紅色燈(代表當前正在設置溫度上限)
ShowTemp(AlarmHig); // 顯示溫度上限值
DelayMs(10); // 延時去抖
while(!KeySet); // 等待按鍵釋放
DelayMs(10); // 延時去抖
while(1)
{
if(KeyDown==0) // 如果“減”按鍵被按下
{
if(AlarmHig>-550) // 判斷當前溫度上限是否大于-55度
{
AlarmHig--; // 溫度上限值減去0.1度
ShowTemp(AlarmHig); // 刷新顯示改變后的溫度上限值
DelayMs(200); // 延時
}
}
if(KeyUp==0) // 如果“加”按鍵被按下
{
if(AlarmHig<1250) // 判斷當前溫度上限是否小于125度
{
AlarmHig++; // 溫度上限值加上0.1度
ShowTemp(AlarmHig); // 刷新顯示改變后的溫度上限值
DelayMs(200);
}
}
if(KeySet==0) // 如果“設置”按鍵被按下
{
break; // 準備退出設置模式
}
}
/* 退出設置模式 */
LedLow=1; // 熄滅綠燈
LedHig=1; // 熄滅紅燈
DelayMs(10); // 延時去抖
while(!KeySet); // 等待按鍵釋放
DelayMs(10); // 延時去抖
}
}
/*********************************************************/
// 主函數(shù)
/*********************************************************/
void main()
{
int temp;
uchar i;
TimerInit(); // 定時器0的初始化(數(shù)碼管的動態(tài)掃描)
Buff[0]=Array1[0]; // 剛上電顯示4個0
Buff[1]=Array1[0];
Buff[2]=Array1[0];
Buff[3]=Array1[0];
for(i=0;i<8;i++) // 由于傳感器剛上電讀出的溫度不穩(wěn)定,因此先進行幾次溫度的讀取并丟棄
{
DS18B20_ReadTemp();
DelayMs(120);
}
while(1)
{
EA=0; // 屏蔽中斷
temp=DS18B20_ReadTemp(); // 讀取溫度值
EA=1; // 恢復中斷
ShowTemp(temp); // 顯示溫度值
AlarmJudge(temp); // 判斷是否需要報警
for(i=0;i<100;i++) // 延時并進行按鍵掃描
{
KeyScanf();
DelayMs(10);
}
}
}
/*********************************************************/
// 定時器0服務程序
/*********************************************************/
void Timer0(void) interrupt 1
{
TH0 = 248; // 給定時器0的TH0裝初值
TL0 = 48; // 給定時器0的TL0裝初值
P0=0x00; // 先關(guān)閉所有顯示
w1=1;
w2=1;
w3=1;
w4=1;
if(ShowID==1) // 判斷是否顯示第1位數(shù)碼管
{
w1=0; // 打開第1位數(shù)碼管的控制開關(guān)
P0=Buff[0]; // 第1位數(shù)碼管顯示內(nèi)容
}
if(ShowID==2) // 判斷是否顯示第2位數(shù)碼管
{
w2=0; // 打開第2位數(shù)碼管的控制開關(guān)
P0=Buff[1]; // 第2位數(shù)碼管顯示內(nèi)容
}
if(ShowID==3) // 判斷是否顯示第3位數(shù)碼管
{
w3=0; // 打開第3位數(shù)碼管的控制開關(guān)
P0=Buff[2]; // 第3位數(shù)碼管顯示內(nèi)容
}
if(ShowID==4) // 判斷是否顯示第4位數(shù)碼管
{
w4=0; // 打開第4位數(shù)碼管的控制開關(guān)
P0=Buff[3]; // 第4位數(shù)碼管顯示內(nèi)容
}
ShowID++; // 切換到下一個數(shù)碼管的顯示
if(ShowID==5)
ShowID=1;
}
流程圖如下圖所示。
5 原理圖
原理圖由AD繪制,原理圖和仿真圖有出入,原理圖需要電源,電源開關(guān)模塊。此設計資料詳細,硬件手冊資料圖片詳細,不對硬件調(diào)試負責,做實物需要一定的基本功。主控芯片可以換為STC89C51/STC89C52
整個系統(tǒng)以AT89C51單片機為核心器件,配合電阻電容晶振等器件,構(gòu)成單片機的最小系統(tǒng)。其它個模塊圍繞著單片機最小系統(tǒng)展開。其中包括,傳感器采用DS18B20,負責采集溫度數(shù)據(jù)后發(fā)給單片機。顯示設備采用4位共陰數(shù)碼管,顯示檢測到的溫度值。按鍵模塊,主要是進行報警值的設置。報警模塊采用蜂鳴器+LED的模式,超出報警范圍則進行聲光報警,同時還有升溫和降溫裝置工作,使得溫度恒定在一個范圍之內(nèi)。
6 視頻講解
代碼講解+仿真講解+仿真演示+原理圖講解
基于51單片機的DS18B20溫度控制加熱降溫系統(tǒng)設計
7 設計報告
排隊論(又稱隨機服務系統(tǒng))是研究系統(tǒng)由于隨機因素的干擾而出現(xiàn)排隊(或擁塞)現(xiàn)象的規(guī)律的一門學科,它適用于一切服務系統(tǒng),包括公共服務系統(tǒng)、通信系統(tǒng)、計算機系統(tǒng)等??梢哉f,凡是出現(xiàn)擁塞現(xiàn)象的系統(tǒng),都屬于隨機服務系統(tǒng)。一個對象通過擁塞系統(tǒng)接受服務必須經(jīng)過三個環(huán)節(jié),即到達、排隊等候處理、接受服務和離去。例如在醫(yī)院中,排隊流程如下:患者在掛號的同時領(lǐng)取排隊號碼,然后到候診區(qū)候診;當為前一患者完成診斷后,醫(yī)生通過本系統(tǒng)呼叫隊列中下一位患者,患者就可直接到空閑診室行排隊等候服務。
另一個方面,伴隨著服務行業(yè)業(yè)務量不斷增長,業(yè)務種類日益增多,排隊等候已成為人們經(jīng)常面臨的實際問題。在銀行,醫(yī)院,電信,稅務,工商等營業(yè)大廳里,前擁后擠,雜亂無章的排隊等候,已是司空見慣的現(xiàn)象,影響了服務質(zhì)量。因此,改善服務質(zhì)量,樹立良好的企業(yè)形象,解決客戶勞累的排隊現(xiàn)象,創(chuàng)造人性化服務環(huán)境已成為急需解決的問題。設計一套排隊抽號的服務系統(tǒng),可以很好的解決因排隊引起的種種問題。
本系統(tǒng)通過AT89C51單片機直接擴展獨立鍵盤,完成排隊取號流程,單片機控制LCD1602顯示排隊等待情況,控制蜂鳴器發(fā)聲完成叫號功能。該系統(tǒng)有良好的人機交互界面,模擬排隊管理,科學地處理各種排隊情況,操作簡便,控制靈活,顯示清晰,制作成本低,性價比較高。
7.1 設計目的
(1)鞏固和加深對單片機原理和接口技術(shù)知識的理解;
(2)培養(yǎng)根據(jù)課題需要選學參考書籍、查閱手冊和文獻資料的能力;
(3)學會方案論證的比較方法,拓寬知識,初步掌握工程設計的基本方法;
(4)掌握常用儀器、儀表的正確使用方法,學會軟、硬件的設計和調(diào)試方法;
(5) 能按課程設計的要求編寫課程設計報告,能正確反映設計和實驗成果,能用計算機繪制電路圖、仿真圖和流程圖。
7.2 概述
二十一世紀是科技高速發(fā)展的信息時代,電子技術(shù)、微型單片機技術(shù)的應用更是空前廣泛,伴隨著科學技術(shù)和生產(chǎn)的不斷發(fā)展,需要對各種參數(shù)進行溫度測量。因此溫度一詞在生產(chǎn)生活之中出現(xiàn)的頻率日益增多,與之相對應的,溫度測量和控制也成為了生活生產(chǎn)中頻繁使用的詞語,同時它們在各行各業(yè)中也發(fā)揮著重要的作用。如在日趨發(fā)達的工業(yè)之中,利用測量與控制溫度來保證生產(chǎn)的正常運行。在農(nóng)業(yè)中,用于保證蔬菜大棚的恒溫保產(chǎn)等。
溫度是表征物體冷熱程度的物理量,溫度測量則是工農(nóng)業(yè)生產(chǎn)過程中一個很重要而普遍的參數(shù)。溫度的測量及控制對保證產(chǎn)品質(zhì)量、提高生產(chǎn)效率、節(jié)約能源、生產(chǎn)安全、促進國民經(jīng)濟的發(fā)展起到非常重要的作用。由于溫度測量的普遍性,溫度傳感器的數(shù)量在各種傳感器中居首位。而且隨著科學技術(shù)和生產(chǎn)的不斷發(fā)展,溫度傳感器的種類還是在不斷增加豐富來滿足生產(chǎn)生活中的需要。
單片機溫度測量則是對溫度進行有效的測量,并且能夠在工業(yè)生產(chǎn)中得到了廣泛的應用,尤其在電力工程、化工生產(chǎn)、機械制造、冶金工業(yè)、農(nóng)業(yè)等重要領(lǐng)域中擔負著重要的測量任務。在日常生活中,也可廣泛實用于地熱、空調(diào)器、電加熱器等各種家庭室溫測量及工業(yè)設備溫度測量場合。
7.3 國內(nèi)外研究現(xiàn)狀
國外對溫度控制技術(shù)研究較早,始于20世紀70年代。先是采用模擬式的組合儀表,采集現(xiàn)場信息并進行指示、記錄和控制。80年代末出現(xiàn)了分布式控制系統(tǒng)。目前正開發(fā)和研制計算機數(shù)據(jù)采集控制系統(tǒng)的多因子綜合控制系統(tǒng)。90年代中期,智能溫控儀問世,它是微電子技術(shù)、計算機技術(shù)和自動測試技術(shù)的結(jié)晶。目前,國際上已開發(fā)出多種智能溫控產(chǎn)品系列,智能溫控器內(nèi)部包含溫度傳感器、AD轉(zhuǎn)換器、信號處理器和接口電路,有的產(chǎn)品還有多路選擇器、中央控制器、隨機存儲器和只讀存儲器等?,F(xiàn)在世界各國的溫度測控技術(shù)發(fā)展很快,一些國家在實現(xiàn)自動化的基礎(chǔ)上正向著完全自動化、無人化的方向發(fā)展。
我國對于溫度測控技術(shù)的研究較晚,始于20世紀80年代。我國工程技術(shù)人員在吸收發(fā)達國家溫度測控技術(shù)的基礎(chǔ)上,才掌握了溫度室內(nèi)微機控制技術(shù),該技術(shù)僅限于對溫度的單項環(huán)境因子的控制。我國溫度測控設施計算機應用,在總體上正從消化吸收、簡單應用階段向?qū)嵱没?、綜合性應用階段過渡和發(fā)展。在技術(shù)上,以單片機控制的單參數(shù)單回路系統(tǒng)居多,尚無真正意義上的多參數(shù)綜合控制系統(tǒng),與發(fā)達國家相比,存在較大差距。我國溫度測量控制現(xiàn)狀還遠遠沒有達到工廠化的程度,生產(chǎn)實際中仍然有許多問題困擾著我們,存在著裝備配套能力差,產(chǎn)業(yè)化程度低,環(huán)境控制水平落后,軟硬件資源不能共享和可靠性差等缺點。
8 資料清單下載鏈接
見文章開頭視頻
本資料下載鏈接:文章來源:http://www.zghlxwxcb.cn/news/detail-407458.html
https://docs.qq.com/doc/DTk5xUXRZdHFqem5O
到了這里,關(guān)于基于51單片機的DS18B20溫度控制加熱降溫系統(tǒng)設計的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!