请问谁用过AVR写过18B20的驱动啊?

2019-03-24 21:13发布

本信息来自合作QQ群:电子工程师技术交流(12425841) 群主在坛子ID:Kata
    大家上午好,请问有谁用过AVR的单片机写过18B20的驱动啊 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
深圳-袁大头
1楼-- · 2019-03-26 01:45
18b20的的时序要求比较高。

你应该根据datasheet仔细安排。
深圳-袁大头
2楼-- · 2019-03-26 03:44
你的程序我看看
发仔
3楼-- · 2019-03-26 09:09
  • #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);
    }

  • 发仔
    4楼-- · 2019-03-26 11:01
    #include <avr/io.h>
    #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);
    }
    } 这是主函数
    深圳-袁大头
    5楼-- · 2019-03-26 15:03
     精彩回答 2  元偷偷看……
    发仔
    6楼-- · 2019-03-26 18:04
    PORTB|=0X04; 这是切换IO口啊

    一周热门 更多>