導航:首頁 > 操作系統 > 單片機測溫顯示程序

單片機測溫顯示程序

發布時間:2022-05-20 20:41:40

1. 單片機溫度的檢測與顯示的設計..的程序

;本程序用於循環顯示0----99
;RXD作為數據輸出端,TXD作為脈沖輸出端
;本程序只適用於共陽極數碼管
ORG 00H
START:
MOV A,#00H
MOV P0,A
MOV R1,#01H
MOV R3,#0AH
START1:
MOV A,#00H
MOV R0,A
MOV R2,#0AH
LOOP:
SETB P0.0
MOV A,R0
MOV R4,A
ACALL DSPLY
ACALL DELAY
MOV A,R0
INC A
MOV R0,A
DJNZ R2,LOOP
CLR P0.0
SETB P0.1
MOV A,R1
MOV R4,A
ACALL DSPLY
ACALL DELAY
MOV A,R1
INC A
MOV R1,A
CLR P0.1
DJNZ R3,START1
AJMP START
DSPLY:
MOV A,R4
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV SBUF, A
JNB TI, $
CLR TI
RET
DELAY:
MOV 30H,#8
D1:MOV 31H,#200
D2:MOV 32H,#200
D3:DJNZ 32H,D3
DJNZ 31H,D2
DJNZ 30H,D1
RET
TABLE:DB 02H,9EH,24H,0CH
DB 98H,48H,40H,1EH
DB 00H,08H
END 這是我參加全國電子設計大賽的一個子程序50分太少了吧!我自己做的電路板,絕對正確

2. 求一個51單片機控制的溫度計顯示程序

這個程序完全沒問題的,我做過實驗。希望對你有幫助,,,,

//DS18B20的讀寫程序,數據腳P3.3 //
//溫度感測器18B20匯編程序,採用器件默認的12位轉化 //
//最大轉化時間750微秒,顯示溫度-55到+125度,顯示精度 //
//為0.1度,顯示採用4位LED共陽顯示測溫值 //
//P0口為段碼輸入,P24~P27為位選 //
/***************************************************/

#include "reg51.h"
#include "intrins.h" //_nop_();延時函數用
#define Disdata P0 //段碼輸出口
#define discan P2 //掃描口
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^3; //溫度輸入口
sbit DIN=P0^7; //LED小數點控制
uint h;
uchar flag;
//**************溫度小數部分用查表法***********//
uchar code ditab[16]=
{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
//
uchar code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
//共陽LED段碼表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-"
uchar code scan_con[4]={0x7f,0xbf,0xdf,0xef}; //列掃描控制字
uchar data temp_data[2]={0x00,0x00}; //讀出溫度暫放
uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //顯示單元數據,共4個數據和一個運算暫用

//
//
//
/***********11微秒延時函數**********/
//
void delay(uint t)
{
for(;t>0;t--);
}
//
/***********顯示掃描函數**********/
scan()
{
char k;
for(k=0;k<4;k++) //四位LED掃描控制
{
Disdata=0xff;
Disdata=dis_7[display[k]];
if(k==1){DIN=0;}
discan=scan_con[k];delay(90);
discan=0xff;
}
}
//
//
/***********18B20復位函數**********/
ow_reset(void)
{
char presence=1;
while(presence)
{
while(presence)
{
DQ=1;_nop_();_nop_();
DQ=0; //
delay(50); // 550us
DQ=1; //
delay(6); // 66us
presence=DQ; // presence=0繼續下一步
}
delay(45); //延時500us
presence = ~DQ;
}
DQ=1;
}
//
//
/**********18B20寫命令函數*********/
//向 1-WIRE 匯流排上寫一個位元組
void write_byte(uchar val)
{
uchar i;
for (i=8; i>0; i--) //
{
DQ=1;_nop_();_nop_();
DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us
DQ = val&0x01; //最低位移出
delay(6); //66us
val=val/2; //右移一位
}
DQ = 1;
delay(1);
}
//
/*********18B20讀1個位元組函數********/
//從匯流排上讀取一個位元組
uchar read_byte(void)
{
uchar i;
uchar value = 0;
for (i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
value>>=1;
DQ = 0; //
_nop_();_nop_();_nop_();_nop_(); //4us
DQ = 1;_nop_();_nop_();_nop_();_nop_(); //4us
if(DQ)value|=0x80;
delay(6); //66us
}
DQ=1;
return(value);
}
//
/***********讀出溫度函數**********/
//
read_temp()
{
ow_reset(); //匯流排復位
write_byte(0xCC); // 發Skip ROM命令
write_byte(0xBE); // 發讀命令
temp_data[0]=read_byte(); //溫度低8位
temp_data[1]=read_byte(); //溫度高8位
ow_reset();
write_byte(0xCC); // Skip ROM
write_byte(0x44); // 發轉換命令
}
//
/***********溫度數據處理函數**********/
void work_temp()
{
uchar n=0;
uchar doth,dotl;
uchar flag3=1,flag2=1; //數字顯示修正標記
if((temp_data[1]&0xf8)!=0x00)
{
temp_data[1]=~(temp_data[1]);
temp_data[0]=~(temp_data[0])+1;
n=1;
flag=1;
}//負溫度求補碼
if(temp_data[0]>255)
{
temp_data[1]++;
}
display[4]=temp_data[0]&0x0f;
display[0]=ditab[display[4]];
doth=display[0]/10;
dotl=display[0]%10;
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x07)<<4);
display[3]=display[4]/100;
display[2]=display[4]/10%10;
display[1]=display[4]%10;
if(!display[3])
{
display[3]=0x0a;
flag3=0;
if(!display[2])
{
display[2]=0x0a;
flag2=0;
}
}//最高位為0時都不顯示
if(n)
{
display[3]=0x0b;//負溫度時最高位顯示"-"
flag3=0;
}
}

//
//
/**************主函數****************/
main()
{
Disdata=0xff; //初始化埠
discan=0xff;
for(h=0;h<4;h++){display[h]=8;}//開機顯示8888
ow_reset(); // 開機先轉換一次
write_byte(0xCC); // Skip ROM
write_byte(0x44); // 發轉換命令
for(h=0;h<500;h++)
{scan();} //開機顯示"8888"2秒
while(1)
{
read_temp(); //讀出18B20溫度數據
work_temp(); //處理溫度數據

scan(); //顯示溫度值2秒
}
}
//
//*********************結束**************************//

3. 跪求 單片機進行溫度檢測的C語言程序

//DS18B20的讀寫程序,數據腳P2.7 //
//溫度感測器18B20匯編程序,採用器件默認的12位轉化 //
//最大轉化時間750微秒,顯示溫度-55到+125度,顯示精度 //
//為0.1度,顯示採用4位LED共陽顯示測溫值 //
//P0口為段碼輸入,P34~P37為位選 //
/***************************************************/

#include "reg51.h"
#include "intrins.h" //_nop_();延時函數用
#define Disdata P0 //段碼輸出口
#define discan P3 //掃描口
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P2^7; //溫度輸入口
sbit DIN=P0^7; //LED小數點控制
uint h;
uint temp;
//
//
//**************溫度小數部分用查表法***********//
uchar code ditab[16]=
{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
//
uchar code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
//共陽LED段碼表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-"
uchar code scan_con[4]={0x7f,0xbf,0xdf,0xef}; //列掃描控制字
uchar data temp_data[2]={0x00,0x00}; //讀出溫度暫放
uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //顯示單元數據,共4個數據和一個運算暫用

//
//
//
/*****************11us延時函數*************************/
//
void delay(uint t)
{
for (;t>0;t--);
}
//

/****************顯示掃描函數***************************/
scan()
{
char k;
for(k=0;k<4;k++) //4位LED掃描控制
{
Disdata=dis_7[display[k]]; //數據顯示
if (k==1){DIN=0;} //小數點顯示
discan=scan_con[k]; //位選
delay(300);
}
}
//
//
/****************DS18B20復位函數************************/
ow_reset(void)
{
char presence=1;
while(presence)
{
while(presence)
{
DQ=1;_nop_();_nop_();//從高拉倒低
DQ=0;
delay(50); //550 us
DQ=1;
delay(6); //66 us
presence=DQ; //presence=0 復位成功,繼續下一步
}
delay(45); //延時500 us
presence=~DQ;
}
DQ=1; //拉高電平
}
//
//
/****************DS18B20寫命令函數************************/
//向1-WIRE 匯流排上寫1個位元組
void write_byte(uchar val)
{
uchar i;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_(); //從高拉倒低
DQ=0;_nop_();_nop_();_nop_();_nop_(); //5 us
DQ=val&0x01; //最低位移出
delay(6); //66 us
val=val/2; //右移1位
}
DQ=1;
delay(1);
}
//
/****************DS18B20讀1位元組函數************************/
//從匯流排上取1個位元組
uchar read_byte(void)
{
uchar i;
uchar value=0;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
value>>=1;
DQ=0;_nop_();_nop_();_nop_();_nop_(); //4 us
DQ=1;_nop_();_nop_();_nop_();_nop_(); //4 us
if(DQ)value|=0x80;
delay(6); //66 us
}
DQ=1;
return(value);
}
//
/****************讀出溫度函數************************/
//
read_temp()
{
ow_reset(); //匯流排復位
delay(200);
write_byte(0xcc); //發命令
write_byte(0x44); //發轉換命令
ow_reset();
delay(1);
write_byte(0xcc); //發命令
write_byte(0xbe);
temp_data[0]=read_byte(); //讀溫度值的第位元組
temp_data[1]=read_byte(); //讀溫度值的高位元組
temp=temp_data[1];
temp<<=8;
temp=temp|temp_data[0]; // 兩位元組合成一個整型變數。
return temp; //返回溫度值
}
//
/****************溫度數據處理函數************************/

//二進制高位元組的低半位元組和低位元組的高半位元組組成一位元組,這個
//位元組的二進制轉換為十進制後,就是溫度值的百、十、個位值,而剩
//下的低位元組的低半位元組轉化成十進制後,就是溫度值的小數部分

/********************************************************/
work_temp(uint tem)
{
uchar n=0;
if(tem>6348) // 溫度值正負判斷
{tem=65536-tem;n=1;} // 負溫度求補碼,標志位置1
display[4]=tem&0x0f; // 取小數部分的值
display[0]=ditab[display[4]]; // 存入小數部分顯示值
display[4]=tem>>4; // 取中間八位,即整數部分的值
display[3]=display[4]/100; // 取百位數據暫存
display[1]=display[4]%100; // 取後兩位數據暫存
display[2]=display[1]/10; // 取十位數據暫存
display[1]=display[1]%10;
/******************符號位顯示判斷**************************/
if(!display[3])
{
display[3]=0x0a; //最高位為0時不顯示
if(!display[2])
{
display[2]=0x0a; //次高位為0時不顯示
}
}
if(n){display[3]=0x0b;} //負溫度時最高位顯示"-"
}
//
//
/****************主函數************************/
main()
{
Disdata=0xff; //初始化埠
discan=0xff;
for(h=0;h<4;h++) //開機顯示"0000"
{display[h]=0;}
ow_reset(); //開機先轉換一次
write_byte(0xcc); //Skip ROM
write_byte(0x44); //發轉換命令
for(h=0;h<100;h++) //開機顯示"0000"
{scan();}
while(1)
{
work_temp(read_temp()); //處理溫度數據
scan(); //顯示溫度值
}
}
//
//***********************結束**************************//

4. 單片機溫度檢測的程序

你用的是DS18B20?這個程序你參考下#include <reg52.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P2^2; //溫度感測器信號線
sbit la=P2^6; //數碼管段選線
sbit wela=P2^7; //數碼管位選線
sbit beep=P2^3; //蜂鳴器
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
uint temp;
float f_temp;
uint warn_l1=23;
uint warn_h1=29;
sbit led0=P1^0;
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
unsigned char code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0xbf,0x86,
0xdb,0xcf,0xe6,0xed,
0xfd,0x87,0xff,0xef}; //不帶小數點的編碼
void delay(uint z)//延時函數
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void dsreset(void) //18B20復位,初始化函數
{
uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bit tempreadbit(void) //讀1位函數
{
uint i;
bit dat;
ds=0;i++; //i++ 起延時作用
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return (dat);
}
uchar tempread(void) //讀1個位元組
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1); //讀出的數據最低位在最前面,這樣剛好一個位元組在DAT里
}
return(dat);
}
void tempwritebyte(uchar dat) //向18B20寫一個位元組數據
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //寫 1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0; //寫 0
i=8;while(i>0)i--;
ds=1;
i++;i++;
}

}
}
void tempchange(void) //DS18B20 開始獲取溫度並轉換
{
dsreset();
delay(1);
tempwritebyte(0xcc); // 寫跳過讀ROM指令
tempwritebyte(0x44); // 寫溫度轉換指令
}
uint get_temp() //讀取寄存器中存儲的溫度數據
{
uchar a,b;

dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread(); //讀低8位
b=tempread(); //讀高8位
temp=b;
temp<<=8; //兩個位元組組合為1個字
temp=temp|a;
f_temp=temp*0.0625; //溫度在寄存器中為12位 解析度位0.0625°
temp=f_temp*10+0.5; //乘以10表示小數點後面只取1位,加0.5是四捨五入
f_temp=f_temp+0.05;
return temp; //temp是整型
}
////////////////////顯示程序//////////////////////////
void display(uchar num,uchar dat)
{
uchar i;
la=0;
P0=table[dat];
la=1;
la=0;

wela=0;
i=0XFF;
i=i&(~((0X01)<<(num)));
P0=i;
wela=1;
wela=0;
delay(1);
}

void dis_temp(uint t)
{
uchar i;
i=t/100;
display(0,i);
i=t%100/10;
display(1,i+10);
i=t%100%10;
display(2,i);
}
//////////////////////////////////////////////
void warn(uint s,uchar led) //蜂鳴器報警聲音 ,s控制音調
{
uchar i;i=s;
la=0;
wela=0;

// beep=0;
P1=~(led);
while(i--)
{
dis_temp(get_temp());
}
// beep=1;
P1=0XFF;
i=s;
while(i--)
{
dis_temp(get_temp());
}
}
void deal(uint t)
{
uchar i,k;
k=t/10;
if(k<warn_l1)
{
warn(40,0x01);

}
if(k>warn_h1)
{
warn(40,0x04);
}
else
{
i=40;
while(i--)
{
dis_temp(get_temp());
}
}
}
void xianshi(num)
{
uint m;
for(m=50;m>0;m--)
{
uchar shi,ge;
shi=num/10;
ge=num%10;

la=1;
P0=table[shi];
la=0;
P0=0xff;

wela=1;
P0=0xfe;
wela=0;
delay(10);

la=1;
P0=table[ge];
la=0;
P0=0xff;

wela=1;
P0=0xfd;
wela=0;
delay(10);
}
}
void anjian()
{
if(key1==0)
{
delay(10);
if(key1==0)
{
warn_l1++;
if(warn_l1==warn_h1)
warn_l1=23;
xianshi(warn_l1+1);
while(!key1);
}
}
if(key2==0)
{
delay(10);
if(key2==0)
{
warn_l1--;
if(warn_l1==0)
warn_l1=23;
xianshi(warn_l1+1);
while(!key2);
}
}
if(key3==0)
{
delay(10);
if(key3==0)
{
warn_h1++;
if(warn_h1==125)
warn_h1=29;
xianshi(warn_h1+1);
while(!key3);
}
}
if(key4==0)
{
delay(10);
if(key4==0)
{
warn_h1--;
if(warn_h1==warn_l1)
warn_h1=29;
xianshi(warn_h1+1);
while(!key4);
}
}
}

void main()
{
uchar buff[4],i;
la=0;
wela=0;
while(1)
{
tempchange();
anjian();
for(i=10;i>0;i--)
{
dis_temp(get_temp());

}
deal(temp);

sprintf(buff,"%f",f_temp);

for(i=10;i>0;i--)
{
dis_temp(get_temp());
}

for(i=10;i>0;i--)
{
dis_temp(get_temp());}

}
}

5. 51單片機學習板關於溫度檢測的程序求

一、DS18B20.c文件(用LCD1602顯示的 I_N為DS18B20數據IO)
/*
模塊名稱:溫度模塊(DS18B20)
模塊功能:DS18B20的功能子函數
*/
/********************************************預處理命令*******************************************/
#include"ds18b20.h"
/*
函數名:DS_WriBteAndRead(bit x,unit8 val)
函數功能:向DS18B20內部寄存器寫入或讀取數據
輸入: x,val
輸出:DS_WriteAndRead
*/
unit8 DS_WriteAndRead(bit x,unit8 val)
{
unit8 i=0,Red=0;
for(i=8;i>0;i--)
{
if(x) //讀數據
{
I_N=0;
I_N=1;
Red>>=1;
if(I_N)Red|=0x80;
}
else //寫數據
{
I_N=1;
I_N=0;
I_N=val&0x01;
val>>=1;
}
delay_us(4);
}
if(x)
return(Red);//返回數據
else
return 0;
}
/*
函數名:DS_Reset()
函數功能:DS18B20初始化設置
輸入:無
輸出:無
*/
void DS_Reset()
{
I_N=1;
I_N=0;
delay_us(50);
I_N=1;
delay_us(30);
DS_WriteAndRead(0,0xcc);//跳過搜索
}
/*
函數名: DS_Data_Handle()
函數功能:數據處理
輸入:無
輸出:無
*/
void DS_Data_Handle()
{
unit_16 Ra=0,Rb=0,Temp=0;
DS_Reset(); //復位
DS_WriteAndRead(0,0x44); //啟動溫度轉換
DS_Reset(); //復位
delay_us(100);
DS_WriteAndRead(0,0xbe);//讀暫存器中的數據

Ra=DS_WriteAndRead(1,0xbe);
Rb=DS_WriteAndRead(1,0xbe);

Temp=Rb;
Temp<<=8;
Temp|=Ra;
Temp=Temp*0.625+0.5;//數值轉換

LCD_Write_Data(0,0xc5);
LCD_Write_Data(1,(Temp/100)+48);
LCD_Write_Data(1,(Temp/10%10)+48);
LCD_Write_Data(1,46);
LCD_Write_Data(1,(Temp%10)+48);
}

6. 單片機ts18b20測溫程序 請大神注釋程序 最好每一句都注釋明白(小白一隻 只有15財富 全送好人)

/****lcd1602顯示溫度(使用溫度感測器18b20)*****/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
/*********液晶屏相關參數**************/
#define data_port P1 //液晶屏指令、數據通信介面
sbit rs=P2^0; //液晶屏寄存器選擇介面(rs=0時選擇指令寄存器,rs=1時選擇數據寄存器)
sbit rw=P2^1; //液晶屏讀寫選擇介面(rw=0時選擇寫入,rw=1時選擇讀出)
sbit en=P2^2; //液晶屏使能介面(en=0時通信介面中斷,en=1時通信介面接通)
uchar code line1_str[]={" Temperature "};//液晶屏第一行要顯示的字元串
uchar code num_tab[]={"0123456789"};
/*********溫度感測器18b20相關參數**********/
sbit DQ=P3^5; //溫度感測器18b20的數據介面
/**********子函數聲明部分************/
void T1_int(); //定時器T1初始化子函數聲明
void in_command(uchar com); //向液晶屏輸入命令子函數聲明
void in_data(uchar dat); //向液晶屏輸入數據子函數聲明
void lcd_disp_string(uchar str[]); //液晶屏顯示一串字元子函數聲明
void lcd_int(); //液晶屏初始化子函數聲明
void disp_temperature(uint temp);//lcd1602顯示溫度子函數聲明
bit ds18b20_ret(); //溫度感測器18b20復位子函數聲明
void ds18b20_wr_com(uchar com); //向溫度感測器18b20寫入命令子函數聲明
void rd_ram_command(); //發送命令子函數(讀取18b20的RAM)
uint ds18b20_rd_data(); //讀出溫度感測器18b20寄存器的相關數據(主要是溫度值)子函數聲明
void temperature_convert(); //18b20溫度轉換子函數聲明
void delayms(uint ms); //毫秒延時子函數聲明
void delay_n10_us(uchar n); //微秒延時子函數聲明
/************************************/
void main()
{
T1_int(); //定時器T1初始化
DQ=1; //釋放溫度感測器18b20的數據介面
temperature_convert(); //第一次調用18b20溫度轉換子函數消除85°C問題
lcd_int(); //液晶屏初始化(放在18b20溫度轉換子函數後邊用來延時,跳過85°C)
while(1)
{
temperature_convert(); //調用18b20溫度轉換子函數
rd_ram_command(); //發送命令子函數(讀取18b20的RAM)
disp_temperature(ds18b20_rd_data());//調用lcd1602顯示溫度子函數
}
}
/**********定時器T1初始化*************/
void T1_int()
{
TMOD=0x10; //0001 0000 T1工作在定時方式1
TH1=0; //T1設定初值
TL1=0;
TR1=0; //暫時關閉T1
}
/**********18b20溫度轉換子函數*************/
void temperature_convert()
{
while(ds18b20_ret()==0);//溫度感測器18b20復位
ds18b20_wr_com(0xcc); //向溫度感測器18b20寫入"跳躍ROM命令"
ds18b20_wr_com(0x44); //向溫度感測器18b20寫入"溫度轉換命令"
delay_n10_us(50); //500us延時,等待轉換完成
}
/**********發送命令子函數(讀取18b20的RAM)***********/
void rd_ram_command()
{
while(ds18b20_ret()==0);
ds18b20_wr_com(0xcc); //向溫度感測器18b20寫入"跳躍ROM命令"
ds18b20_wr_com(0xbe); //向溫度感測器18b20寫入"讀RAM命令"
}
/******讀出18b20寄存器的相關數據(主要是溫度值)子函數******/
uint ds18b20_rd_data()
{
uchar i;
uint temp_val;
for(i=0;i<16;i++)
{
temp_val>>=1;
DQ=0;
_nop_();
DQ=1;
_nop_();
_nop_();
if(DQ==1)
{
temp_val|=0x8000;
}
delay_n10_us(7); //70us延時,確保讀出
}
return(temp_val);
}
/******向溫度感測器18b20寫入命令子函數聲明****/
void ds18b20_wr_com(uchar com)
{
uchar i;
for(i=0;i<8;i++)
{
if((com&0x01)==0)
{
DQ=0;
delay_n10_us(7); //70us延時,確保寫入0
DQ=1;
_nop_();
}
else
{
DQ=0;
_nop_();
DQ=1;
delay_n10_us(7); //70us延時,確保寫入1
}
com>>=1;
}
}
/**********溫度感測器18b20復位子函數**********/
bit ds18b20_ret()
{
uint temp; //暫存脈沖時間
DQ=0; //啟動復位脈沖
delay_n10_us(50); //500us延時(大於480us)
DQ=1; //停止復位脈沖
TR1=1; //啟動T1
while(DQ==1 && TH1*256+TL1<=60);//等待18b20回應,等待時間不超過60us
if(DQ==0) //18b20回應
{
temp=TH1*256+TL1;
while(TH1*256+TL1-temp<40); //等待60us再次檢測回應脈沖是否存在
if(DQ==0) //18b20正常回應
{
while(TH1*256+TL1<=480);//等待正常復位完成
TR1=0; //關閉T1
TH1=0; //計時歸零
TL1=0;
return(1); //18b20有正常回應返回1
}
else
{
TR1=0; //關閉T1
TH1=0; //計時歸零
TL1=0;
return(0); //18b20有正常回應返回0
}
}
else
{
TR1=0; //關閉T1
TH1=0; //計時歸零
TL1=0;
return(0); //18b20沒有回應返回0
}
}
/*********lcd1602顯示溫度子函數聲明********/
void disp_temperature(uint temp)
{
uchar temp_h,temp_l,flag=0; //溫度整數部分,小數部分(二進制)和最高位是否為'0'標志
uint temp_decimal=0; //存儲溫度值的小數部分(十進制)
in_command(0xc2); //設定第二行字元串起始顯示位置
if(temp>=0x8000)
{
in_data('-'); //顯示'-'號
temp=~temp;
temp+=1;
}
else
{
in_data(' '); //'+'號不顯示
}
temp_h=temp/16;
temp_l=temp%16;
if(temp_h/100!=0)
{
flag=1;
in_data(num_tab[temp_h/100]); //顯示溫度值的百位
}
else
{
in_data(' '); //百位為'0'則百位不顯示
}
temp_h%=100;
if(temp_h/10!=0 || flag==1)
{
flag=1;
in_data(num_tab[temp_h/10]); //顯示溫度值的十位
}
else
{
in_data(' '); //百位,十位都為'0'則十位不顯示
}
temp_h%=10;
in_data(num_tab[temp_h]); //顯示溫度值的個位
in_data('.'); //顯示小數點
if(temp_l/8==1)
{temp_decimal+=5000;}
temp_l=temp_l%8;
if(temp_l/4==1)
{temp_decimal+=2500;}
temp_l=temp_l%4;
if(temp_l/2==1)
{temp_decimal+=1250;}
temp_l=temp_l%2;
if(temp_l==1)
{temp_decimal+=625;}
in_data(num_tab[temp_decimal/1000]);//顯示溫度值的十分位
in_data(' ');
in_data(223); //顯示溫度單位標志'攝氏度'
in_data('C');
}
/**********液晶屏初始化子函數**********/
void lcd_int()
{
/***************LCD初始設置*****************/
delayms(15); //延時15MS,等待LCD初始化
in_command(0x01); //清顯示屏
in_command(0x38); //8位通信,2行顯示,5*7點陣
in_command(0x0c); //開顯示,關游標,關閃爍
in_command(0x06); //字元不動,游標右移動,地址加一
/************1602顯示上電後電機默認的狀態信息**************/
in_command(0x80); //設定第一行字元串起始顯示位置
lcd_disp_string(line1_str); //顯示數據(字元)
}
/**********液晶屏顯示一串字元**********/
void lcd_disp_string(uchar str[])
{
uchar i=0;
while(str[i]!='\0')
{
in_data(str[i]); //顯示數據(字元)
i++;
delayms(50); //延時
}
}
/********向液晶屏輸入命令子函數************/
void in_command(uchar com)
{
delayms(2);
en=0;//關閉通信,為設置參數做准備
rs=0;//選擇指令寄存器
rw=0;//寫入液晶
_nop_();
data_port=com;
en=1;//開始通信
_nop_();
en=0;//關閉通信,為設置參數做准備
}
/********向液晶屏輸入數據子函數************/
void in_data(uchar dat)
{
delayms(2);
en=0;//關閉通信,為設置參數做准備
rs=1;//選擇數據寄存器
rw=0;//寫入液晶
_nop_();
data_port=dat;
_nop_();
en=1;//開始通信
_nop_();
en=0;//關閉通信,為設置參數做准備
}
/********微秒延時子函數************/
void delay_n10_us(uchar n)
{
while(n--)
{
_nop_();
_nop_();
}
}
/********毫秒延時子函數************/
void delayms(uint ms)
{
uchar i;
while(ms--)
{
for(i=0;i<124;i++);
}
}

