求基于AT89C51单片机和DS18B20温度传感器、LCD1602液晶显示的高精度数字温度计程序,用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);
}
}
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单片机的创新设计——一个直观、易于操作的数字时钟,它由51单片机、8位共阴数码管和独立按键巧妙结合而成。这款时钟不仅仅是一个计时工具,它具备独特的功能和交互体验。功能展示 这款时钟的核心功能包括:实时显示: 51单片机通过精确计算,驱动数码管以“时-分-秒”的格式实...
答: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...
答:秒的产生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
答: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....
答:/*初始化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...
答: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...
答: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++...
答: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++;...
答: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语言写的,不是汇编。在数码管上显示四首歌的序号,1~4。 10 有四个按键分别是上一首下一首暂停播放。... 有四个按键 分别是上一首 下一首 暂停 播放。 展开 我来答 1个回答 #热议# 电视剧《王牌部队》有哪些槽点?紫夜心语0303 2013-05-23 ...