求基于AT89C51单片机和DS18B20温度传感器、LCD1602液晶显示的高精度数字温度计程序,用C语言编程。

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-07-04
用AT89c51与DS18B20做数字温度计proteus怎么连接仿真图和C语言编程?

1、PROTEUS安装好后,默认不会在桌面上产生快捷方式。先打开开始菜单,依次点击“程序、Proteus 7 Professional、ISIS 7 Professional”打开PROTEUS。

2、单击图中的P,添加单片机等元件。

3、用关键字搜索,89C51,再加几个LED,因为是仿真就不用加限流电阻和晶振复位的元件了。

4、把元件排列放好,再放一个电源。

5、连好导线,只要把鼠标放在管脚上就会自动变成连线图标,十分方便。

6、右键点击单片机,在菜单中选择“EDIT PROPERTIES”。

7、点选图中红框,然后选中要装载的HEX文件。

8、在编译器KEIL中写程序,然后编译成HEX文件。

9、点左下角的三角形开始按钮,可以看到仿真结果。

/***********ds18b20子程序*************************/

/***********ds18b20延迟子函数(晶振12MHz )*******/
#include
sbit DQ=P1^2;
#define uchar unsigned char

void delay_18B20(unsigned int i)
{
while(i--);
}

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

void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
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)
{
uchar i=0;
uchar 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(uchar dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(5);
DQ = 1;
dat>>=1;
}
}

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

ReadTemp(void)
{float val;
uchar temp_value,value;
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(); //读取温度值高位
temp_value=b<<4;
temp_value+=(a&0xf0)>>4;
value=a&0x0f;
val=temp_value+value;
return(val);

}
以上是DS18B20的驱动程序。然后在主程序中直接调用函数就可以了。
以上是在主程序中的调用,你看关于温度的那个就可以。
#include "reg51.h"
#include "18b20.h"
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="Welcome To" ;//初始化日期和星期
uchar code table1[]="Our System!";//初始化时间

uchar code table2[]="Temperature is:";//初始化时间

//以下三个是定义LCD的引脚
sbit lcden=P2^2;
sbit lcdwrite=P2^1;
sbit lcdrs=P2^0;

char wendu;

//延时程序
void delay(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;
delay(5);
lcden=1;
delay(5);
lcden=0;
}

