主函数
四极管: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。