📄 dingao.c
字号:
/**********************************************8
此程序在单片机开发板上调试通过
晶振:11.0592M
**********************************************/
#include "reg51.h"
#include "absacc.h"
#include "intrins.h"
#define uchar unsigned char
#define Uint unsigned int
uchar code duanma[]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0,0x60,0x25,0x3c,0x23,0x34,0x74,0xff,0xd7,0x61,0x70,0xdf,0x27};
uchar code key_code[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b};
uchar code ksp[4]={0xef,0xdf,0xbf,0x7f};
sbit DQ=P1^0; //数据线
bit S; //符号位
uchar buff[4]={0,0,0,0};
unsigned char tempL=0;//底8位暂存器读取
unsigned char tempH=0;//高8位暂存器读取
/***************************************************************************************************************/
/********************************************Ds18b20延时函数****************************************************/
void delay(unsigned int k)
{
unsigned int i=0;
for(i=0;i<k;i++);
return;
}
/***************************************************************************************************************/
/*********************************************Ds18b20初始化*****************************************************/
void Start()
{
DQ=1;
delay(5);
DQ=0;
delay(70);
DQ=1;
while(DQ);
delay(14);
}
/***************************************************************************************************************/
/**********************************************Ds18b20写函数****************************************************/
WriteOne(unsigned char dat)
{
unsigned char i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(6);
DQ=1;
dat>>=1;
delay(4);
}
delay(4);
}
/***************************************************************************************************************/
/**********************************************Ds18b20读函数****************************************************/
ReadOne()
{
unsigned char i=0;
unsigned char dat=0;
for(i=8;i>0;i--)
{
DQ=1;
delay(1);
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
/************************************************点阵显示*******************************************************/
Display( )
{ uchar i;
for(i=0;i<4;i++)
{
//if(i==0)
if(i==2)
{P0=(duanma[buff[i]]%0xdf);}
else
{P0=duanma[buff[i]];}
P2=ksp[i];
delay(500);
P2=0xff;
}
}
/*************************************************主函数********************************************************/
void readtemperature()
{
unsigned int tmp; //测量温度
unsigned char Signed; //判断符号
Start(); //初始化
//Display(tmp);
WriteOne(0xcc); //跳过读序列号的操作
WriteOne(0x44); //启动温度转换
//Display(tmp);
delay(125); //延时
Start(); //初始化
//Display(tmp);
WriteOne(0xcc); //跳过读序列
WriteOne(0xbe); //读暂存存储器
//Display(tmp);
tempL=ReadOne(); //读出温度的低
tempH=ReadOne(); //读出温度的高
Signed=tempH&0xf8; //判断温度正负
if(Signed==0x00) //判断为正
{
S=0;
tmp=((tempH*256)+tempL)*0.0625;
Display();
}
else //判断为负
{
S=1;
tmp=~((tempH<<4)|(tempL>>4))+1;
}
buff[0]=tmp/100;
buff[1]=tmp%100/10;
buff[2]=tmp%10;
buff[3]=tmp/10;;
}
display();
void main()
{
while(1)
{
readtemperature();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -