主函数
四极管:MAIN.C
#include<avr/io.h>
#include<util/delay.h>
#include<MyBit.h>
#include<1602driver.c>
#include<18b20.c>
unsigned long temperature;
unsigned long temp_2;
const unsigned char temp_1[]="0123456789";
void main(void)
{
Init_1602();
Displaypstr(0,1,"18B20--LCD1602--");
unsigned char th,tl;
while(1)
{
temperature = Read_18b20();
th = ((((temperature&0xff00)>>8)&0x07)<<4)|((temperature&0x00f0)>>4);
tl = (temperature&0x000f)*6.25;
Displaychar(0,0,temp_1[th/10%10]);
Displaychar(1,0,temp_1[th%10]);
Displaychar(2,0,'.');
Displaychar(3,0,temp_1[tl/10%10]);
Displaychar(4,0,temp_1[tl%10]);
}
}
//这种方法有问题,有时间再回来看看~~~~~~
/*
temp_2 = temperature*0.0625*10000; //不要直接乘625,否则数据可能溢出
//temp_2 =1234567;
Displaychar(8,0,temp_1[temp_2%10]);
//if(temp_2>=10)
Displaychar(7,0,temp_1[temp_2/10%10]);
//if(temp_2>=100)
Displaychar(6,0,temp_1[temp_2/100%10]);
//if(temp_2>=1000)
Displaychar(5,0,temp_1[temp_2/1000%10]);
Displaychar(4,0,'.');
//if(temp_2>=10000)
Displaychar(3,0,temp_1[temp_2/10000%10]);
//if(temp_2>=100000)
Displaychar(2,0,temp_1[temp_2/100000%10]);
//if(temp_2>=1000000)
Displaychar(1,0,temp_1[temp_2/1000000%10]);
//if(temp_2>=10000000)
Displaychar(0,0,temp_1[temp_2/10000000%10]);
*/
/* //=Read_18b20();
// Read_DS18B20();
Displaychar(0,0,Data[temp_int/10]);
Displaychar(1,0,Data[temp_int%10]);
Displaychar(2,0,'.');
Displaychar(3,0,Data[temp_point/10]);
Displaychar(4,0,Data[temp_point%10]);
Displaychar(6,0,'5');
*/
温度芯片,单总线写法···在公司的时候被领导问 单总线一共可以挂多少个18B20,惭愧了,答不上来
/***********************************
函数功能:DB18B20
函数说明:
使用环境: 硬件: MCU: ATmega32L
F_CPU = 16000000
外部:16000000
接线方法:DQ-PD7
编译环境:WinAVR-20080610
显示说明:
包含文件 :#include<MyBit.h>
#include<util/delay.h>
作者:杨琦
日期:2009年7月17日
修改者: (日期: )
************************************************/
//端口预定义
#define DDR_DQ RD7
#define PIN_DQ ID7
#define POR_DQ OD7
unsigned long temp_l,temp_h;
/*********************************************************
* 名称nit_DS18B20(void)
* 说明:18B20初始化
* 功能:18B20初始化
* 调用_delay_us(); //此处1us约为1.24us
* 输入:K----16位
* 全局变量:NULL
* 返回值:无
********************************************************/
void Init_DS18B20(void)
{
while(1)
{
unsigned char flag=0;
DDR_DQ=1; //设置为输出
POR_DQ=0; //低电平
_delay_us(564); //主机发出复位低电平480us~960us
POR_DQ=1; //释放总线
_delay_us(4); //等待回应-大概60us-240us后
DDR_DQ=0; //设置为输入
_delay_us(200);
DDR_DQ=1;
POR_DQ=1;
_delay_us(260);
break;
}
}
/*********************************************************
* 名称:read_18b20(void)
* 说明:读一个字节
* 功能:读一个字节
* 调用_delay_us(); //此处1us约为1.24us
* 输入:无
* 全局变量:NULL
* 返回值:unsigned char 8位
********************************************************/
unsigned char read_18b20(void)
{
unsigned char i=8,dat=0;
DDR_DQ=0; //设置为输出
POR_DQ=1; //拉高
for(;i>0;i--)
{
dat>>=1;
POR_DQ=0; //低电平开始
_delay_us(3); //延时1us~15us 5us
POR_DQ=1; //释放总线
DDR_DQ=0; //设置为输入
_delay_us(4); //等待温度芯片发送数据
if(PIN_DQ)dat|=0x80; //读取数据
_delay_us(81); //延迟一段时间60~120us
DDR_DQ=1; //设置为输入
POR_DQ=1;
}
return(dat);
}
/*********************************************************
* 名称:write_data(unsigned char dat)
* 说明:写一个字节
* 功能:写一个字节
* 调用_delay_us(); //此处1us约为1.24us
* 输入:unsigned char dat //8位
* 全局变量:NULL
* 返回值:无
********************************************************/
void write_data(unsigned char dat)
{
unsigned char i=8;
DDR_DQ=1; //设置为输出
POR_DQ=1;
for(;i>0;i--)
{
POR_DQ=0; //低电平开始
_delay_us(3); //延时1us~15us 8us
POR_DQ=dat&1;
_delay_us(81); //延迟一段时间给温度芯片采样数据60-120us
POR_DQ=1; //释放总线
dat>>=1; //下一位
}
}
/*********************************************************
* 名称:Read_18b20(void)
* 说明:读温度子程序
* 功能:写一个字节
* 调用write_data();
* 输入:无
* 全局变量:无
* 返回值:int
********************************************************/
int Read_18b20(void)
{ //TEMP_H=4;
int t = 0;
Init_DS18B20(); //复位
write_data(0xCC); //跳过ROM匹配
write_data(0x44); //启动温度转换
//_delay_us(300); //延迟一段时间
Init_DS18B20(); //复位
write_data(0xCC); //跳过ROM匹配
write_data(0xBE); //发出读温度指令
temp_l=read_18b20(); //温度值低位字节(其中低4位为二进制的“小数”部分)
temp_h=read_18b20(); // 高位值高位字节(其中高5位为符号位)
// temp_int=((temp_h<<4)&0xF0)|((temp_l>>4)&0x0f);//整数部分
// temp_point=(temp_l&0x0f)*6.25*100;//小数部分
t =temp_h;
t <<= 8;
t |= temp_l;
return(t);
}
显示和定义文件在上一篇文章中有,就不在列出来了·
转载请注明出处。作者:四极管。广西师范大学 电子工程学院大学生科技创新基地 邮箱: yangxingbo-0311@163.com。