📄 18b20.txt
字号:
//**************************************************//
//函 数 功 能: 18B20温度读取
//函数输入参数: PB0 数据输入连接18B20 t温度数据输出
//CPU芯片类型: ATMEGA16 时钟:8M
//编译器版本: ICCAVR 6.31
//创建人: 宁坤
//创建日期: 2006-8-5
//HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH//
#include<iom16v.h> //包含定义ATmega16寄存器的头文件
#include<macros.h> //包含一些常用的宏定义
#define LCD_EN_PORT PORTA
#define LCD_RW_PORT PORTA
#define LCD_RS_PORT PORTA
#define LCD_DATA_PORT PORTA
#define LCD_DATA_DDR DDRA
#define LCD_DATA_PIN PINA
#define LCD_EN (1<<PA2) //portc5 out
#define LCD_RW (1<<PA1) //portd3 out/in
#define LCD_RS (1<<PA0) //portc4 out
#define LCD_DATA ((1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7)) //portd4/5/6/7 out
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
void delay(int i) //定时程序 1.5us左右
{
while(i>=0)
{i--;}
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//复位程序
int reset()
{
int test=0; //定义返回值 0成功 1失败
DDRB=0XFF; //设置数据线口为输出状态
PORTB=0xfe; //拉低总线 准备复位
delay(450); //延时600us
PORTB=0xff; //释放总线
delay(40); //等待60us 准备接受器件存在信号
DDRB=0x00; //数据口设置为输入
test=PINB; //接收器件返回的复位信号
delay(400); //等待480us完成复位
test&=0x01; //处理返回信号成一位数据
DDRB=0XFF; //数据口设置为输出
PORTB=0XFF; //输出高电平 释放总线
return test;
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//写一比特
void write(int bit)
{int i=8; //循环8次写一字节
for(i=8;i>0;i--)
{DDRB=0XFF; //设置为输出
PORTB=0X00; //拉低总线 开始准备写数据
delay(3); //等待4us
PORTB=0XFF; //释放总线
delay(10); //延时15us
PORTB=bit&0x01; //写数据
delay(40); //等待60us 18B20采集数据
DDRB=0XFF; //释放总线
PORTB=0XFF;
bit=bit>>1; //数据**右移位** 先发低位
}
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//读一字节
int read(void)
{int i,temp=0,bit=0;
for(i=0;i<8;i++) //循环8次读一字节
{
DDRB=0Xff; //设置输出准备读数据
PORTB=0x00; //拉低总线 开始读时间隙
delay(2); //等待3us
PORTB=0XFF; //释放总线
delay(2); //等待3us
DDRB=0x00; //数据口设置为输入
delay(1);
temp=PINB; //接收数据
delay(40); //等待60us完成读周期
temp<<=7;
temp&=0x80; //接收数据转化为位数据
DDRB=0XFF; //释放总线
PORTB=0XFF;
bit=bit>>1; //数据**右移位,先接受高位
bit=bit|temp; //转化为并行数据
}
return bit;
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//显示程序
void led(unsigned long int BCDdata)
{
char led[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//位选缓冲区
int display[4]={0,0,0,0};//数据缓冲区***跟随显示位数变化而变化
//int ledtable[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段码列表
unsigned long int data;//临时数据
int y=100,i;//循环变量 ****Y满足18B20转换所需要的500ms**
//DDRC=0Xff; //PD口设置为段码输出
//DDRA=0Xff; //PB口设置为数据输出
//PORTC=0xff; //显示消隐
//PORTA=0xff; //显示消隐
//数据转换成十进制显示值
while(y>=0)
{
data=BCDdata;
for(i=0;i<4;i++) //刷新显示缓冲区
{
display[i]=data%10|0x30;//16位数据转10进制数据
data=data/10;
}
LCD_write_string1(8,1, display[3]); //百位数显示
LCD_write_string1(9,1, display[2]);//十位数显示
LCD_write_string1(0x0A,1, display[1]); //个位数显示
LCD_write_string1(0x0C,1, display[0]); //小数位数显示
delay(300); //延时450us
y--;
}
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
void main()
{int test=0,k=0; //复位返回 和9直接读取循环变量
int m,n,t=0; //临时数据
int da[9]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};//定义数据缓冲区
DDRA|=LCD_DATA|LCD_RW;
DDRA|=LCD_RS|LCD_EN;
LCD_init();
LCD_write_char(0x01,0); //初始化LCD
LCD_write_string(0,0," DS18B20 OK ");
LCD_write_string(0,1," TEMP: . C ");
while(1)
{
reset(); //复位
write(0xcc); //发送不提供ROM编码命令
write(0x44); //发送开始转换命令
//循环显示500ms以完成温度转换
reset(); //复位 准备读数据
write(0xcc); //发送不提供ROM编码命令
write(0xbe); //发送读数据命令
for(k=0;k<=8;k++) //循环读9个字节的数据 并存储进数据缓冲区
{
test=read();
da[k]=test; //9字节数据依次读入数据缓冲区
}
reset(); //复位 下面开始数据转换成温度值
m=da[0]; //度读温度低位数据
n=da[1]; //读温度高位数据
n=n<<8; //数据整合为16位数据
m=(m|n)*10; //数据扩大10倍,显示取一位小数点
t=m>>4;
led(t); //计算实际温度值 t为温度数据*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -