📄 1820.c
字号:
/////////////////////////////////////////////////////////////
// 文件:DS18B20.C //
// 环境:编译为ICC AVR6.31A,仿真为AVR Studio4.12sp4 //
// 硬件:ATMEGA16芯片 //
// 日期:2007年5月28日 //
// 功能:读取18B20温度,在数码管显示 //
// 备注: //
/////////////////////////////////////////////////////////////
#include <iom16v.h> //包含单片机型号头文件
#include <macros.h> //包含"位"操作头文件
#include "delay.h" //包含延时头文件
#include "AVR_XQV12.h" //包含通用函数及宏定义头文件
#include "lcd.h"
/*******************************************************/
/****** 函数名称: init_1820() ******/
/****** 功 能: 复位18B20 ******/
/****** 参 数: 无 ******/
/****** 返回值 : 无 ******/
/*******************************************************/
void init_1820(void)
{
ddrt|=D0; //设置端口输出
port|=D0; //输出一个脉冲
port&=~D0;
delay_nus(500); //延时480us以上
port|=D0; //输出一个脉冲
ddrt&=~D0;
delay_nus(30); //15~60us
while(pin&D0); //等待应答
ddrt|=D0; //设置输出
port|=D0; //输出高电平
delay_nus(80); //60~240us
}
/*******************************************************/
/****** 函数名称: write_1820() ******/
/****** 功 能: 写18B20 ******/
/****** 参 数: x--要写的数据 ******/
/****** 返回值 : 无 ******/
/*******************************************************/
void write_1820(unsigned char x)
{
unsigned char m;
for(m=0;m<8;m++)
{
port&=~D0; //写数据,从低位开始
if(x&(1<<m)) //判断数据极性
port|=D0;
else
port&=~D0;
delay_nus(30); //延时15~60us
port|=D0;
}
port|=D0; //结束写数据,置高总线
}
/*******************************************************/
/****** 函数名称: read_1820() ******/
/****** 功 能: 读18B20 ******/
/****** 参 数: 无 ******/
/****** 返回值 : 读取的数据 ******/
/*******************************************************/
unsigned char read_1820(void)
{
unsigned char temp=0,k,n;
for(n=0;n<8;n++)
{
port&=~D0; //输出一个起始脉冲
port|=D0;
ddrt&=~D0; //设端口为输入
k=(pin&D0); //读数据,从低位开始
if(k) //判断数据极性
temp|=(1<<n);
else
temp&=~(1<<n);
delay_nus(50); //延时60~120us
ddrt|=D0; //设端口为输出
}
return (temp); //返回读出的数据
}
/*******************************************************/
/****** 函数名称: Read_1820_temprter() ******/
/****** 功 能: 读取18B20温度 ******/
/****** 参 数: 无 ******/
/****** 返回值 : 读取的温度数据 ******/
/*******************************************************/
unsigned int Read_1820_temprter(void)
{
unsigned int count;
unsigned char temh,teml;
init_1820(); //复位18b20
write_1820(0xcc); //发出转换命令
write_1820(0x44);
delay_nus(400);
init_1820();
write_1820(0xcc); //发出读命令
write_1820(0xbe);
teml=read_1820(); //读数据
temh=read_1820();
count=(temh*256+teml)*6.25; //计算具体温度
return count; //返回温度数据
}
/*******************************************************/
/****** 函数名称: main() ******/
/****** 功 能: 读取18B20温度,在数码管显示 ******/
/****** 参 数: 无 ******/
/****** 返回值 : 无 ******/
/*******************************************************/
void main(void)
{unsigned int tem;
CPU_Init(); //初始化单片机
while(1) //无限循环
{
temprter=Read_1820_temprter(); //读取温度
Lcd_INT(); //初始化液晶屏
lcd_clear(); //清屏
lcd_write2(2,1,temprter%10000/1000); //显示温度的十位
lcd_write2(2,2,temprter%10000%1000/100); //显示温度的个位
LCD_Write_string(2,3,".");
//lcd_write2(2,4,5);
lcd_write2(2,4,temprter%10000%1000%100/10); //显示小数点后一位
lcd_write2(2,5,temprter%10000%1000%100%10); //显示小数点后两位
delay_nms(500);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -