📄 18b20fen.c
字号:
#include"pic18fxx2.h"
#include"lcd.h"
#define uch unsigned char
uch dis4[16]="DIGITALVOLTMETER";
uch dis5[16]="temper .00c ";
uch t;
#define DQ RC4 //定义18B20数据端口
#define DQ_DIR TRISC4 //定义18B20D口方向寄存器
#define DQ_HIGH() DQ_DIR =1 //设置数据口为输入
#define DQ_LOW() DQ = 0; DQ_DIR = 0 //设置数据口为输出
unsigned char TLV=0 ; //采集到的温度高8位
unsigned char THV=0; //采集到的温度低8位
unsigned char TZ=0; //转换后的温度值整数部分
unsigned char TX=0; //转换后的温度值小数部分
//------------------------------------------------
//延时函数
void delay(char i)
{
while(i--);
}
//------------------------------------------------
//系统初始化函数
void init()
{
ADCON1=0X07; //设置A口为普通数字口
TRISD=0X00; //设置D口方向为输出
}
//复位DS18B20函数
reset(void)
{
char presence=1;
while(presence)
{
DQ_LOW() ; //主机拉至低电平
delay(195); //延时503us
DQ_HIGH(); //释放总线等电阻拉高总线,并保持15~60us
delay(30); //延时70us
if(DQ==1) presence=1; //没有接收到应答信号,继续复位
else presence=0; //接收到应答信号
delay(169); //延时430us
}
}
//-----------------------------------------------
//写18b20写字节函数
void write_byte(uch val)
{
uch i;
uch temp;
for(i=8;i>0;i--)
{
temp=val&0x01; //最低位移出
DQ_LOW();
;
;
;
;
; //从高拉至低电平,产生写时间隙
if(temp==1) DQ_HIGH(); //如果写1,拉高电平
delay(27); //延时63us
DQ_HIGH();
;
;
val=val>>1; //右移一位
}
}
//------------------------------------------------
//18b20读字节函数
uch read_byte(void)
{
uch i;
uch value=0; //读出温度
static bit j;
for(i=8;i>0;i--)
{
value>>=1;
DQ_LOW();
;
;
;
;
;
; //6us
DQ_HIGH(); //拉至高电平
;
;
;
;
; //4us
j=DQ;
if(j) value|=0x80;
delay(27); //63us
}
return(value);
}
//-------------------------------------------------
//启动温度转换函数
void get_temp()
{
int i;
DQ_HIGH();
reset(); //复位等待从机应答
write_byte(0XCC); //忽略ROM匹配
write_byte(0X44); //发送温度转化命令
DQ_HIGH();
reset(); //再次复位,等待从机应答
write_byte(0XCC); //忽略ROM匹配
write_byte(0XBE); //发送读温度命令
TLV=read_byte(); //读出温度低8
THV=read_byte(); //读出温度高8位
DQ_HIGH();
if(THV>0x07)
{TLV=~TLV+1;
THV=~THV;
t=1;
}
else
t=0; //释放总线
TZ=(TLV>>4)|(THV<<4); //温度整数部分
TX=TLV<<4; //温度小数部分
;
;
}
void main()//主程序
{
uchar t1,t2;
char z;
init();
ADCON1=0X0E;
INTCON=0X00;
INTCON2=0X40;
INTCON3=0X00;
TRISD=0X00;
lcd_init();
while(1)
{
get_temp();
lcd_pos(0); //设置显示位置为第一行的第1个字符
z = 0;
while(dis4[z] != '\0')
{ //显示字符"DIGITALVOLTMETER"
lcd_wdat(dis4[z]);
z++;
}
lcd_pos(0x40); //设置显示位置为第二行第1个字符
z = 0;
while(dis5[z] != '\0')
{
lcd_wdat(dis5[z]); //显示字符" VOLTAGE: . V "
z++;
}
t1=TZ/10+0x30;
t2=TZ%10+0X30;
if(t==1)
{
lcd_pos(0x46);
lcd_wdat(0x2d);
}
lcd_pos(0x47);
lcd_wdat(t1);
lcd_pos(0x48);
lcd_wdat(t2);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -