单片机温度检测的程序

单片机温度检测的程序,第1张

/   writer:shoppingw   /

#include <reg51h>

#include <intrinsh>

#define uint unsigned int

#define uchar unsigned char

sbit DQ = P3^6;

uchar code DSY_CODE[] =

{ 0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,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[]={0x11,0x22};

uchar Display_Digit[]={0,0,0,0};

bit DS18B20_IS_OK = 1;

void Delay(uint x)

{

while(--x);

}

uchar Init_DS18B20()

{

uchar status;

DQ = 1;

Delay(8);

DQ = 0;

Delay(90);

DQ = 1;

Delay(8);

DQ = 1;

return status;

}

uchar ReadOneByte()

{

uchar i,dat=0;

DQ = 1;

_nop_();

for(i=0;i<8;i++)

{

  DQ = 0;

dat >>= 1;

DQ = 1;

_nop_();

_nop_();

if(DQ)

dat |= 0X80;

Delay(30);

DQ = 1;

}

return dat;

}

void WriteOneByte(uchar dat)

{

uchar i;

for(i=0;i<8;i++)

{

  DQ = 0;

DQ = dat& 0x01;

Delay(5);

DQ = 1;

dat >>= 1;

}

}

void Read_Temperature()

{

if(Init_DS18B20() ==1 )

DS18B20_IS_OK = 0;

else

{

WriteOneByte(0xcc);

WriteOneByte(0x44);

Init_DS18B20();

WriteOneByte(0xcc);

WriteOneByte(0xbe);

Temp_Value[0] = ReadOneByte();

Temp_Value[1] = ReadOneByte();

DS18B20_IS_OK=1;

}

}

void Display_Temperature()

{

uchar i;

uchar t=150;

uchar ng=0, np=0;

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]++;

ng=1;np=0xfd;

}

Display_Digit[0] = df_Table[ Temp_Value[0] & 0x0f ];

CurrentT = ((Temp_Value[0] & 0xf0)>>4) | ((Temp_Value[1] & 0x07)<<4);

Display_Digit[3] = CurrentT / 100;

Display_Digit[2] = CurrentT % 100 / 10;

Display_Digit[1] = CurrentT % 10;

if (Display_Digit[3] == 0)

{

Display_Digit[3] = 10;

np = 0xfb;

if (Display_Digit[2] == 0)

{

Display_Digit[2] = 10;

np = 0xf7;

}

}

for (i=0;i<30;i++)

{

P0=0x39;P2=0x7f;Delay(t);P2=0xFF;

P0=0x63;P2=0xbf;Delay(t);P2=0xff;

P0=DSY_CODE[Display_Digit[0]];

P2=0xDF;Delay(t);P2=0xff;

P0=(DSY_CODE[Display_Digit[1]]) | 0x80;

P2=0xef;Delay(t);P2=0xff;

P0=DSY_CODE[Display_Digit[2]];

P2=0xf7;Delay(t);P2=0xff;

P0=DSY_CODE[Display_Digit[3]];

P2=0xfb; Delay(t); P2=0xff;

if (ng)

{

P0 = 0x40; P2 = np; Delay(t); P2=0xff;

}

}

}

void main()

{

Read_Temperature();

Delay(50000);

Delay(50000);

while(1)

{

  Read_Temperature();

if(DS18B20_IS_OK)

Display_Temperature();

}

}

我做过DS18B20温控设备,单总线传感这是一个不错的选择哦。下面是C语言程序,硬件接线如下:

(1)把“单片机系统”区域中的P00-P07用8芯排线连接到“动态数码显示”区域中的ABCDEFGH端子上。

(2)把“单片机系统”区域中的P20-P27用8芯排线连接到“动态数码显示”区域中的S1S2S3S4S5S6S7S8端子上。

(3)把DS18B20芯片插入“四路单总线”区域中的任一个插座中,注意电源与地信号不要接反。

(4)把“四路单总线”区域中的对应的DQ端子连接到“单片机系统”区域中的P37/RD端子上。

#include <REG52h> //at89c52

#include <INTRINSh>

unsigned char code displaybit[]={0xfe,0xfd,0xfb,0xf7,

0xef,0xdf,0xbf,0x7f};

unsigned char code displaycode[]={0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71,0x00,0x40};

unsigned char code dotcode[32]={0,3,6,9,12,16,19,22,

25,28,31,34,38,41,44,48,

50,53,56,59,63,66,69,72,

75,78,81,84,88,91,94,97};

unsigned char displaycount;

unsigned char displaybuf[8]={16,16,16,16,16,16,16,16};

unsigned char timecount;

unsigned char readdata[8];

sbit DQ=P3^7;

bit sflag;

bit resetpulse(void)

{

unsigned char i;

DQ=0;

for(i=255;i>0;i--);

DQ=1;

for(i=60;i>0;i--);

return(DQ);

for(i=200;i>0;i--);

}

void writecommandtods18b20(unsigned char command)

{

unsigned char i;

unsigned char j;

for(i=0;i<8;i++)

{

if((command & 0x01)==0)

{

DQ=0;

for(j=35;j>0;j--);

DQ=1;

}

else

{

DQ=0;

for(j=2;j>0;j--);

DQ=1;

for(j=33;j>0;j--);

}

command=_cror_(command,1);

}

}

unsigned char readdatafromds18b20(void)

{

unsigned char i;

unsigned char j;

unsigned char temp;

temp=0;

for(i=0;i<8;i++)

{

temp=_cror_(temp,1);

DQ=0;

_nop_();

_nop_();

DQ=1;

for(j=10;j>0;j--);

if(DQ==1)

{

temp=temp | 0x80;

}

else

{

temp=temp | 0x00;

}

for(j=200;j>0;j--);

}

return(temp);

}

void main(void)

{

TMOD=0x01;

TH0=(65536-4000)/256;

TL0=(65536-4000)%256;

ET0=1;

EA=1;

while(resetpulse());

writecommandtods18b20(0xcc);

writecommandtods18b20(0x44);

TR0=1;

while(1)

{

;

}

}

void t0(void) interrupt 1 using 0

{

unsigned char x;

unsigned int result;

TH0=(65536-4000)/256;

TL0=(65536-4000)%256;

if(displaycount==2)

{

P0=displaycode[displaybuf[displaycount]] | 0x80;

}

else

{

P0=displaycode[displaybuf[displaycount]];

}

P2=displaybit[displaycount];

displaycount++;

if(displaycount==8)

{

displaycount=0;

}

timecount++;

if(timecount==150)

{

timecount=0;

while(resetpulse());

writecommandtods18b20(0xcc);

writecommandtods18b20(0xbe);

readdata[0]=readdatafromds18b20();

readdata[1]=readdatafromds18b20();

for(x=0;x<8;x++)

{

displaybuf[x]=16;

}

sflag=0;

if((readdata[1] & 0xf8)!=0x00)

{

sflag=1;

readdata[1]=~readdata[1];

readdata[0]=~readdata[0];

result=readdata[0]+1;

readdata[0]=result;

if(result>255)

{

readdata[1]++;

}

}

readdata[1]=readdata[1]<<4;

readdata[1]=readdata[1] & 0x70;

x=readdata[0];

x=x>>4;

x=x & 0x0f;

readdata[1]=readdata[1] | x;

x=2;

result=readdata[1];

while(result/10)

{

displaybuf[x]=result%10;

result=result/10;

x++;

}

displaybuf[x]=result;

if(sflag==1)

{

displaybuf[x+1]=17;

}

x=readdata[0] & 0x0f;

x=x<<1;

displaybuf[0]=(dotcode[x])%10;

displaybuf[1]=(dotcode[x])/10;

while(resetpulse());

writecommandtods18b20(0xcc);

writecommandtods18b20(0x44);

}

}

Good luck!

#include <reg52h>

#define uchar unsigned char

#define uint unsigned int

sbit DS=P3^7; //define interface 定义DS18B20接口

uint temp; // variable of temperature

uchar flag1; // sign of the result positive or negative

sbit p0_5=P0^5;

sbit p2_7=P2^7;

sbit p2_4=P2^4;

sbit p2_5=P2^5;

sbit p2_6=P2^6;

unsigned char code TABLE[]={

0xd7,0x11,0xcd,0x5d,0x1b,

0x5e,0xde,0x15,0xdf,0x5f,

0x9f,0xdf,0xc6,0xd7,0xce,0x8e};

void delay(uint count) //delay

{

uint i;

while(count)

{

i=200;

while(i>0)

i--;

count--;

}

}

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; //DS18B20初始化

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

{ //写一个字节到DS18B20里

uint i;

uchar j;

bit testb;

for(j=1;j<=8;j++)

{

testb=dat&0x01;

dat=dat>>1;

if(testb) //write 1 写1部分

{

DS=0;

i++;i++;

DS=1;

i=8;while(i>0)i--;

}

else

{

DS=0; //write 0 写0部分

i=8;while(i>0)i--;

DS=1;

i++;i++;

}

}

}

void tmpchange(void) //DS18B20 begin change 发送温度转换命令

{

dsreset(); //初始化DS18B20

delay(1); //延时

tmpwritebyte(0xcc); // 跳过序列号命令

tmpwritebyte(0x44); //发送温度转换命令

}

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=temp00625; //得到真实十进制温度值,因为DS18B20

//可以精确到00625度,所以读回数据的最低位代表的是

//00625度。

temp=tt10+05; //放大十倍,这样做的目的将小数点后第一位

//也转换为可显示数字,同时进行一个四舍五入 *** 作。

return temp; //返回温度值

}

void delay10ms() //delay

{

uchar a,b;

for(a=10;a>0;a--)

for(b=60;b>0;b--);

}

void display(uint temp)

{

uchar a,b,c,d;

a=temp/100;

b=temp/10-a10;

d=temp%10;

c=(temp%100-d)/10;

P0=TABLE[d];

p0_5=0;

p2_7=0;

delay(1);

p2_7=1;

P0=TABLE[c];

p2_4=0;

delay(1);

p2_4=1;

P0=TABLE[b];

p0_5=1;

p2_5=0;

delay(1);

p2_5=1;

P0=TABLE[a];

p2_6=0;

delay(1);

p2_6=1;

}

void main() //主函数

{

uchar a;

Init_Com(); //初始化串口

do

{

tmpchange(); //温度转换

for(a=10;a>0;a--)

{

display(tmp()); //显示十次

}

}

while(1);

}

以上就是关于单片机温度检测的程序全部的内容,包括:单片机温度检测的程序、求一温度控制的C语言程序、C51单片机中怎么写一个中断程序,可以用一个温度传感器来实现。当温度过高时就自动报警。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9336530.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存