📄 18b20.c
字号:
#include <iom16v.h>
#include <macros.h>
//利用宏定义实现1.0us延时
#define delay_1us() asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");asm("nop"); asm("nop"); asm("nop");
void delay_us(unsigned int n)
{
unsigned int i;
for(i=n;i>0;i--)
delay_1us();
}
void delay_ms(unsigned int n)
{
unsigned int i;
for(i=n;i>0;i--)
delay_us(999);
}
//复位
unsigned char device_reset(void)
{
unsigned char online;
DDRA|=BIT(PA0);//设置DQ为输出
PORTA&=~BIT(PA0);//DQ置0
delay_us(480);
PORTA|=BIT(PA0);//DQ置1
delay_us(30);
DDRA&=~BIT(PA0);//置DQ为输入
delay_us(100);
online=PINA&0x01;//相应信号
return(online);
}
//向单总线读取一字节
uchar read_byte(void)
{
unsigned char i,mid;
unsigned char value=0;
for(i=8;i>0;i--)
{
value>>=1;
DDRA|=BIT(PA0);//设置DQ为输出
PORTA&=~BIT(PA0);//DQ置0
PORTA|=BIT(PA0);//DQ置1
delay_us(15);
DDRA&=~BIT(PA0);//置DQ为输入
mid=PINA & 0x01;
if(mid)
value|=0x01;
delay_us(90);
}
return(value);
}
//向单总线写一字节
void write_byte(char val)
{
unsigned char i,mid;
for(i=8;i>0;i--)
{
DDRA|=BIT(PA0);//设置DQ为输出
PORTA&=~BIT(PA0);//DQ置0
mid=val&0x01;
if(mid)
PORTA|=BIT(PA0);//DQ置1
else
PORTA&=~BIT(PA0);//DQ置0
delay_us(90);
PORTA|=BIT(PA0);//DQ置1
val=val/2;
}
}
//读取温度
int read_temperature(void)
{
char c[2];
int x;
device_reset();
write_byte(0xCC);//跳过ROM
write_byte(0xBE);//读闪存
c[1]=read_byte();
c[0]=read_byte();
device_reset();
write_byte(0xCC);//跳过ROM
write_byte(0x44);//启动转换
x=(c[1]<<8)&c[2];
return x;
}
//端口初始化
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
}
//串口通信初始化
void comm_init(void)
{
UCSRB = 0x00;//禁止中断
UCSRA = 0x00;
UCSRC = BIT(URSEL) | 0x06;
UBRRL = 0x40;
UBRRH = 0x03;
UCSRB = 0xD8;
}
void init_devices(void)
{
CLI(); //禁止所有中断
MCUCR = 0x00;
MCUCSR = 0x80;//禁止JTAG
GICR= 0x00;
port_init();//端口初始化
comm_init();//串口通信初始化
SEI();//开全局中断
}
void comoutchar(unsigned char back)
{
while(!(UCSRA & (1<<UDRE))) ;
UDR=back;
}
//串行发送结束中断服务程序
#pragma interrupt_handler usart_tx_isr:14
void usart_tx_isr(void)
{
}
void main(void)
{
int tempcyc;
init_devices();
comoutchar(0x88);
while(1)
{
delay_ms(1000);
tempcyc=read_temperature();
comoutchar(tempcyc);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -