2019-03-24 21:13发布
本信息来自合作QQ群:电子工程师技术交流(12425841) 群主在坛子ID:Kata
#include <avr/io.h>#include <avr/wdt.h>#include "main.h"#include "ds18b20.h"#include <avr/delay.h> uint8 const led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x88,0xf8,0x80,0x90,0x80};//0, 1, 2 3 4 5 6 7 8 9 ./**********************************************IO口初始化**********************************************/void Iint_io(void){DDRD|=0XFF; /550-PD7,LED输出,IO口为输出状态.PORTD&=0X00; //关闭PD0-PD7上拉,输出置0.DDRC|=0X38; //PC3-PC5共阴数码管输出PORTC&=~0X38; //打开PC3-PC5上拉,输出置0.DDRB|=0X04; //QC,IO口为输出.PORTB|=0X04;//QC_OUT_LOW; //QC清0DDRB&=~0X03; //PB0-PB1按键输入PORTB|=0X03; //打开PB0-PB1上拉,输出置1.DDRC&=~0X01; //PC0按键输入PORTC|=0X01; //打开PC0上拉,输出置1.DDRC|=0X06; //LED2与LED3为输出状态PORTC&=~0X06; //关闭PC2-PC3上拉,输出置0.}/**********************************************DQ口初始化**********************************************/void Init_DS18B20(void){uint8 x=0;DDRB|=0X04;QC_OUT_HOW; //DQ复位//_delay_us(2); //稍做延时QC_OUT_LOW; //单片机将DQ拉低_delay_us(500); //精确延时 大于 480usQC_OUT_HOW; //拉高总线_delay_us(60);//x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败//_delay_us(120);}/**********************************************读18B20一个字节**********************************************/uint8 ReadOneChar(void){uint8 i=0;uint8 dat = 0;uint8 a=0;for (i=8;i>0;i--){QC_OUT_LOW; // 给脉冲信号dat>>=1; QC_OUT_HOW; // 给脉冲信号// _delay_us(200);DDRB&=~0X04;if((PINB&0X04)==0X04)dat|=0x80;_delay_us(24);DDRB|=0X04;//_delay_us(60); //60~120us }return(dat);}/**********************************************写一个字节**********************************************/void WriteOneChar(uint8 dat){uint8 i=0;uint8 b=0;DDRB|=0X04;for (i=8; i>0; i--){QC_OUT_LOW;b=dat&0x01;if(b)PORTB|=0X04;elsePORTB&=~0X04;_delay_us(30);QC_OUT_HOW;dat>>=1;}_delay_us(24);}/**********************************************//读取温度**********************************************/uint8 ReadTemperature(void){uint8 a=0;uint8 b=0;uint8 t=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度a=ReadOneChar(); //读取温度值低位b=ReadOneChar(); //读取温度值高位a=a>>4; //低位右移4位,舍弃小数部分t=b<<4; //高位左移4位,舍弃符号位t=t|a; return (t);}/**********************************************LED显示**********************************************/void display_tempmain(uint8 i) //共阳数码管{PORTD=led[i/100]; //求百位数bai_on;shi_off;ge_off;_delay_ms(2);PORTD=led[(i%100)/10]; //求十位数shi_on;bai_off;ge_off;_delay_ms(2);PORTD=led[(i%100)%10]; //求个位数ge_on;bai_off;shi_off;_delay_ms(2); }
最多设置5个标签!
你应该根据datasheet仔细安排。
#include <avr/io.h>
#include <avr/wdt.h>
#include "main.h"
#include "ds18b20.h"
#include <avr/delay.h>
uint8 const led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x88,0xf8,0x80,0x90,0x80};
//0, 1, 2 3 4 5 6 7 8 9 .
/**********************************************
IO口初始化
**********************************************/
void Iint_io(void)
{
DDRD|=0XFF; /550-PD7,LED输出,IO口为输出状态.
PORTD&=0X00; //关闭PD0-PD7上拉,输出置0.
DDRC|=0X38; //PC3-PC5共阴数码管输出
PORTC&=~0X38; //打开PC3-PC5上拉,输出置0.
DDRB|=0X04; //QC,IO口为输出.
PORTB|=0X04;
//QC_OUT_LOW; //QC清0
DDRB&=~0X03; //PB0-PB1按键输入
PORTB|=0X03; //打开PB0-PB1上拉,输出置1.
DDRC&=~0X01; //PC0按键输入
PORTC|=0X01; //打开PC0上拉,输出置1.
DDRC|=0X06; //LED2与LED3为输出状态
PORTC&=~0X06; //关闭PC2-PC3上拉,输出置0.
}
/**********************************************
DQ口初始化
**********************************************/
void Init_DS18B20(void)
{
uint8 x=0;
DDRB|=0X04;
QC_OUT_HOW; //DQ复位
//_delay_us(2); //稍做延时
QC_OUT_LOW; //单片机将DQ拉低
_delay_us(500); //精确延时 大于 480us
QC_OUT_HOW; //拉高总线
_delay_us(60);
//x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
//_delay_us(120);
}
/**********************************************
读18B20一个字节
**********************************************/
uint8 ReadOneChar(void)
{
uint8 i=0;
uint8 dat = 0;
uint8 a=0;
for (i=8;i>0;i--)
{
QC_OUT_LOW; // 给脉冲信号
dat>>=1;
QC_OUT_HOW; // 给脉冲信号
// _delay_us(200);
DDRB&=~0X04;
if((PINB&0X04)==0X04)
dat|=0x80;
_delay_us(24);
DDRB|=0X04;
//_delay_us(60); //60~120us
}
return(dat);
}
/**********************************************
写一个字节
**********************************************/
void WriteOneChar(uint8 dat)
{
uint8 i=0;
uint8 b=0;
DDRB|=0X04;
for (i=8; i>0; i--)
{
QC_OUT_LOW;
b=dat&0x01;
if(b)
PORTB|=0X04;
else
PORTB&=~0X04;
_delay_us(30);
QC_OUT_HOW;
dat>>=1;
}
_delay_us(24);
}
/**********************************************
//读取温度
**********************************************/
uint8 ReadTemperature(void)
{
uint8 a=0;
uint8 b=0;
uint8 t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar(); //读取温度值低位
b=ReadOneChar(); //读取温度值高位
a=a>>4; //低位右移4位,舍弃小数部分
t=b<<4; //高位左移4位,舍弃符号位
t=t|a;
return (t);
}
/**********************************************
LED显示
**********************************************/
void display_tempmain(uint8 i) //共阳数码管
{
PORTD=led[i/100]; //求百位数
bai_on;
shi_off;
ge_off;
_delay_ms(2);
PORTD=led[(i%100)/10]; //求十位数
shi_on;
bai_off;
ge_off;
_delay_ms(2);
PORTD=led[(i%100)%10]; //求个位数
ge_on;
bai_off;
shi_off;
_delay_ms(2);
}
#include <avr/wdt.h>
#include "main.h"
#include "ds18b20.h"
#include <avr/delay.h>
int main(void)
{
Iint_io();
//OSCCAL=0X9d;//系统时钟校准,不同的芯片和不同的频率,
uint8 temp;
while(1)
{
PORTC|=0X06;
temp=ReadTemperature();
display_tempmain(temp);
}
} 这是主函数
一周热门 更多>