⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tempereture.c

📁 单片机控制温度显示阅读您的文件包然后写出其具体功能
💻 C
字号:
#include <reg52.h>
sbit DS1820_DQ= P0^0;
sbit  P0_1=P0^1;
bit ds1820_reset();
void ds1820_write_data(unsigned char ds1820_wdat);
unsigned char ds1820_read_data();
unsigned char data temperature[2]; //将温度存储在低128RAM单元

void read_temp()
{
 unsigned char i;
 ds1820_reset();    //复位
 ds1820_write_data(0xcc); //跳过ROM命令
 ds1820_write_data(0x44); //温度转换命令
 ds1820_reset();    //复位
 ds1820_write_data(0xcc); //跳过ROM命令
 ds1820_write_data(0xbe); //读DS1820温度暂存器命令
 for (i=0;i<2;i++)
  {
 temperature[i]=ds1820_read_data();
 }
 ds1820_reset();    //复位,结束读数据
 }

bit ds1820_reset()
{
 unsigned char i;
 bit flag;    //DS1820存在标志位
 DS1820_DQ = 0;  //拉低总线
 for (i=240;i>0;i--);//延时480微秒,产生复位脉冲
 DS1820_DQ = 1;  //释放总线
 for (i=40;i>0;i--); //延时80微秒对总线采样
 flag =  DS1820_DQ;
 for (i=200;i>0;i--); //延时400微秒等待总线恢复
 return (flag);  //根据flag的值可以知道DS1820是否存在或损坏
}     //可以加声音告警提示DS1820故障


void ds1820_write_data(unsigned char ds1820_wdat)
{
 unsigned char i,j;
 for (i=8;i>0;i--)
  {
  DS1820_DQ = 0;  //拉低总线,产生写信号
  for (j=2;j>0;j--); //延时4us
  DS1820_DQ = ds1820_wdat&0x01; //发送1位
  for (j=30;j>0;j--); //延时60us,写时序至少要60us
  DS1820_DQ = 1;  //释放总线,等待总线恢复
  ds1820_wdat>>=1; //准备下一位数据的传送
 }
}


unsigned char ds1820_read_data()
{
 unsigned char i,j,ds1820_rdat;
 for (i=8;i>0;i--)
  {
  ds1820_rdat>>=1;
  DS1820_DQ = 0;   //拉低总线,产生读信号
  for (j=2;j>0;j--); //延时4us
   DS1820_DQ = 1; //释放总线,准备读数据
  for (j=4;j>0;j--); //延时8微秒读数据
   if (DS1820_DQ == 1)
    ds1820_rdat |= 0x80;
  for (j=30;j>0;j--); //延时60us
  DS1820_DQ = 1;  //拉高总线,准备下一位数据的读取.
 }
 return (ds1820_rdat);//返回读到的数据
}


void main()
{
unsigned char s,t,wendu,bai,shi,ge,fen,li,hao,si;      
unsigned char display[]={0xc0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
unsigned int i,TempDec;

while(1)
{
read_temp();


s= temperature[1]<<4;  //取高字节低4位(温度读数高4位)
t = temperature[0]>>4; //取低字节高4位(温度读数低4位)
wendu=s|t; //组合成完整数据(整数部分)


if((wendu>200)&&(temperature[1]&0xf0==0xf0))
{  P1=0xfe;
   P2=display[10];
   for(i=0;i<300;i++);
   
  
 //求补取反加1,判断低8位是否有进位
  if (temperature[0]==0)
   { //有进位,高8位取反加1
     temperature[0]=~temperature[0]+1;
    temperature[1]=~temperature[1]+1;
   }
  else
   { //没进位,高8位不加1
    temperature[0]=~temperature[0]+1;
    temperature[1]=~temperature[1];
   }		
 }
	

s= temperature[1]<<4;  //取高字节低4位(温度读数高4位)
t = temperature[0]>>4; //取低字节高4位(温度读数低4位)
wendu=s|t;         //组合成完整数据(整数部分)

if(wendu>=30)
P0_1=0;				  //报警

bai=wendu/100;
shi=wendu%100/10;
ge=wendu%10;
TempDec = (temperature[0]&0x0f)*625;//小数部分,扩大1万倍
fen=TempDec/1000;
li=TempDec%1000/100;
hao=TempDec%100/10;
si=TempDec%10;




P1=0xfd;
P2=display[bai];
 for(i=0;i<400;i++);

P1= 0xfb;
P2=display[shi];
 for(i=0;i<400;i++);

P1= 0xf7;
P2=display[ge]&0x7f;
 for(i=0;i<400;i++);

P1= 0xef;
P2=display[fen];
 for(i=0;i<400;i++);

P1= 0xdf;
P2=display[li];
 for(i=0;i<400;i++);

P1= 0xbf;
P2=display[hao];
for(i=0;i<400;i++);

P1= 0x7f;
P2=display[si];
//for(i=0;i<250;i++);

}


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -