标题:
带注释的DS18B20测温单片机程序源码
[打印本页]
作者:
lxy5533533
时间:
2018-6-10 14:07
标题:
带注释的DS18B20测温单片机程序源码
单片机源程序如下:
#include<reg52.h>
#include<intrins.h>
#include <math.H>
#define uchar unsigned char
#define uint unsigned int
uchar i,L,M;
uchar datas[] = {0, 0, 0, 0, 0};
sbit ds=P2^2;
sbit RW = P3^6;
sbit RS = P3^5;
sbit EN = P3^4;
void delay(uchar us)
{
while(us--);
}
void delayMs(uint a)
{
uint i, j;
for(i = a; i > 0; i--)
for(j = 100; j > 0; j--);
}
/***LCD1602显示***/
void Read_busy()
{
uchar busy;
P0=0xff;
RS = 0;
RW=1;
do
{
EN = 1;
busy=P0;
EN=0;
}
while(P0&0x80);//0x80:10000000,判断状态字的最后一位是0还是1.如果是0,则为不忙。不忙的话,则可以跳出do....while循环
}
//读状态,将液晶的状态发回给单片机
void writeCmd(uchar cmd)//写1602命令一个字节
{
Read_busy();//判断忙
RS = 0;
RW=0;
P0 = cmd;//发送状态字
EN = 1;//数据送过去以后,1602把它读走。
EN=0;
}
//1602显示字符串函数
void Write_data(uchar date)
{
Read_busy();//判断忙不忙
RS = 1;
RW=0;
P0 = date;//把数据送到数据线上
EN = 1;
EN=0;
}
void init()
{
RW= 0;
writeCmd(0x38);
writeCmd(0x0c);
writeCmd(0x06);
writeCmd(0x01);
}
/****18B20函数****/
void Init()//DS18B20初始化
{
//uchar t;
ds=1;
_nop_();//小小的延时
ds=0;
delay(75);//拉低总线499.45us;
ds=1;
//t=ds;//把ds的值赋给i,等待ds响应,如果i为1,则传回主函数中去,及检测到了DS18B20的响应
delay(20);
ds=1;//释放总线
_nop_();
//return(t);
}
uchar read_byte()//读数据
{
uchar i,j,dat;
for(i=0;i<8;i++)
{
ds=0;
_nop_();
ds=1;//释放总线
_nop_();
j=ds;//获取数据
delay(10);
ds=1;
_nop_();
dat=(j<<7|dat>>1);//j左移7位,dat右移。一个字节便被存进去了
return(dat);
}
}
void write_byte(uchar dat)//写数据
{
uchar i;
for(i=0;i<8;i++)
{
ds=0;
_nop_();
ds=dat&0x01;//当dat最低位为1时。与上以后还是1.所以就满足时序图的要求了。
delay(10);
ds=1;//释放总线,准备下一次数据输入
_nop_();//释放总线要保持1us
dat>>=1;
}
}
void tempcod(uint t) //温度转化。。。显示温度值函数,t传递的是整形的温度值(t是传过来的温度)
{
uchar temp;
datas[0] = (temp / 10)+'0';//十位转ASCLL码
datas[1] = (temp % 10)+'0';//个位转ASCLL码
/* datas[2] = '\'';
datas[3] = 'c';
datas[4] = '0';//字符串结束符
Write_data(12,1,datas[]);//表示显示在横坐标为12,纵坐标在第二行的地方。*/
}
void display()
{
writeCmd(0x46|0x80);
Write_data(datas[0]);//显示十位
Write_data(datas[1]);//显示个位
Write_data('.');
Write_data(0xdf);
Write_data('c');
}
main()
{
writeCmd(0x38);//显示设置16*2显示
writeCmd(0x0c);//开显示
writeCmd(0x06);//地址指针加一
writeCmd(0x80);//显示的位置(地址)
writeCmd(0x01);//清屏
// Write_data(i);
//while(1);//让程序一直停在这里
while(1)
{
Init();
write_byte(0xcc);//跳过ROM指令
write_byte(0x44);//发送温度转化指令
Init();
write_byte();//读取暂存器的值
L=read_byte();//低八位
M=read_byte();//高八位
i=M;i<<=8;
i|=L;
i=i*0.0625*10+0.5;
display(i);
}
}
复制代码
作者:
魏海龙
时间:
2019-11-1 15:50
楼主 你这里面 display里怎么可以放i变量 我用你的程序 编译程序报错
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1