⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 avr单片机编写的18B20测温程序
💻 C
字号:
/* 
******************************************************** 
*   文件:   main.c 
*   功能:   AVR微控制器 VS 温度芯片DS18B20(TO-92) 
*   工具:   (WINAVR-GCC) 
*   作者:   cht 
*   日期:   1/29/2007
*   版本:   0.1 
*   声明:  
******************************************************** 
*/ 

#include <util/delay.h>
#include <stdint.h>
#include <avr/io.h>
#include "18b20.h"
#include "usart.c"

volatile uint8_t f_t; //温度正负标志
volatile uint8_t led_8[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
volatile uint8_t led_seg[4]; //五位数码管显示符号位,百位,十位,个位


uint16_t hex_to_dec(uint16_t);  //16--10
void init(void); 				// 初始化avr和18b20
void delay_s(uint16_t m);
void display(void);

/*-------------------------------------------------------------------------
*动态显示数码管
*/
void display(void)
{
	uint8_t i,sel=0x01;
	for (i=0;i<5;i++)
	{
		PORTA = led_seg[4-i];
		PORTB = ~sel;
		_delay_ms (2);
		sel=sel<<1;
	}
}


/*--------------------------------------------------------------------------
*初始化avr和18b20
*/
void init(void)
{
	DDRA = 0XFF;
	DDRB = 0XFF;
	PORTA = 0X00;
	PORTB = 0XFF;
	DDRD  = 0xFF;
    PORTD = 0xFF;
	init_USART();
	DS18b20_config();
}

/*--------------------------------------------------------------------------
*延时程序
*/
void delay_s(uint16_t m)
{
	while((m--)>=0)
	{
		wait_us(1000);
	}
}


/*--------------------------------------------------------------------------
* 把采集到的温度数据转化成十进制,采用12位精度,温度小数部分精确到小数点后一位,采用四舍五入。
*
*	0  cel_frac	 小数点后第二位  进位位
*	1	0625	    625		 	1
*	2	1250		250	
*	3	1875		875			3
*	4	2500		500			4
*	5	3125		125	
*	6	3750		750			6
*	7	4375		375	
*	8	5000		0	
*	9	5625		625			9
*	10	6250		250	
*	11	6875		875			11
*	12	7500		500			12
*	13	8125		125	
*	14	8750		750			14
*	15	9375		375	

*/
uint16_t hex_to_dec(uint16_t means)
{
	uint16_t value;
	uint8_t cel; //温度整数部分
	uint8_t cel_frac; //温度小数部分
	uint8_t i;
	uint8_t need_rounding[]={1,3,4,6,9,11,12,14};
	
	if (means & 0x8000) 	//温度为零下,把负数的补码转化成原码
	{
		f_t = 1;
		means ^=0xffff; 	//取反
		means++;
	}
	cel=(uint8_t) (means>>4); 		//把整数部分由十六转成十进制
	cel_frac = (uint8_t) (means & 0x000f);
	value =cel_frac*625/1000; 		//如精确到两位除以100
	value +=cel*10;   				//如精确到两位乘以100
	
	for (i=0; i<=sizeof(need_rounding);i++)
	{
		if (cel_frac==need_rounding[i])
		{
			value++;
			break;
		}
	}

	return value;
}


int main(void)
{
	uint16_t tp;
	uint16_t m;
	uint8_t i;
	init();
	while(1)
	{
		uint8_t i;
		f_t = 0;
		
		m = 0x0000;
		covert_t();
		for (i=0;i<=35;i++)   //温度转化后一定要延时750ms后再读数据,否则为18b20内部自定义的85度 
		{
			display();
			_delay_ms(20);
		}
		m = read_t();
		i = m>>8;
		put_c(i);
		i = m;
		put_c(i);

		tp = hex_to_dec(m);
		//tp = hex_to_dec( 0xfc90); 
		if (f_t)
		{
			led_seg[0]=0x40;
		}
		else
		{
			led_seg[0]=0x00;
		}
		
		for (i=4;i>0;i--)
		{
			led_seg[i]=led_8[tp%10];
			tp = tp/10;
		}
		led_seg[3]=led_seg[3]+0x80;

	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -