能把单片机AT89C51温度传感器C语言程序和原理图给我吗

如题所述

一,C51程序,我的是 用LCD1602显示的温度计,另外 我给的图是AT89C2051 你可以按程序给的接口换做51

#include<reg52.h>

#define uint  unsigned int

#define uchar unsigned char

#define lcd    P0

#define n 5

sbit lcd_e=P2^6;

sbit lcd_rw=P2^5;

sbit lcd_rs=P2^4;

sbit ds18b20_io=P1^7;

uchar code table[]=

{

'0','1','2','3','4','5','6','7','8','9'

};

uchar temper=0;

void delayms(uint cc)

{

uint x=cc;

uint y=110;

for(;x>0;x--)

for(;y>0;y--);

}

void lcd_com(uchar com)

{

lcd_e=0;

lcd_rw=0;

lcd_rs=0;

delayms(n);

lcd=com;

lcd_e=1;

delayms(n);

lcd_e=0;

}

void lcd_data(uchar date)

{

lcd_e=0;

lcd_rw=0;

lcd_rs=1;

delayms(n);

lcd=date;

lcd_e=1;

delayms(n);

lcd_e=0;

}

void lcd_str(char*s)

{

char*str;

str=s;

while(*str)

{

lcd_data(*str);

str++;

}

}

void rest_ds18b20()            //复位18b20

{

uchar delay;

ds18b20_io=1;

ds18b20_io=0;

delay=250;

while(delay--);

ds18b20_io=1;

delay=15;

while(delay--);

}

void acs_18b20()

{

uchar delay=15;

while(ds18b20_io);

while(!(ds18b20_io));

while(delay--);

}

//发送

void write (uchar date)

{

uchar i=0,delay=30;

for(;i<8;i++)

{

ds18b20_io=0;

_nop_();

_nop_();

if(date&0x01)

{

ds18b20_io=1;

while(delay--);

}

else 

{

ds18b20_io=0;

while(delay--);

ds18b20_io=1;

_nop_();

_nop_();

}

date>>=1;

}

}

//接受

uchar read_ds18b20()

{

uchar date=0,delay=8,i=0;

for(;i<8;i++)

{

date>>=1;

ds18b20_io=0;

_nop_();

ds18b20_io=1;

while(delay--);

if(ds18b20_io) date|=0x80;

delay=30;

while(delay--);

}

return date;

}

//启动温度转换

void  convert_ds18b20(void)

{

rest_ds18b20();

acs_18b20();

write(0xcc);

write(0x44);

}

//读取温度

void read_te()

{

uchar temper_low,temper_hig;

uchar delay=250;

rest_ds18b20();

acs_18b20();

while(delay--);

delay=250;

while(delay--);

write(0xcc);

write(0xbe);

temper_low=read_ds18b20();//读取温度低字节

temper_hig=read_ds18b20();//读取温度高字节

temper=((temper_low>>4)|(temper_hig<<4));

}

void main()

{

char*str1="2011-5-28";

char*str2="temper:";

char*str3="'C";

lcd_com(0x38);

lcd_com(0x0c);

lcd_com(0x06);

lcd_com(0x01);

lcd_com(0x80+0x03);

lcd_str(str1);

lcd_com(0x80+0x40);

lcd_str(str2);

while(1)

{

read_te();

lcd_com(0x80+0x40+0x07);

lcd_data(table[temper/100]);

lcd_data(table[temper/10%10]);

lcd_data(table[temper%10]);

lcd_str(str3);

delayms(500);

}

}

二,图

温馨提示:答案为网友推荐,仅供参考
相似回答