7. 單片機數字溫度計的源程序

//DS18B20的讀寫程序,數據腳P2.7 // //溫度感測器18B20匯編程序,採用器件默認的12位轉化 // //最大轉化時間750微秒,顯示溫度-55到+125度,顯示精度 // //為0.1度,顯示採用4位LED共陽顯示測溫值 // //P0口為段碼輸入,P34~P37為位選 // /***************************************************/ #include "reg51.h" #include "intrins.h" //_nop_();延時函數用 #define Disdata P0 //段碼輸出口 #define discan P2 //掃描口 #define uchar unsigned char #define uint unsigned int sbit DQ=P1^2; //溫度輸入口 sbit DIN=P0^7; //LED小數點控制 uint h; uint temp; // // //**************溫度小數部分用查表法***********// uchar code ditab[16]= {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; // uchar code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}; //共陽LED段碼表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-" uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7}; //列掃描控制字 uchar data temp_data[2]={0x00,0x00}; //讀出溫度暫放 uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //顯示單元數據,共4個數據和一個運算暫用 // // // /*****************11us延時函數*************************/ // void delay(uint t) { for (;t>0;t--); } // /****************顯示掃描函數***************************/ scan() { char k; for(k=0;k<4;k++) //4位LED掃描控制 { Disdata=dis_7[display[k]]; //數據顯示 if (k==1){DIN=0;} //小數點顯示 discan=scan_con[k]; //位選 delay(300); P2=0xff; } }

