📄 cewen.c
字号:
#include <reg52.h> //52系列单片机定义文件
#include <absacc.h>
#include <string.h>
#include <intrins.h>
#define uchar unsigned char //定义无符号字符
#define uint unsigned int //定义无符号整数
sbit DQ =P3^2; //18B20的数据口
code char jtled[18]=
{
0x09,/*0*/
0x7D,/*1*/
0x07,/*2*/
0x15,/*3*/
0x71,/*4*/
0x91,/*5*/
0x81,/*6*/
0x3D,/*7*/
0x01,/*8*/
0x11,/*9*/
0x21,/*A*/
0xC1,/*b*/
0x8B,/*C*/
0x45,/*d*/
0x83,/*E*/
0xA3,/*F*/
// 0x0A,0x7E,0x92,0x16,0x66,0x07,0x03,0x3E,0x02,0x26,0x22,0x43,0x8B,0x52,0x83,0xA3
// 0 1 2 3 4 5 6 7 8 9 A b C d E F
};
/********************************************************************
函 数 名:Delay_Ms()
功 能:延时函数
说 明:延时几个Ms
入口参数:del: 延时量
返 回 值:无
设 计:zhouhong 日 期:2005-08-25
修 改: 日 期:
***********************************************************************/
void Delay_Ms(unsigned int del)
{
unsigned int i,j;
for(i=0;i<del;i++)
{
for(j=0;j<620;j++)
;
}
}
//模拟串口工作方式0工作
void MN_Send_Byte(uchar d)
{
SCON = 0x00;
SBUF = d;
while(TI == 0);
TI = 0;
}
/********************************************************************
函 数 名:ReadOneChar
功 能:从DS18B20读一个字节数据
说 明:主要用于读温度的值(内部函数)
入口参数:无
返 回 值:所读的数据值
设 计:鞠春 日 期:2004年11月8号
修 改:ZHOUHONG 日 期:2005-8-27 20:16
***********************************************************************/
unsigned char ReadOneChar(void)
{
unsigned char i,j,temp;
temp=0;
for(i=0;i<8;i++)
{
temp >>= 1; //右移一位
DQ=0;
_nop_(); //1~15us
_nop_();
DQ=1;
for(j=2;j>0;j--);
if(DQ==1) //读1或读0
{
temp=temp | 0x80;
}
else
{
temp=temp | 0x00;
}
for(j=2;j>0;j--);
}
return(temp);
}
/********************************************************************
void WriteOneChar(unsigned char dat)
/********************************************************************
函 数 名:ReadTemperature()
功 能:读取温度
说 明: 完成温度值的输出
入口参数:无
返 回 值:(int) t为温度值*10倍
设 计:鞠春 日 期:2004年11月8号
修 改:ZHOUHONG 日 期:2005-8-27 20:50
***********************************************************************/
/********************************************************************
函 数 名:Init_DS18B20()
功 能:初始化DS18B20函数
说 明:完成DS18B20的复位
入口参数:无
返 回 值:无
设 计:鞠春 日 期:2004年11月8号
修 改:ZHOUHONG 日 期:2005-8-27 19:54
***********************************************************************/
Init_DS18B20(void)
{
uchar i;
DQ=1;
;
DQ=0;
for(i=255;i>0;i--); //480~960us
DQ=1;
; //15~60us
while(DQ); //应答脉冲为将DQ接低
for(i=200;i>0;i--);
}
/********************************************************************
函 数 名:WriteOneChar()
功 能:写一个字节到DS18B20
说 明:写一个字节到DS18B20(内部函数)
入口参数:写入的数据值
返 回 值:无
设 计:鞠春 日 期:2004年11月8号
修 改:ZHOUHONG 日 期:2005-8-27 20:22
***********************************************************************/
void WriteOneChar(uchar command)
{
uchar i,j;
for(i=0;i<8;i++)
{
if((command & 0x01)==0)
{
DQ=0;
for(j=35;j>0;j--); //60~120us
DQ=1;
}
else
{
DQ=0;
for(j=2;j>0;j--); //<15uS
DQ=1;
for(j=33;j>0;j--); //60~120us
}
command=command>>1; //右移
}
}
int ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Delay_Ms(25); //延时大于750ms
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar(); //低位输出
b=ReadOneChar(); //高位输出
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t=(int) (tt*10+0.5); //放大10倍输出并四舍五入---此行没用
return(t);
}
//18B20温度测量
/**************************************************************
//key5---按键5执行子程序
//18B20程序,调用一次,然后静态显示的方法在数码管上显示
**************************************************************/
void main(void)
{
int i,te[8];
i=ReadTemperature();
te[2]=i%10;
i=i/10;
te[1]=(i%10);
i=i/10;
te[0]=i%10;
MN_Send_Byte(jtled[0]);
MN_Send_Byte(jtled[te[0]]);
MN_Send_Byte(jtled[te[1]]-1);
MN_Send_Byte(jtled[te[2]]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -