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

📄 18b20.c

📁 一个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 + -