導航:首頁 > 操作系統 > 濰坊溫度計單片機

濰坊溫度計單片機

發布時間:2023-10-09 11:52:33

Ⅰ 基於單片機的數字報警溫度計

按你的要求設計了程序並且通過ProteUS模擬
無償提供原理圖,ProteUS模擬工程(可運行),供參考運行效果,及原理圖的設計。
推薦:01 基於單片機的數字報警溫度計( <a href="http://ishare.iask.sina.com.cn/f/11655563.html" target="_blank">http://ishare.iask.sina.com.cn/f/11655563.html</a> )

; 源程序為匯編
; 實時顯示溫度
; 高於高限,低於低限,進行聲光報警
; 溫度高低限可自由設定

; 上電顯示 543210
; 讀出溫度後實時顯示溫度
; 溫度高於上限溫度時,顯示"HH****", 並進行聲光報警
; 溫度低於下限溫度時,顯示"LL****", 並進行聲光報警
; 設定鍵 進行高低限設定 循環為 "實時溫度" 「L ***」 「H ***」
; 可用 -鍵進行修改報警值

Ⅱ 單片機 51. 溫度計 測到數據!

單片機中常見是16進制,高8位指的是二進制說法。
比如,發上來的數據是:0000 0001 0101 1111
。0000 0001就是高8位,0101 1111是低8位,
換算成16進制就是:01 5F,換算成溫度應該用10進制,表示是1*256+95=351,那麼就是35.1度。

但是1111最多隻能表示到127,如果溫度太高或者零下怎麼表示呢,那麼就要判斷,我們可以把最高為置1,也可以按照你說的高8位大於127,也就是高8位發來的是0000 1111.那麼我就認為這個是零下數據。這個是事先協議規定好的!

Ⅲ 求救。單片機製作數字溫度計

這個正常的學習板上都會有的,我貼給你吧!
#include <reg52.H>
extern GetTemp(); //聲明引用外部函數
extern unsigned int idata Temperature; // 聲明引用外部變數
void delay(unsigned int i);
//else IO
sbit LS138A=P2^2; //管腳定義
sbit LS138B=P2^3;
sbit LS138C=P2^4;
//此表為 LED 的字模, 共陰數碼管 0-9 -
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
unsigned long LedOut[5],LedNumVal;
void system_Ini()
{
TMOD|= 0x11;
TH1 = 0xD8; //10
TL1 = 0xF0;
IE = 0x8A;
TR1 = 1;
}
main()
{ unsigned char i;
system_Ini();
while(1)
{
GetTemp();
/********以下將讀18b20的數據送到LED數碼管顯示*************/
LedNumVal=Temperature; //把實際溫度送到LedNumVal變數中
LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
LedOut[1]=Disp_Tab[LedNumVal%1000/100];
LedOut[2]=Disp_Tab[LedNumVal%100/10]; //十位
LedOut[3]=Disp_Tab[LedNumVal%10]; //個位

for(i=0; i<4; i++)
{
P0 = LedOut[i] ;

switch(i)
{ //138解碼
case 0:LS138A=0; LS138B=0; LS138C=0; break;
case 1:LS138A=1; LS138B=0; LS138C=0; break;
case 2:LS138A=0; LS138B=1; LS138C=0; break;
case 3:LS138A=1; LS138B=1; LS138C=0; break;
}

delay(100);
}
P0 = 0;

}
}
//延時程序
void delay(unsigned int i)
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
#include <reg52.H>
#include <intrins.h>
sbit D18B20=P3^7;
#define NOP() _nop_() /* 定義空指令 */
#define _Nop() _nop_() /*定義空指令*/
void TempDelay (unsigned char idata us);
void Init18b20 (void);
void WriteByte (unsigned char idata wr); //單位元組寫入
void read_bytes (unsigned char idata j);
unsigned char CRC (unsigned char j);
void GemTemp (void);
void Config18b20 (void);
void ReadID (void);
void TemperatuerResult(void);
bit flag;
unsigned int idata Temperature;
unsigned char idata temp_buff[9]; //存儲讀取的位元組,read scratchpad為9位元組,read rom ID為8位元組
unsigned char idata id_buff[8];
unsigned char idata *p,TIM;
unsigned char idata crc_data;
unsigned char code CrcTable [256]={
0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};
//
/************************************************************
*Function:延時處理
*parameter:
*Return:
*Modify:
*************************************************************/
void TempDelay (unsigned char idata us)
{
while(us--);
}
/************************************************************
*Function:18B20初始化
*parameter:
*Return:
*Modify:
*************************************************************/
void Init18b20 (void)
{
D18B20=1;
_nop_();
D18B20=0;
TempDelay(80); //delay 530 uS//80
_nop_();
D18B20=1;
TempDelay(14); //delay 100 uS//14
_nop_();
_nop_();
_nop_();
if(D18B20==0)
flag = 1; //detect 1820 success!
else
flag = 0; //detect 1820 fail!
TempDelay(20); //20
_nop_();
_nop_();
D18B20 = 1;
}
/************************************************************
*Function:向18B20寫入一個位元組
*parameter:
*Return:
*Modify:
*************************************************************/
void WriteByte (unsigned char idata wr) //單位元組寫入
{
unsigned char idata i;
for (i=0;i<8;i++)
{
D18B20 = 0;
_nop_();
D18B20=wr&0x01;
TempDelay(3); //delay 45 uS //5
_nop_();
_nop_();
D18B20=1;
wr >>= 1;
}
}
/************************************************************
*Function:讀18B20的一個位元組
*parameter:
*Return:
*Modify:
*************************************************************/
unsigned char ReadByte (void) //讀取單位元組
{
unsigned char idata i,u=0;
for(i=0;i<8;i++)
{
D18B20 = 0;
u >>= 1;
D18B20 = 1;
if(D18B20==1)
u |= 0x80;
TempDelay (2);
_nop_();
}
return(u);
}
/************************************************************
*Function:讀18B20
*parameter:
*Return:
*Modify:
*************************************************************/
void read_bytes (unsigned char idata j)
{
unsigned char idata i;
for(i=0;i<j;i++)
{
*p = ReadByte();
p++;
}
}
/************************************************************
*Function:CRC校驗
*parameter:
*Return:
*Modify:
*************************************************************/
unsigned char CRC (unsigned char j)
{
unsigned char idata i,crc_data=0;
for(i=0;i<j;i++) //查表校驗
crc_data = CrcTable[crc_data^temp_buff[i]];
return (crc_data);
}
/************************************************************
*Function:讀取溫度
*parameter:
*Return:
*Modify:
*************************************************************/
void GemTemp (void)
{
read_bytes (9);
if (CRC(9)==0) //校驗正確
{
Temperature = temp_buff[1]*0x100 + temp_buff[0];
// Temperature *= 0.625;
Temperature /= 16;
TempDelay(1);
}
}
/************************************************************
*Function:內部配置
*parameter:
*Return:
*Modify:
*************************************************************/
void Config18b20 (void) //重新配置報警限定值和解析度
{
Init18b20();
WriteByte(0xcc); //skip rom
WriteByte(0x4e); //write scratchpad
WriteByte(0x19); //上限
WriteByte(0x1a); //下限
WriteByte(0x7f); //set 11 bit (0.125)
Init18b20();
WriteByte(0xcc); //skip rom
WriteByte(0x48); //保存設定值
Init18b20();
WriteByte(0xcc); //skip rom
WriteByte(0xb8); //回調設定值
}
/************************************************************
*Function:讀18B20ID
*parameter:
*Return:
*Modify:
*************************************************************/
void ReadID (void)//讀取器件 id
{
Init18b20();
WriteByte(0x33); //read rom
read_bytes(8);
}
/************************************************************
*Function:18B20ID全處理
*parameter:
*Return:
*Modify:
*************************************************************/
void TemperatuerResult(void)
{
p = id_buff;
ReadID();
Config18b20();
Init18b20 ();
WriteByte(0xcc); //skip rom
WriteByte(0x44); //Temperature convert
Init18b20 ();
WriteByte(0xcc); //skip rom
WriteByte(0xbe); //read Temperature
p = temp_buff;
GemTemp();
}
void GetTemp()
{
if(TIM==100) //每隔 1000ms 讀取溫度
{ TIM=0;
TemperatuerResult();
}
}
/*************************************
[ t1 (10ms)中斷] 中斷
*************************************/
void T1zd(void) interrupt 3
{
TH1 = 0xD8; //10
TL1 = 0xF0;
TIM++;
}

Ⅳ 用單片機C語言設計數字溫度計!求代碼!急急急

//------------------------------------------------------------------
//DS18B20溫度感測器輸出顯示,運行本例時,外界溫度將顯示在1602LCD上
//------------------------------------------------------------------
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}
sbit DQ=P2^2;
sbit la=P2^6; //定義鎖存器鎖存端
sbit wela=P2^7;
sbit rs=P3^5; //定義1602液晶RS端
sbit lcden=P3^4;//定義1602液晶LCDEN端
sbit s1=P3^0; //定義按鍵--功能鍵
sbit s2=P3^1;//定義按鍵--增加鍵
sbit s3=P3^2;//定義按鍵--減小鍵
sbit s4=P3^6;//鬧鍾查看鍵
sbit rd=P3^7;
sbit beep=P2^3; //定義蜂鳴器端
uchar code Temp_Disp_Title[]={" Current Temp : "};
uchar Current_Temp_Display_Buffer[]={" TEMP: "};

uchar code Alarm_Temp[]={"ALARM TEMP Hi Lo"};
uchar Alarm_HI_LO_STR[]={"Hi: Lo: "};
uchar temp_data[2]={0x00,0x00};
uchar temp_alarm[2]={0x00,0x00};
uchar display[5]={0x00,0x00,0x00,0x00,0x00};
uchar display1[3]={0x00,0x00,0x00};
uchar code df_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
uchar CurrentT=0;//當前讀取的溫度整數部分
uchar Temp_Value[]={0x00,0x00};//從DS18B20讀取的溫度值
uchar Display_Digit[]={0,0,0,0}; //待顯示的各溫度數位
bit DS18B20_IS_OK=1;//感測器正常標志

//-------------------------------------
//延時1
//-------------------------------------
void delay1(uint x)
{
uchar i;
while(x--) for(i=0;i<200;i++);
}
//-------------------------------------
//延時2
//-------------------------------------
void Delay(uint x)
{
while(x--);
}
//------------------------------------
//忙檢查
//------------------------------------
void write_com(uchar com)//液晶寫命令函數
{
rs=0;
lcden=0;
P0=com;
delay1(5);
lcden=1;
delay1(5);
lcden=0;
}
void Write_LCD_Data(uchar date)//液晶寫數據函數
{
rs=1;
lcden=0;
P0=date;
delay1(5);
lcden=1;
delay1(5);
lcden=0;
}
//-----------------------------
//設置LCD顯示位置
//---------------------------------
void Set_Disp_Pos(uchar Pos)
{
write_com(Pos|0x80);
}

//-----------------------------
//LCD初始化
//---------------------------------
void Initialize_LCD()
{
uchar num;
rd=0; //軟體將矩陣按鍵第4列一端置低用以分解出獨立按鍵
la=0;//關閉兩鎖存器鎖存端,防止操作液晶時數碼管會出亂碼
wela=0;
lcden=0;

write_com(0x38);//初始化1602液晶
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);//設置顯示初始坐標

for(num=0;num<14;num++)//顯示年月日星期
{
Write_LCD_Data(Temp_Disp_Title[num]);
delay1(5);
}
}

//-------------------------------------
//函數功能:初始化DS18B20
//出口參數:status---DS18B20是否復位成功的標志
//-------------------------------------
uchar Init_DS18B20()
{
uchar status; //儲存DS18B20是否存在的標志,status=0,表示存在;status=1,表示不存在
DQ=1;Delay(8); //先將數據線拉高 //略微延時約6微秒
DQ=0;Delay(90); //再將數據線從高拉低,要求保持480~960us
//略微延時約600微秒 以向DS18B20發出一持續480~960us的低電平復位脈沖
DQ=1;Delay(8); //釋放數據線(將數據線拉高) //延時約30us(釋放匯流排後需等待15~60us讓DS18B20輸出存在脈沖)
status=DQ;Delay(100); //讓單片機檢測是否輸出了存在脈沖(DQ=0表示存在) //延時足夠長時間,等待存在脈沖輸出完畢
DQ=1; // 將數據線拉高
return status; //返回檢測成功標志
}
//-------------------------------------
//函數功能:讀一位元組
//出口參數:dat---讀出的數據
//-------------------------------------
uchar ReadOneByte()
{
uchar i,dat=0;
DQ=1;_nop_(); // 先將數據線拉高 //等待一個機器周期
for (i=0;i<8;i++)
{
DQ=0; //單片機從DS18B20讀書據時,將數據線從高拉低即啟動讀時序
dat>>=1;
_nop_();//等待一個機器周期
DQ=1; //將數據線"人為"拉高,為單片機檢測DS18B20的輸出電平作準備
_nop_();_nop_(); //延時約6us,使主機在15us內采樣
if (DQ) dat|=0x80; //如果讀到的數據是1,則將1存入dat,如果是0則保持原值不變
Delay(30); //延時3us,兩個讀時序之間必須有大於1us的恢復期
DQ=1; // 將數據線拉高,為讀下一位數據做准備
}
return dat;
}
//-------------------------------------
//函數功能:寫一位元組
//入口參數:dat---待寫入的數據
//-------------------------------------
void WriteOneByte(uchar dat)
{
uchar i;
for (i=0;i<8;i++)
{
DQ=0; //將數據線從高拉低時即啟動寫時序
DQ=dat & 0x01; //利用與運算取出要寫的某位二進制數據,
//並將其送到數據線上等待DS18B20采樣
Delay(5); //延時約30us,DS18B20在拉低後的約15~60us期間從數據線上采樣
DQ=1; //釋放數據線
dat>>=1; //將dat中的各二進制位數據右移1位
}
}
//-------------------------------------
//函數功能:讀取溫度值
//出入口參數:無
//-------------------------------------
void Read_Temperature()
{
if(Init_DS18B20() == 1) //DS18B20故障
DS18B20_IS_OK=0;
else
{
WriteOneByte(0xCC); // 跳過讀序號列號的操作
WriteOneByte(0x44); // 啟動溫度轉換
Init_DS18B20(); //將DS18B20初始化
WriteOneByte(0xCC); //跳過讀序號列號的操作
WriteOneByte(0xBE); //讀取溫度寄存器,前兩個分別是溫度的低位和高位
Temp_Value[0]=ReadOneByte(); //溫度低8位
Temp_Value[1]=ReadOneByte(); //溫度高8位
DS18B20_IS_OK=1;
}
}
//-------------------------------------
//函數功能:在LCD上顯示當前溫度
//入口參數:
//-------------------------------------
void Display_Temperature()
{
uchar i;
//延時值與負數標識
uchar t=150,ng=0;
//高5位全為1(0xF8)則為負數,為負數時取反加1,並設置負數標示
if ((Temp_Value[1] & 0xF8)==0xF8)
{
Temp_Value[1]=~Temp_Value[1];
Temp_Value[0]=~Temp_Value[0]+1;
if(Temp_Value[0]==0x00) Temp_Value[1]++; //加1後如果低位元組為00表示有進位,進位位再加到高位元組上
ng=1; //負數標示置1
}
Display_Digit[0]=df_Table[Temp_Value[0] & 0x0F]; //查表得到溫度小數部分
//獲取溫度整數部分(高位元組的低3位與低位元組中的高4位,無符號)
CurrentT=((Temp_Value[0] & 0xF0)>>4)|((Temp_Value[1] & 0x07)<<4);
//將整數部分分解為3位待顯示數字
Display_Digit[3]=CurrentT/100;//百位 digit[CurrentT/100];
Display_Digit[2]=CurrentT%100/10;//十位
Display_Digit[1]=CurrentT%10;//個位
//刷新LCD顯示緩沖
Current_Temp_Display_Buffer[11]=Display_Digit[0]+'0';//先將'0'轉換成整數48,然後與前面數字相加,得到相應數字的ASCII字元
Current_Temp_Display_Buffer[10]='.';
Current_Temp_Display_Buffer[9]=Display_Digit[1]+'0'; //個位
Current_Temp_Display_Buffer[8]=Display_Digit[2]+'0'; //十位
Current_Temp_Display_Buffer[7]=Display_Digit[3]+'0'; //百位
//高位為0時不顯示
if(Display_Digit[3]==0) Current_Temp_Display_Buffer[7]=' ';
//高位為0且次高位為0時,次高位不顯示
if(Display_Digit[2]==0 && Display_Digit[3]==0)
Current_Temp_Display_Buffer[8]=' ';
//負數符號顯示在恰當位置
if(ng)
{
if (Current_Temp_Display_Buffer[8]==' ')
Current_Temp_Display_Buffer[8]='-';
else if(Current_Temp_Display_Buffer[7]==' ')
Current_Temp_Display_Buffer[7]='-';
else
Current_Temp_Display_Buffer[6]='-';
}
//在第一行顯示標題
Set_Disp_Pos(0x00);
for(i=0;i<16;i++)
{
Write_LCD_Data(Temp_Disp_Title[i]);
}
Set_Disp_Pos(0x40); //在第二行顯示當前溫度
for(i=0;i<16;i++)
{
Write_LCD_Data(Current_Temp_Display_Buffer[i]);
}
//顯示溫度符號
//Set_Disp_Pos(0x4D);Write_LCD_Data(0x00);
Set_Disp_Pos(0x4D);Write_LCD_Data(0xdf);
Set_Disp_Pos(0x4E);Write_LCD_Data('C');
}
//-------------------------------------
//函數功能:主函數
//入口參數:
//-------------------------------------
void main()
{
Initialize_LCD();
Read_Temperature();
Delay(50000);
Delay(50000);
while (1)
{
Read_Temperature();
if (DS18B20_IS_OK) Display_Temperature();
delay1(100);
}
}

Ⅳ 單片機溫度計上電顯示溫度怎麼設置

1、首先通過DS18B20檢測溫度,若溫度高於設定最大閾值,紅燈亮,若溫度低於設定最小閾值,黃燈亮。
2、其次通過ADC0832配合電壓檢測電路檢測當前電壓,通過蜂鳴器提供按鍵音。
3、最後通過顯示屏顯示數字溫度計的溫度下限閾值,當前溫度值,電壓表的電壓值,通過按鍵切換界面,設置上下限閾值。

閱讀全文

與濰坊溫度計單片機相關的資料

熱點內容
apachephp中文亂碼 瀏覽:335
pythonimportpylab 瀏覽:234
阿里雲app伺服器價格表 瀏覽:976
appstore怎麼搶手機 瀏覽:843
列印伺服器是什麼列印隊列 瀏覽:357
網上怎麼用app辦理營業執照 瀏覽:859
sql如何查看伺服器地址 瀏覽:777
編譯速度和系統有關嗎 瀏覽:56
復盛製冷壓縮機 瀏覽:982
雲伺服器共享手機流量 瀏覽:842
星界邊境像素壓縮 瀏覽:459
演算法分析與設計二手 瀏覽:983
學編程如何配電腦 瀏覽:971
怎麼看特徵找卡密的加密方式 瀏覽:526
方舟非官方伺服器怎麼賺錢 瀏覽:516
明日之後伺服器無效是怎麼回事 瀏覽:271
蛋殼公寓app如何查水電表 瀏覽:718
ad20庫中的51單片機怎麼找 瀏覽:624
阿里雲伺服器有點卡嗎 瀏覽:216
蘋果7如何讓app後台運行 瀏覽:170