標(biāo)題:
基于51單片機(jī)的數(shù)字溫度計,上下限,蜂鳴器報警程序
[打印本頁]
作者:
半夏琉璃
時間:
2020-1-4 10:24
標(biāo)題:
基于51單片機(jī)的數(shù)字溫度計,上下限,蜂鳴器報警程序
#include <reg52.h>
#define key P2
#define LCD1602_DB P0
sbit LCD1602_RS = P1^0;
sbit LCD1602_RW = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;//
sbit ENLED = P1^4;//p1.4和p1.3是138使能端
static unsigned char D=0;
static unsigned char G=50;
sbitbuzz=P1^6;
bit flag1s = 0; //1s定時標(biāo)志
unsigned char T0RH = 0; //T0重載值的高字節(jié)
unsigned char T0RL = 0; //T0重載值的低字節(jié)
extern void delay_ms(unsigned int ms);
extern void DelayX10us(unsigned char t);
void ConfigTimer0(unsigned int ms);
unsigned char IntToString(unsigned char*str, int dat);
extern bit Start18B20();
extern bit Get18B20Temp(int *temp);
extern void InitLcd1602();
extern void LcdShowStr(unsigned char x,unsigned char y, unsigned char *str);
unsigned char code table0[]="D=";
unsigned char code table1[]="G=";
unsigned char code table2[]="TEMPIS:";
unsigned char codetable3[]="DS18B20 ERR0R!";
unsigned char codetable4[]="PLEASE CHECK!";
unsigned char code table5[]="'C";
unsigned char code table7[]="Wlecometo you!!";
unsigned char code table8[]=" I am YYY_Temp!";
void main()
{
bit res;
int temp; //讀取到的當(dāng)前溫度值
int intT, decT; //溫度值的整數(shù)和小數(shù)部分
unsigned char len;
unsigned char str[12];
InitLcd1602();
LcdShowStr(0, 0, table7);
LcdShowStr(0, 1, table8);//5初始化顯示5s
delay_ms(5000);
EX0=1;
IT0=1;
EA = 1; //開總中斷
ConfigTimer0(10); //T0定時10ms
Start18B20(); //啟動DS18B20
delay_ms(5000);
while (1)
{
if (flag1s) //每5秒更新一次溫度
{
flag1s = 0;
res = Get18B20Temp(&temp); //讀取當(dāng)前溫度
if (res) //讀取成功時,刷新當(dāng)前溫度顯示
{
intT = temp >> 4; //分離出溫度值整數(shù)部分
decT = temp & 0xF; //分離出溫度值小數(shù)部分
len = IntToString(str, intT);//整數(shù)部分轉(zhuǎn)換為字符串
str[len++] = '.'; //添加小數(shù)點(diǎn)
decT = (decT*10) / 16; //二進(jìn)制的小數(shù)部分轉(zhuǎn)換為1位十進(jìn)制位
str[len++] = decT + '0'; //十進(jìn)制小數(shù)位再轉(zhuǎn)換為ASCII字符
while (len < 6) //用空格補(bǔ)齊到6個字符長度
{
str[len++] = ' ';
}
str[len] = '\0'; //添加字符串結(jié)束符
LcdShowStr(8, 1, str); //顯示到液晶屏
len= IntToString(str, D); //整數(shù)部分轉(zhuǎn)換為字符串
while (len < 6) //用空格補(bǔ)齊到6個字符長度
{
str[len++] = ' ';
}
str[len] = '\0'; //添加字符串結(jié)束符
LcdShowStr(2, 0, str);
len = IntToString(str, G); //整數(shù)部分轉(zhuǎn)換為字符串
while (len < 6) //用空格補(bǔ)齊到6個字符長度
{
str[len++] = ' ';
}
str[len] = '\0'; //添加字符串結(jié)束符
LcdShowStr(10, 0, str);
LcdShowStr(0,0, table0);
LcdShowStr(8,0, table1);
LcdShowStr(0,1, table2);
LcdShowStr(13,1, table5);
}
else //讀取失敗時,提示錯誤信息
{
LcdShowStr(0, 0, table3);
LcdShowStr(0, 1, table4);
}
Start18B20(); //重新啟動下一次轉(zhuǎn)換
}
//鍵盤設(shè)置上下限,0.3s掃描一次鍵值,同時更新一次上下限的顯示
key=0xf7;
if(key!=0xf7)
{
delay_ms(10);
switch(key)
{
case0xe7:
D++;
if(D==G)D=0;
len= IntToString(str, D); //整數(shù)部分轉(zhuǎn)換為字符串
while(len < 6) //用空格補(bǔ)齊到6個字符長度
{
str[len++]= ' ';
}
str[len]= '\0'; //添加字符串結(jié)束符
LcdShowStr(2,0, str);
break;
case0xd7:
G--;
if(G==D)G=50;
len= IntToString(str, G); //整數(shù)部分轉(zhuǎn)換為字符串
while(len < 6) //用空格補(bǔ)齊到6個字符長度
{
str[len++]= ' ';
}
str[len]= '\0'; //添加字符串結(jié)束符
LcdShowStr(10,0, str);
break;
}
Start18B20();
delay_ms(300);//等待0.3s開始下一次掃描鍵值
}
//光和聲音警報部分
if(D>temp*0.0625||G<temp*0.0625)//超值報警
{
ENLED= 0;
ADDR3= 1;
ADDR2= 1;
LCD1602_RW= 1;
LCD1602_RS= 0;
LCD1602_DB=0xf0;
buzz=1;
DelayX10us(17);
buzz=0;
DelayX10us(17);
ENLED= 1;//138使能關(guān)閉
}
if(D==(temp*0.0625)||G==(temp*0.0625))//等值報警
{
ENLED= 0;
ADDR3= 1;
ADDR2= 1;
LCD1602_RW = 1;
LCD1602_RS= 0;
LCD1602_DB=0xf8;
buzz=1;
DelayX10us(100);
buzz=0;
DelayX10us(100);
ENLED= 1;//138使能關(guān)閉
}
if((D<temp*0.0625&&(1.1*D)>temp*0.0625)||(G>temp*0.0625&&(0.9*G)<temp*0.0625))//接近報警
{
ENLED= 0;
ADDR3= 1;
ADDR2= 1;
LCD1602_RW= 1;
LCD1602_RS= 0;
LCD1602_DB=0xfc;
buzz=1;
DelayX10us(2500);
buzz=0;
DelayX10us(2500);
ENLED= 1;//138使能關(guān)閉
}
}
}
/* 整型數(shù)轉(zhuǎn)換為字符串,str-字符串指針,dat-待轉(zhuǎn)換數(shù),返回值-字符串長度*/
unsigned char IntToString(unsigned char*str, int dat)
{
signed char i = 0;
unsigned char len = 0;
unsigned char buf[6];
if (dat < 0) //如果為負(fù)數(shù),首先取絕對值,并在指針上添加負(fù)號
{
dat = -dat;
*str++ = '-';
len++;
}
else
{
*str++= ' ';
len++;
}
do { //先轉(zhuǎn)換為低位在前的十進(jìn)制數(shù)組
buf[i++] = dat % 10;
dat /= 10;
}while (dat > 0);
len += i; //i最后的值就是有效字符的個數(shù)
while (i-- > 0) //將數(shù)組值轉(zhuǎn)換為ASCII碼反向拷貝到接收指針上
{
*str++ = buf[i] + '0';
}
*str = '\0'; //添加字符串結(jié)束符
return len; //返回字符串長度
}
/* 配置并啟動T0,ms-T0定時時間 */
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp; //臨時變量
tmp = 11059200 / 12; //定時器計數(shù)頻率
tmp = (tmp * ms) / 1000; //計算所需的計數(shù)值
tmp = 65536 - tmp; //計算定時器重載值
tmp = tmp + 12; //補(bǔ)償中斷響應(yīng)延時造成的誤差
T0RH = (unsigned char)(tmp>>8); //定時器重載值拆分為高低字節(jié)
T0RL = (unsigned char)tmp;
TMOD &= 0xF0; //清零T0的控制位
TMOD |= 0x01; //配置T0為模式1
TH0 = T0RH; //加載T0重載值
TL0 = T0RL;
ET0 = 1; //使能T0中斷
TR0 = 1; //啟動T0
}
/* T0中斷服務(wù)函數(shù),完成1秒定時 */
void InterruptTimer0() interrupt 1
{
static unsigned int tmr1s = 0;
TH0 = T0RH; //重新加載重載值
TL0 = T0RL;
tmr1s++;
if (tmr1s >= 500) //定時5s
{
tmr1s = 0;
flag1s = 1;
}
}
復(fù)制代碼
超級無敵終極版本數(shù)字溫度計.zip
2020-1-4 10:23 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
64.21 KB, 下載次數(shù): 75, 下載積分: 黑幣 -5
作者:
土豆哥666
時間:
2020-4-28 23:04
樓主方便把仿真也放一下么?麻煩了
作者:
jiangxinhong
時間:
2021-12-22 08:16
那個,溫度可以顯示負(fù)數(shù)啊
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1