//lcd的写数据
void write_data(uchar da)
{ lcdrs=1;
lcden=0;
P0=da;
delay(5);
lcden=1;
delay(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的显示内容

write_com(0x80);
for (num=0;num<10;num++)
{
write_data(table[num]);
delay(5);
}

write_com(0x80+0x40);

for (num=0;num<11;num++)
{
write_data(table1[num]);
delay(5);
}

}

void write_wendu(uchar add, char da)
{
uchar shi,ge;
shi=da/10;
ge=da%10;
write_com(0x80+0x40+add);
write_data(0x30+shi);
write_data(0x30+ge);
}

//主函数
void main ()
{

uchar num;

init();
delay(2000);

delay(2000);
delay(2000);

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

while(1)
{

write_com(0x80);
for (num=0;num<15;num++)
{
write_data(table2[num]);
delay(5);
}

wendu = ReadTemp( );
write_wendu(2,wendu);
}
}

您可参考如下例程,DS18B20与申矽凌微电子的CT1820一样,都是单总线通讯的结构,但CT1820的读取速度要比之快20倍。
uchar CT1820Init()

{

uchar i;

DSPORT =
0;
//将总线拉低480us~960us

delay600us();
//450us to 700us

DSPORT =
1;
//然后拉高总线,如果CT1820做出反应会将在15us~60us后总线拉低

i = 0; //

while(DSPORT) //等待CT1820拉低总线

{

delay500us();

i++;

if(i>1)//等待>5MS, set 2 = 2.48ms

{

return 0;//初始化失败

}

}

return 1;//初始化成功

}

你好!程序完成了吗

高精度?什么意思?

  • 基于AT89C51 单片机数字时钟如何设计?
    答:让我们深入探讨一项基于AT89C51单片机的创新设计——一个直观、易于操作的数字时钟,它由51单片机、8位共阴数码管和独立按键巧妙结合而成。这款时钟不仅仅是一个计时工具,它具备独特的功能和交互体验。功能展示 这款时钟的核心功能包括:实时显示: 51单片机通过精确计算,驱动数码管以“时-分-秒”的格式实...
  • 以AT89C51单片机和DS18B20实现温度检测显示并报警的程序和电路图,显示...
    答:RS BIT P1.7 ;LCD1602控制线定义 RW BIT P1.6 E BIT P1.5 SkipDs18b20 EQU 0CCH ;DS18B20跳过ROM命令 StartDs18b20 EQU 44H ;DS18B20温度变换命令 ReadDs EQU 0BEH ;DS18B20读暂存器命令 ORG 0000H SJMP MAIN ORG 0040H MAIN:MOV SP,#60...
  • 利用AT89C51单片机,LM016L液晶显示、时钟芯片DS1302芯片制作电子钟,需 ...
    答:秒的产生void timer0() interrupt 1{ TH0=0x4C; //Timer0 置10ms 定时初值dc00H(2^16=65536D,dc00H=56320D) TL0=0x00; //定时时间=(65536-56320)*(1/11.0592)*12=10ms (f0=11.0592Mhz) sec20++; if(sec
  • 基于AT89C51单片机和DS18B20温度传感器、LCD1602液晶显示的高精度数字温...
    答:TEMPER_L EQU 36H ;从DS18B20中读回高位,低位暂存区 TEMPER_H EQU 35H ;TEMPER_NUM EQU 60H;温度值存储 TEMPER_GE EQU 61H TEMPER_SHI EQU 62H TEMPER_SAVE EQU 63H FLAG1 BIT 00H FLAG2 BIT 01H RS BIT p2.0;液晶控制接口 RW BIT p2.1 E BIT p2....
  • 你那有基于AT89C51单片机和DS18B20温度传感器程序么
    答:/*初始化ds1820 *//* *//***/Init_DS18B20(void){ DQ = 1; //DQ复位 Delay(8); //稍做延时 DQ = 0; //单片机将DQ拉低 Delay(90); //精确延时大于480us DQ = 1; //拉高总线 Delay(8); presence = DQ; //如果=0则初始化成功 =1则初始化失败 Delay(100); DQ = 1; return(prese...
  • 基于AT89C51单片机和DS18B20温度传感器、LCD1602液晶显示的高精度数字温...
    答: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){ uchar i=0;uchar...
  • 求用AT89C51单片机和DS18B20做温度报警器,报警器用蜂鸣器,温度显示用...
    答:Ds_Reset() //初始化 { DQ=1;_nop_();_nop_();DQ=0;delay_50us(10); //延时513us DQ=1;delay_2us(23);//延时53us flag=DQ;delay_50us(4);//延时200us DQ=1;//拉伸至高电平 return(flag);} Ds_Read() //读函数 { uint i;uchar dat=0x00;for(i=0;i<8;i++...
  • 基于AT89C51的单片机C语言设计
    答:init()//初始化函数{ TMOD=0x01;TH0=(65536-1000)/256;TL0=(65536-1000)%256;EA=1; ET0=1;}u8 count=0;//计数 sbit k1=P1^0;sbit k2=P1^1;void key(){static u8 ms;if((k1&k2)==0){//检测到0if(ms<10)ms++;...
  • 求一个基于AT89C51单片机的数字时钟程序,显示时、分、秒不要求闹钟!就...
    答:TMOD = 0x11;// 定时器0, 1工作模式1, 16位定时方式 TH1 = 0xdc;TL1 = 0;TH0 = 0xFC;TL0 = 0x17;hour = 12;min = 00;sec = 00;sec100 = 0;dis_buf[0] = dis_code[hour / 10];// 时十位 dis_buf[1] = dis_code[hour % 10];// 时个位 dis_buf[3] = dis_code...
  • 求一份基于AT89C51单片机课程设计音乐盒,程序是C语言写的,不是汇编...
    答:求一份基于AT89C51单片机课程设计音乐盒,程序是C语言写的,不是汇编。在数码管上显示四首歌的序号,1~4。 10 有四个按键分别是上一首下一首暂停播放。... 有四个按键 分别是上一首 下一首 暂停 播放。 展开  我来答 1个回答 #热议# 电视剧《王牌部队》有哪些槽点?紫夜心语0303 2013-05-23 ...