标题:
单片机两路测温 Keil4工程+Proteus仿真
[打印本页]
作者:
沉沤觅客
时间:
2017-6-11 11:13
标题:
单片机两路测温 Keil4工程+Proteus仿真
单片机两路测温 Keil4工程+Proteus仿真,有需要的自行下载
Proteus仿真图:
0.png
(45 KB, 下载次数: 108)
下载附件
2017-6-11 16:32 上传
0.png
(47.35 KB, 下载次数: 106)
下载附件
2017-6-11 16:32 上传
单片机源程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar i;
char csh=0;
sbit lcdrs=P2^0;
sbit lcdrw=P2^1;
sbit lcden=P2^2;
uchar code t0[]="the temperature ";
uchar code t1[]=" is ";
uchar code wendu[]="0123456789"; //利用一个温度表解决温度显示乱码
sbit DQ_1= P3^0;//定义ds18B20总线IO
sbit DQ_2= P3^1;//定义ds18B20总线IO
void delay(uint z);
void write_com(uchar com);
void write_date(unsigned char date);
void init_lcd();
void tmpDelay(int num);//延时函数
void Init_DS18B20();//初始化ds1820
unsigned char ReadOneChar_1();//读一个字节
void WriteOneChar_1(unsigned char dat);//写一个字节
unsigned int Readtemp_1();//读取温度
unsigned char ReadOneChar_2();//读一个字节
void WriteOneChar_2(unsigned char dat);//写一个字节
unsigned int Readtemp_2();//读取温度
void display();
void delay(uint z)
{
uint x,y;
for(x=100;x>1;x--)
for(y=z;y>1;y--);
}
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(unsigned char date)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init_lcd()
{
lcden=0;
lcdrw=0;
write_com(0x38);
write_com(0x01);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
for(i=0;i<16;i++)
{
write_date(t0[i]);
delay(0);
}
write_com(0x80+0x40);
for(i=0;i<16;i++)
{
write_date(t1[i]);
delay(0);
}
}
//温度采集模块
void tmpDelay(int num)//延时函数
{
while(num--) ;
}
/******************************************************************************/
void Init_DS18B20()//初始化ds1820
{
unsigned char x1=0;
unsigned char x2=0;
DQ_1 = 1; //DQ复位
tmpDelay(8); //稍做延时
DQ_1 = 0; //单片机将DQ拉低
tmpDelay(80); //精确延时 大于 480us
DQ_1 = 1; //拉高总线
tmpDelay(14);
x1=DQ_1; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
tmpDelay(20);
///////////////////////////////////////////
DQ_2 = 1; //DQ复位
tmpDelay(8); //稍做延时
DQ_2 = 0; //单片机将DQ拉低
tmpDelay(80); //精确延时 大于 480us
DQ_2 = 1; //拉高总线
tmpDelay(14);
x2=DQ_2; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
tmpDelay(20);
}
unsigned char ReadOneChar_1()//读一个字节
{
unsigned char i=0;
unsigned char dat_1 = 0;
for (i=8;i>0;i--)
{
DQ_1 = 0; // 给脉冲信号
dat_1>>=1;
DQ_1 = 1; // 给脉冲信号
if(DQ_1)
dat_1|=0x80;
tmpDelay(4);
}
return(dat_1);
}
unsigned char ReadOneChar_2()//读一个字节
{
unsigned char i=0;
unsigned char dat_2 = 0;
for (i=8;i>0;i--)
{
DQ_2 = 0; // 给脉冲信号
dat_2>>=1;
DQ_2 = 1; // 给脉冲信号
if(DQ_2)
dat_2|=0x80;
tmpDelay(4);
}
return(dat_2);
}
void WriteOneChar_1(unsigned char dat_1)//写一个字节
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ_1= 0;
DQ_1= dat_1&0x01;
tmpDelay(5);
DQ_1= 1;
dat_1>>=1;
}
}
void WriteOneChar_2(unsigned char dat_2)//写一个字节
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ_2= 0;
DQ_2= dat_2&0x01;
tmpDelay(5);
DQ_2= 1;
dat_2>>=1;
}
}
unsigned int Readtemp_1()//读取温度
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar_1(0xCC); // 跳过读序号列号的操作
WriteOneChar_1(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar_1(0xCC); //跳过读序号列号的操作
WriteOneChar_1(0xBE); //读取温度寄存器
a=ReadOneChar_1(); //连续读两个字节数据 //读低8位
b=ReadOneChar_1(); //读高8位
t=b;
t<<=8;
t=t|a; //两字节合成一个整型变量。
tt=t*0.0625; //得到真实十进制温度值,因为DS18B20可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度
t= tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。
return(t);
}
unsigned int Readtemp_2()//读取温度
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar_2(0xCC); // 跳过读序号列号的操作
WriteOneChar_2(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar_2(0xCC); //跳过读序号列号的操作
WriteOneChar_2(0xBE); //读取温度寄存器
a=ReadOneChar_2(); //连续读两个字节数据 //读低8位
b=ReadOneChar_2(); //读高8位
t=b;
t<<=8;
t=t|a; //两字节合成一个整型变量。
tt=t*0.0625; //得到真实十进制温度值,因为DS18B20可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度
t= tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。
return(t);
}
void display()
{
unsigned int num; //定义的时候用uchar宏定义就会出错
unsigned int shi,ge,xiaoshu; //这里的num,shi,ge,xiaoshu 必须用unsigned int无符号整数来表示,用unshigned char 字符型则显示错误
num=Readtemp_1();
if(csh<=8){num=0;csh++;}
shi=num/100;
ge=num/10%10;
xiaoshu=num%10;
write_com(0x80+0x40+5);
write_date(wendu[shi]);
write_com(0x80+0x40+6);
write_date(wendu[ge]);
write_com(0x80+0x40+7);
write_date(0x2e);
write_com(0x80+0x40+8);
write_date(wendu[xiaoshu]);
/////////////////////////////////////////////////////
num=Readtemp_2();
if(csh<=8){num=0;csh++;}
shi=num/100;
ge=num/10%10;
xiaoshu=num%10;
write_com(0x80+0x40+11);
write_date(wendu[shi]);
write_com(0x80+0x40+12);
write_date(wendu[ge]);
write_com(0x80+0x40+13);
write_date(0x2e);
write_com(0x80+0x40+14);
write_date(wendu[xiaoshu]);
}
复制代码
所有资料51hei提供下载:
单片机,两路测温.rar
(71.52 KB, 下载次数: 32)
2017-6-11 11:12 上传
点击文件名下载附件
单片机两路测温 Keil4工程+Proteus仿真
下载积分: 黑币 -5
作者:
阿九阿九
时间:
2020-3-19 15:48
有器件名单吗
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1