8. 單片機溫度檢測程序怎麼寫採用一個帶有I2C匯流排介面的溫度感測器,包括顯示,包括串口通訊給PC機

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS=P2^2; //define interface
uint temp; // variable of temperature
uchar flag1; // sign of the result positive or negative
sbit la=P2^6;
sbit wela=P2^7;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef};

void delay(uint count) //delay
{
uint i;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
///////功能:串口初始化,波特率9600,方式1///////
void Init_Com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}

void dsreset(void) //send reset and initialization command
{
uint i;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}

bit tmpreadbit(void) //read a bit
{
uint i;
bit dat;
DS=0;i++; //i++ for delay
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return (dat);
}

uchar tmpread(void) //read a byte date
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //讀出的數據最低位在最前面,這樣剛好一個位元組在DAT里
}
return(dat);
}

void tmpwritebyte(uchar dat) //write a byte to ds18b20
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0; //write 0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}

}
}

void tmpchange(void) //DS18B20 begin change
{
dsreset();
delay(1);
tmpwritebyte(0xcc); // address all drivers on bus
tmpwritebyte(0x44); // initiates a single temperature conversion
}

uint tmp() //get the temperature
{
float tt;
uchar a,b;
dsreset();
delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread();
b=tmpread();
temp=b;
temp<<=8; //two byte compose a int variable
temp=temp|a;
tt=temp*0.0625;
temp=tt*10+0.5;
return temp;
}

void readrom() //read the serial
{
uchar sn1,sn2;
dsreset();
delay(1);
tmpwritebyte(0x33);
sn1=tmpread();
sn2=tmpread();
}

void delay10ms() //delay
{
uchar a,b;
for(a=10;a>0;a--)
for(b=60;b>0;b--);
}

void display(uint temp) //顯示程序
{
uchar A1,A2,A2t,A3,ser;
ser=temp/10;
SBUF=ser;
A1=temp/100;
A2t=temp%100;
A2=A2t/10;
A3=A2t%10;
la=0;
P0=table[A1]; //顯示百位
la=1;
la=0;

wela=0;
P0=0x7e;
wela=1;
wela=0;
delay(1);

la=0;
P0=table1[A2]; //顯示十位
la=1;
la=0;

wela=0;
P0=0x7d;
wela=1;
wela=0;
delay(1);

P0=table[A3]; //顯示個位
la=1;
la=0;

P0=0x7b;
wela=1;
wela=0;
delay(1);
}

void main()
{
uchar a;
// Init_Com();
do
{
tmpchange();
// delay(200);
for(a=10;a>0;a--)
{ display(tmp());
}
} while(1);
}
參照一下。但注意你的開發板的接線情況,sbit la=P2^6;
sbit wela=P2^7;是控制數碼管鎖存。

9. 單片機ds18b20測溫數碼管顯示程序,我參照原來程序改的,為何一個顯示十進制一個顯示16進制

我發現了三個不同之處。 不知道你有沒有仔細比較 :
1、uchar readbyte()中i應該<=8;
2、顯示十位時,原程序是 table1[];
3、結尾 display(tmp());後沒有延時一個機器周期,1ms。

10. 51單片機製作溫度計的簡單程序

;這是關於DS18B20的讀寫程序,數據腳P2.2,晶振12MHZ
;溫度感測器18B20匯編程序,採用器件默認的12位轉化,最大轉化時間750微秒
;可以將檢測到的溫度直接顯示到AT89C51開發實驗板的兩個數碼管上
;顯示溫度00到99度,很准確哦~~無需校正!
ORG 0000H ;單片機內存分配申明!
TEMPER_L EQU 29H;用於保存讀出溫度的低8位
TEMPER_H EQU 28H;用於保存讀出溫度的高8位
FLAG1 EQU 38H;是否檢測到DS18B20標志位
a_bit equ 20h ;數碼管個位數存放內存位置
b_bit equ 21h ;數碼管十位數存放內存位置
TEMP_TH EQU
MAIN:
LCALL GET_TEMPER;調用讀溫度子程序 ,顯示範圍00到99度,顯示精度為1度
;因為12位轉化時每一位的精度為0.0625度,我們不要求顯示小數所以可以拋棄29H的低4位
;將28H中的低4位移入29H中的高4位,這樣獲得一個新位元組,這個位元組就是實際測量獲得的溫度
MOV A,29H
MOV C,40H;將28H中的最低位移入C
RRC A
MOV C,41H
RRC A
MOV C,42H
RRC A
MOV C,43H
RRC A
MOV 29H,A
LCALL DISPLAY ;調用數碼管顯示子程序
CPL P1.0
AJMP MAIN
; 這是DS18B20復位初始化子程序
INIT_1820:
SETB P3.5
NOP
CLR P3.5 ;主機發出延時537微秒的復位低脈沖
MOV R1,#3
TSR1:MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB P3.5 ;然後拉高數據線
NOP
NOP
NOP
MOV R0,#25H
TSR2:
JNB P3.5,TSR3 ;等待DS18B20回應
DJNZ R0,TSR2
LJMP TSR4 ; 延時
TSR3:
SETB FLAG1 ; 置標志位,表示DS1820存在
CLR P1.7 ;檢查到DS18B20就點亮P1.7LED
LJMP TSR5
TSR4:
CLR FLAG1 ; 清標志位,表示DS1820不存在
CLR P1.1 ;點亮P1。1腳LED表示溫度感測器通信失敗
LJMP TSR7
TSR5:
MOV R0,#117
TSR6:
DJNZ R0,TSR6 ; 時序要求延時一段時間
TSR7:
SETB P3.5
RET

; 讀出轉換後的溫度值
GET_TEMPER:
SETB P3.5
LCALL INIT_1820 ;先復位DS18B20
JB FLAG1,TSS2
CLR P1.2
RET ; 判斷DS1820是否存在?若DS18B20不存在則返回
TSS2:
CLR P1.3 ;DS18B20已經被檢測到!!!!!!!!!!!!!!!!!!
MOV A,#0CCH
LCALL WRITE_1820
MOV A,#44H ;發出溫度轉換命令
LCALL WRITE_1820
;這里通過調用顯示子程序實現延時一段時間,等待AD轉換結束,12位的話750微秒
LCALL DISPLAY
LCALL INIT_1820 ;准備讀溫度前先復位
MOV A,#0CCH ; 跳過ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 發出讀溫度命令
LCALL WRITE_1820
LCALL READ_18200; 將讀出的溫度數據保存到35H/36H
CLR P1.4
RET

;寫DS18B20的子程序(有具體的時序要求)
WRITE_1820:
MOV R2,#8;一共8位數據
CLR C
WR1:
CLR P3.5
MOV R3,#6
DJNZ R3,$
RRC A
MOV P3.5,C
MOV R3,#23
DJNZ R3,$
SETB P3.5
NOP
DJNZ R2,WR1
SETB P3.5
RET

; 讀DS18B20的程序,從DS18B20中讀出兩個位元組的溫度數據
READ_18200:
MOV R4,#2 ; 將溫度高位和低位從DS18B20中讀出
MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:
MOV R2,#8;數據一共有8位
RE01:
CLR C
SETB P3.5
NOP
NOP
CLR P3.5
NOP
NOP
NOP
SETB P3.5
MOV R3,#9
RE10:
DJNZ R3,RE10
MOV C,P3.5
MOV R3,#23
RE20:
DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET

;顯示子程序
display: mov a,29H;將29H中的十六進制數轉換成10進制
mov b,#10 ;10進制/10=10進制
div ab
mov b_bit,a ;十位在a
mov a_bit,b ;個位在b
mov dptr,#numtab ;指定查表啟始地址
mov r0,#4
dpl1: mov r1,#250 ;顯示1000次
dplop: mov a,a_bit ;取個位數
MOVC A,@A+DPTR ;查個位數的7段代碼
mov p1,a ;送出個位的7段代碼
setb p2.0 ;開個位顯示
acall d1ms ;顯示1ms
clr p2.0
mov a,b_bit ;取十位數
MOVC A,@A+DPTR ;查十位數的7段代碼
mov p1,a ;送出十位的7段代碼
setb p2.1 ;開十位顯示
acall d1ms ;顯示1ms
clr p2.1
djnz r1,dplop ;100次沒完循環
djnz r0,dpl1 ;4個100次沒完循環
ret
;1MS延時(按12MHZ算)
D1MS: MOV R7,#80
DJNZ R7,$
RET
numtab: ;數碼管共陽極0~9代碼
DB 0C0H,0F9H,0A4H,0B0H,99H, 92H,82H,0F8H,80H,90H
end

閱讀全文

與單片機測溫顯示程序相關的資料

熱點內容
雲伺服器建設原理 瀏覽:258
javajunit4for 瀏覽:845
華為伺服器如何進陣列卡配置 瀏覽:435
apache伺服器ip地址訪問 瀏覽:718
如何買到安卓手機預裝軟體 瀏覽:537
冤罪百度雲不要壓縮 瀏覽:87
蘇州雲存儲伺服器 瀏覽:175
解壓收納原聲 瀏覽:385
java注冊驗證 瀏覽:375
火花app怎麼上推薦 瀏覽:980
什麼app能游戲投屏到電視上 瀏覽:455
伺服器託管到雲端是什麼意思 瀏覽:836
app保存草稿怎麼用 瀏覽:808
安卓如何進入proumb 瀏覽:144
主機虛擬雲伺服器 瀏覽:619
刪除分區加密的空間會不會恢復 瀏覽:706
京東app客戶上門怎麼看搜索量 瀏覽:741
怎麼在農行app購買黃金 瀏覽:46
c型開發板和單片機 瀏覽:146
虛擬機建立用戶的模板文件夾 瀏覽:905