用C语言制作基于单片机的数字温度计设计的原理图好程序 51单片机

2024-11-02 11:39:03
推荐回答(4个)
回答1:

18b20.h的原程序


#define uchar unsigned char


sbit DQ=P1^2;

unsigned int temp2;

unsigned int temp;

unsigned temp1;

int xs;

int total;


void delay_18B20(unsigned int i)

{

while(i--);

}

/**********ds18b20初始化函数**********************/

void delay(unsigned int i)//延时 1ms 子程序

{

unsigned char j;

while(i--)

{

for(j=0;j<125;j++);

}   

}


void Init_DS18B20(void) 

{

unsigned char x=0;

DQ = 1;          //DQ复位 ds18b20通信端口 

delay_18B20(8); //稍做延时

DQ = 0;          //单片机将DQ拉低

delay_18B20(80); //精确延时 大于 480us

DQ = 1;          //拉高总线

delay_18B20(4);

x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

delay_18B20(20);

}

/***********ds18b20读一个字节**************/

unsigned char ReadOneChar(void)

{unsigned char i=0;

unsigned char dat = 0;

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

{

DQ = 0; // 高电平拉成低电平时读周期开始

dat>>=1;

DQ = 1; // 给脉冲信号

if(DQ)

dat|=0x80;   // 

delay_18B20(4);

}

return(dat);

}

/*************ds18b20写一个字节****************/

void WriteOneChar(unsigned char dat)

{

unsigned char i=0;

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

{

DQ = 0; //从高电平拉至低电平时,写周期的开始

DQ = dat&0x01;   //数据的最低位先写入

delay_18B20(5); //60us到120us延时

DQ = 1;        

dat>>=1; //从最低位到最高位传入

}

}

/**************读取ds18b20当前温度************/

void ReadTemperature(void)

{

unsigned char a=0;

unsigned char b=0;

unsigned char t=0;


Init_DS18B20();

WriteOneChar(0xCC);    // 跳过读序号列号的操作

WriteOneChar(0x44); // 启动温度转换

delay_18B20(100);       // this message is wery important

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作

WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

delay_18B20(100);

a=ReadOneChar();    //读取温度值低位

b=ReadOneChar();      //读取温度值高位

temp1=b<<4;            //高8位中后三位数的值

temp1+=(a&0xf0)>>4;      //低8位中的高4位值加上高8位中后三位数的值   temp1室温整数值

temp2=a&0x0f;             //小数的值

temp=((b*256+a)>>4);    //当前采集温度值除16得 实际温度值

xs=temp2*0.0625*10; //小数位,若为0.5则算为5来显示   xs小数

total=temp*10+xs;

}


主函数的程序main.c

#include "reg51.h"

#include "18b20.h"

#define uchar unsigned char

#define uint unsigned int

uchar code table[]="Wendu is:" ;//初始化日期和星期


//以下三个是定义LCD的引脚

sbit lcden=P2^2; 

sbit lcdwrite=P2^1; 

sbit lcdrs=P2^0;


//延时程序

void delay1(uint z)

{   uint x,y; 

for(x=z;x>0;x--) 

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

}


//lcd的写指令

void write_com(uchar com)

lcdrs=0; 

lcden=0; 

P0=com; 

delay1(5); 

lcden=1; 

delay1(5);

lcden=0;


//lcd的写数据

void write_data(uchar da)

{   lcdrs=1;

lcden=0;

P0=da;

delay1(5);

lcden=1;

delay1(5);

lcden=0;


//初始化

void init()

{

uchar num;

lcdwrite=0;

lcden=0;

write_com(0x38); //16*2显示,5*7点阵,8位数据

write_com(0x0c);//显示开,关光标

write_com(0x06); //移动光标

write_com(0x01);//清除LCD的显示内容

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

{  

write_data(table[num]);

delay(5); 

}

write_com(0x80+0x40);


TMOD=0x01;

TL0=(65536-50000)%256;//定时50ms

TH0=(65536-50000)/256;

EA=1;

ET0=1;

TR0=1; 

}


void write_wendu(uchar add, char da,char da1)

{   

uchar shi,ge;

shi=da/10;

ge=da%10;

write_com(0x80+add);

write_data(0x30+shi);

write_data(0x30+ge);

write_data('.'); 

write_data(0x30+da1); 

write_data(0xdf); 

write_data('C'); 

}


//主函数

void main ()

init(); 

while(1);

}


//中断定时

void timer0() interrupt 1

{   

TL0=(65536-50000)%256;//定时50ms

TH0=(65536-50000)/256;

ReadTemperature();  

write_wendu(10,temp,xs);

}

回答2:

于单片机的数字温度计设计的原理图好程序 51单片机
这个肯定比较多分析

回答3:

可以给你完成的

回答4:

亲,帮助你来,擅长