仿真版本:Proteus8.6及以上版本
程序編譯:Keil5 C51
編程語(yǔ)言:C語(yǔ)言
設(shè)計(jì)編號(hào):【E03】
1.? 簡(jiǎn)介
? 本文提出了一種基于51單片機(jī)的多路溫度采集系統(tǒng)。該設(shè)計(jì)采用數(shù)字溫度傳感器DS18B20,此傳感器讀取被測(cè)量溫度值并進(jìn)行轉(zhuǎn)換。將轉(zhuǎn)換后的多路數(shù)據(jù)送到單片機(jī)處理,再通過(guò)LCD1602顯示出來(lái)。
2.? 主要功能
a.通過(guò)LCD1602依次顯示當(dāng)前溫度值,溫度測(cè)量范圍:0-99攝氏度。
3.? 源程序(Keil5)
本設(shè)計(jì)采用keil5 C51軟件(內(nèi)附安裝包)實(shí)現(xiàn)程序設(shè)計(jì)。如需用keil4打開(kāi)程序,可自行通過(guò).c和.h文件新建工程即可。
#include <AT89X52.h>
#include <Intrins.h>
#define DATA P0 //1602驅(qū)動(dòng)端口
//ROM操作命令
#define READ_ROM 0x33 //讀ROM
#define SKIP_ROM 0xCC //跳過(guò)ROM
#define MATCH_ROM 0x55 //匹配ROM
#define SEARCH_ROM 0xF0 //搜索ROM
#define ALARM_SEARCH 0xEC //告警搜索
//存儲(chǔ)器操作命令
#define ANEW_MOVE 0xB8 //重新調(diào)出E^2數(shù)據(jù)
#define READ_POWER 0xB4 //讀電源
#define TEMP_SWITCH 0x44 //啟動(dòng)溫度變換
#define READ_MEMORY 0xBE //讀暫存存儲(chǔ)器
#define COPY_MEMORY 0x48 //復(fù)制暫存存儲(chǔ)器
#define WRITE_MEMORY 0x4E //寫(xiě)暫存存儲(chǔ)器
//數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)
typedef struct tagTempData
{
unsigned char btThird; //百位數(shù)據(jù)
unsigned char btSecond; //十位數(shù)據(jù)
unsigned char btFirst; //個(gè)位數(shù)據(jù)
unsigned char btDecimal; //小數(shù)點(diǎn)后一位數(shù)據(jù)
unsigned char btNegative; //是否為負(fù)數(shù)
}TEMPDATA;
TEMPDATA m_TempData;
//引腳定義
sbit DQ = P2^7; //數(shù)據(jù)線端口
sbit RS= P2^0;
sbit RW= P2^1;
sbit E= P2^2;
//DS18B20序列號(hào),通過(guò)調(diào)用GetROMSequence()函數(shù)在P1口讀出(讀8次)
const unsigned char code ROMData1[8] = {0x28, 0x33, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xD7}; //U1
const unsigned char code ROMData2[8] = {0x28, 0x30, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x8E}; //U2
const unsigned char code ROMData3[8] = {0x28, 0x31, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xB9}; //U3
const unsigned char code ROMData4[8] = {0x28, 0x32, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xE0}; //U4
const unsigned char code ROMData5[8] = {0x28, 0x34, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x52}; //U5
const unsigned char code ROMData6[8] = {0x28, 0x35, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x65}; //U6
const unsigned char code ROMData7[8] = {0x28, 0x36, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x3C}; //U7
const unsigned char code ROMData8[8] = {0x28, 0x37, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x0B}; //U8
//判斷忙指令
void Busy()
{
DATA = 0xff;
RS = 0;
RW = 1;
while(DATA & 0x80)
{
E = 0;
E = 1;
}
E = 0;
}
//寫(xiě)指令程序
void WriteCommand(unsigned char btCommand)
{
Busy();
RS = 0;
RW = 0;
E = 1;
DATA = btCommand;
E = 0;
}
//寫(xiě)數(shù)據(jù)程序
void WriteData(unsigned char btData)
{
Busy();
RS = 1;
RW = 0;
E = 1;
DATA = btData;
E = 0;
}
//清屏顯示
void Clear()
{
WriteCommand(1);
}
//初始化
void Init()
{
WriteCommand(0x0c); //開(kāi)顯示,無(wú)光標(biāo)顯示
WriteCommand(0x06); //文字不動(dòng),光標(biāo)自動(dòng)右移
WriteCommand(0x38); //設(shè)置顯示模式:8位2行5x7點(diǎn)陣
}
4.? 仿真proteus8.6
? 本設(shè)計(jì)采用proteus8.6軟件(內(nèi)附安裝包)實(shí)現(xiàn)仿真設(shè)計(jì),如下圖所示。proteus軟件一般存在高低版本兼容問(wèn)題,該仿真是通過(guò)proteus8.6導(dǎo)出的,所以請(qǐng)盡量使用proteus8.6打開(kāi)文件,低于proteus8.6的版本不能夠正常使用,高于proteus8.6的版本除了proteus8.8/8.9理論上可以正常使用。
當(dāng)前溫度:
5.? 設(shè)計(jì)報(bào)告
設(shè)計(jì)報(bào)告主要包括硬件電路、軟件設(shè)計(jì)、仿真調(diào)試等等,僅供參考。
6.? 資料清單
設(shè)計(jì)資料主要包括C程序+仿真+設(shè)計(jì)報(bào)告+使用說(shuō)明+元件清單+操作視頻等。
7.? 資料獲取鏈接
百度網(wǎng)盤(pán)下載鏈接:【E03】百度網(wǎng)盤(pán)下載鏈接
更多單片機(jī)仿真設(shè)計(jì)合集:單片機(jī)仿真設(shè)計(jì)合集