/******** STM8S-Discovery DS18B20 Test ********
* 版本.........: 1.0
* 作者.........: 陈利栋
* 目标.........: STM8S105C6T6
* 文件名.......: main.c
* 开发环境.....: IAR for STM8 V1.1
* 创建时间.....: 2010.09.10
* 最后修改.....: 2010.09.10
**********************************************
*/

#include 
<iostm8s105c6.h>
#include 
<stdio.h>

#define BAUD_RATE     9600         //波特率
#define F_MASTER      16000000     //主频率

#define DS18B20_DQ_OUT          PG_DDR_DDR0 = 1   //输出
#define DS18B20_DQ_IN           PG_DDR_DDR0 = 0   //输入
#define DS18B20_DQ_HIGH         PG_ODR_ODR0 = 1   //拉高
#define DS18B20_DQ_LOW          PG_ODR_ODR0 = 0   //拉低
#define DS18B20_DQ_PULL_UP      PG_CR1_C10  = 1   //上拉
#define DS18B20_DQ_FLOATING     PG_CR1_C10  = 0   //浮空
#define DS18B20_DQ_PUSH_PULL    PG_CR1_C10  = 1   //推挽
#define DS18B20_DQ_OPEN_DRAIN   PG_CR1_C10  = 0   //开漏
#define DS18B20_DQ_VALUE        PG_IDR_IDR0       //DQ值

//串口配置
//数据位:8
//停止位:1
//校验位:None
void UART_Init(void)
{
    UART2_CR2_TEN 
= 1;
    UART2_CR2_REN 
= 1;
    UART2_CR2_RIEN 
= 1;
    UART2_BRR2 
= ((unsigned char)((F_MASTER / BAUD_RATE) & 0x0f)) + (((unsigned char)((F_MASTER / BAUD_RATE) >> 8)) & 0xf0);
    UART2_BRR1 
= ((unsigned char)((F_MASTER / BAUD_RATE) >> 4));
}

void UART_TxByte(unsigned char _data)
{
    
while (UART2_SR_TXE == 0);
    UART2_DR 
= _data;
}

int putchar(int c)
{
    UART_TxByte(c);
    
return c;
}

void _delay_us(unsigned int i)
{
    i 
*= 3
    
while(--i);
}

void _delay_ms(unsigned int i)
{
    
while(i--)
    {
        _delay_us(
1000);
    }
}

void DS18B20_Init(void)
{
    DS18B20_DQ_OUT;   
    DS18B20_DQ_PUSH_PULL;    
    DS18B20_DQ_HIGH;   
    _delay_us(
10);
    DS18B20_DQ_LOW;   
    _delay_us(
600);     //复位脉冲
    
    DS18B20_DQ_IN;   
    DS18B20_DQ_PULL_UP;    
    _delay_us(
100);     
    
while(DS18B20_DQ_VALUE == 1);
    _delay_us(
400);
}

void DS18B20_WriteByte(unsigned char _data)
{
    unsigned 
char i = 0;

    DS18B20_DQ_OUT;
    
for (i = 0; i < 8; i++)
    {
        DS18B20_DQ_LOW;
        _delay_us(
2);
        
if (_data & 0x01)
        {
            DS18B20_DQ_HIGH;
        }
        _data 
>>= 1;
        _delay_us(
60);
        DS18B20_DQ_HIGH;
    }
}

unsigned 
char DS18B20_ReadByte(void)
{
    unsigned 
char i = 0, _data = 0;

    
for (i = 0; i < 8; i++)
    {
        DS18B20_DQ_OUT;
        DS18B20_DQ_LOW;
        _delay_us(
5);
        _data 
>>= 1;
        DS18B20_DQ_HIGH;
        DS18B20_DQ_IN;
        
if (DS18B20_DQ_VALUE)
        {
            _data 
|= 0x80;
        }
        DS18B20_DQ_OUT; 
        DS18B20_DQ_HIGH;
        _delay_us(
60);
    }

    
return _data;
}

float DS18B20_ReadTemperature(void)
{
    unsigned 
char temp = 0;
    
float t = 0;
    
    DS18B20_Init();
    DS18B20_WriteByte(
0xcc);
    DS18B20_WriteByte(
0x44);

    DS18B20_Init();
    DS18B20_WriteByte(
0xcc);
    DS18B20_WriteByte(
0xbe);

    temp 
= DS18B20_ReadByte();
    t 
= (((temp & 0xf0>> 4+ (temp & 0x07* 0.125); 
    temp 
= DS18B20_ReadByte();
    t 
+= ((temp & 0x0f<< 4);
    
    
return t;
}

int main(void)
{  
    CLK_SWCR_SWEN 
= 1;
    CLK_SWR 
= 0xB4;    //HSE selected as master clock source
    
    UART_Init();
    printf(
"********* STM8S-Discovery DS18B20 Test *********\r\n");
    printf(
"Build: %s  %s\r\n", __DATE__, __TIME__);
    
    asm(
"rim");
    
    
while(1)
    {
        _delay_ms(
1000);
        printf(
"%.3f ", DS18B20_ReadTemperature());
    }
}

#pragma vector = UART2_R_RXNE_vector
__interrupt 
void UART2_IRQHandler(void)
{
    
if (UART2_SR_RXNE == 1)
    {
        UART_TxByte(UART2_DR);
    }
}

 

IAR工程下载:

http://www.rayfile.com/zh-cn/files/b28f83f0-bcc9-11df-8a8f-0015c55db73d/