📄 main.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 + -