📄 init.c
字号:
#include"main.h"
#include"init.h"
#include"18b20.h"
static void usart_init(void) ;
static void init_18B20(void) ;
static void timer1_init(void) ;
static void watch_dog(void) ;
extern uint temperature ;
void init(void)
{
usart_init() ;
init_18B20() ;
timer1_init() ;
watch_dog() ;
DDRB |= 0x04 ; //频率输出端口初始化
}
static void timer1_init(void)
{
TCCR1A = 0x10;
TCCR1B = 0x09; //普通端口操作,CTC模式 ,不分频
TCNT1H = 0x00;
TCNT1L = 0x00;
ICR1H = 0x00;
ICR1L = 0x00;
OCR1AH = 0x24; //初始化输出200Hz 24
OCR1AL = 0x00;
OCR1BH = 0x00;
OCR1BL = 0x00;
//TIMSK1 = 0x02; //T/C1 输出比较 A 匹配中断使能
}
static void usart_init(void)
{
/* 设置波特率 2400 bps*/
UBRR0H = 0x00 ;
UBRR0L = 0x5F ;
/* 接收结束中断使能 发送器使能 , 接收使能*/
UCSR0B = 0x98 ; //8位数据
/* 设置帧格式: 8 个数据位, 1 个停止位,偶校验 */
UCSR0C = 0x26;
}
static void init_18B20(void)
{
while( init_bus() == 0) //等待总线初始化完成
;
_SEI() ;
_WDR() ;
write_18B20(0xCC); //发送SKIP ROM指令
write_18B20(0x4E); //发送写寄存器指令
write_18B20(0x64); //设置温度上限值为100
write_18B20(0x00); //设置温度下限值为0
write_18B20(0x7F); //写配置寄存器,12位分辨率
}
uchar init_bus(void)
{
// DQ=0;
// _DINT() ;
_CLI() ;
TEMP_OUT ;
//NOP10
TEMP_RESET ;
// Delay500(); //延时500us
delay(48) ;
delay(48) ;
delay(48) ;
delay(48) ;
delay(48) ;
// DQ=1;
TEMP_SET ;
TEMP_IN ;
// Delay90(); //延时90us
delay(40) ;
// DQ=1;
NOP10
if( TEMP_READ != 0x80)
{
TEMP_OUT ;
TEMP_SET ;
// Delay400(); //延时400us
delay(48) ;
delay(48) ;
delay(48) ;
delay(48) ;
// PORTD = tab[5];
return 1;
}
else
{
// PORTD = tab[2];
// if(DQ==1)
return 0;
}
}
void delay(uint time) //time==88,为100us
{
uint j = 0 ;
for(j = 0 ;j < time ;j++)
;
}
static void watch_dog(void)
{
/* 看门狗设置*/
WDTCSR = 0x18 ;
WDTCSR = 0x0F ; // 2 S 打开看门狗 使能看门狗不能用 |=,必须要直接赋值=。
WDTCSR &= 0xEF ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -