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

📄 复件 main.txt

📁 avr当中的一个简单的温度测试程序和学习avr中的一些笔记
💻 TXT
📖 第 1 页 / 共 2 页
字号:
	     //UCSRC寄存器与UBRRH寄存器共用相同的I/O地址,写 UCSRC 时, URSEL 应设置为 1。
	UBRRL = (F_CPU / BAUD / 16 - 1) % 256;    //波特率设置
	UBRRH = (F_CPU / BAUD / 16 - 1) / 256;		
	UCSRB |= (1 << RXCIE) | (1 << RXEN) | (1 << TXEN);    //发送使能
	
}

//字节发送函数
void Usart_PutChar(unsigned char cTXData)
{
	while( !(UCSRA & (1 << UDRE)) );  //只有数据寄存器为空时才能发送数据
	UDR = cTXData;	                 //发送数据送USART I/O数据寄存器-UDR
}

//接收中断函数
ISR(USART_RXC_vect )
{
	unsigned char Rev;
	Rev = UDR;              //从USART I/O数据寄存器-UDR中读出数据
	Usart_PutChar(Rev);    //将接收到的数据发送
}


void Usart_PutString(unsigned char *pcString)
{
	while (*pcString)
	{
		Usart_PutChar(*pcString++);
	}	
}

//DS18B20初始化
unsigned char DS18B20_Init()
{	
	SET_OUT;   //PA2设置为输出口(相当于拉低数据线上的电平)	
	
	Delayus(490);  //延时大于480us
	
	SET_IN;     //输入 释放数据线(相当于拉高数据线上的电平)
	
	Delayus(68);	//延时大于60US,
		
	//while(DQ_IN);	    //可以用两个while()死循环来判断复位是否成功,当数据线被拉低,说明
	//while(!(DQ_IN));	 //DS18B20开始复位应答,当数据线变高,说明应答完毕
	
	if(DQ_IN)   //判断DSDS18B20是否拉低数据线
	{
		OK_Flag = 0;		//	数据线是高?复位失败
	}
	else
	{
		OK_Flag = 1;	//	数据线是低?复位成功
	}
	Delayus(422);	//有复位应答信号后,应当再延时一段时间(480-68),以等待应答完毕
	
	return OK_Flag;    //返回复位标志
}

//从DSDS18B20读取一个字节数据
unsigned char Read_DS18B20()
{
	unsigned char i;   
	unsigned char dat = 0;   // dat用于存储读到的数据,先清零	
	
	for(i = 0;i < 8;i++)   //共读8位数据,构成一个字节
	{		
		SET_OUT;    //定义为输出(拉低数据线)
		
		Delayus(2);   //拉低2微秒		
		
		SET_IN;        //定义成输入,读入数据(同时也相当于拉高数据线)
			
		Delayus(4);        //延时
		dat = dat >> 1;	       //数据右移,读顺序:先低后高
		if(DQ_IN)       //读数据,
		{			
			dat |= 0x80;   //如果是高,置1,右移数据
		}
		Delayus(62);		 //延时大于60us
	}	
	return dat;     //返回读到的1字节数据
}

//向DSDS18B20写1字节数据
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;	
	
	for(i = 0;i < 8;i++)  //写8次,一次写1位,先写低字节
	{
		SET_OUT;         //拉低数据线2us,开始写数据
		Delayus(2);      //
		
		if(dat & 0x01)   //写数据
		{
			SET_IN;    //写1			
		}
		else
		{
			SET_OUT;   //写0			
		}
		dat >>= 1;      //数据右移1位,先写低位
		Delayus(62);       //延时大于60us	
			
		SET_IN;          //拉高数据线
		Delayus(2);   //写两位数据的时间间隔		
	}	
}

//us级别的延时函数
void Delayus(unsigned int lus)
{
	while(lus--)
	{
		_delay_loop_2(3);      //_delay_loop_2(1)是延时4个时钟周期,参数为3则延时12
		           //个时钟周期,本实验用12M晶体,则12个时钟周期为12/12=1us
    }
}

//ms级别的延时函数
void Delayms(unsigned int lms)
{
	while(lms--)
	{
		Delayus(1000);        //延时1ms
    }
}

//启动温度转换
void DS18B20_StartConvert(void)   
{
	unsigned char i;
	
	DS18B20_Init();     //初始化DS18B20
		
	Write_DS18B20(DS18B20_SKIP_ROM);  //发送ROM指令,跳过ROM匹配
		
	Write_DS18B20(DS18B20_CONVERT_RAM);  //	发送温度转换命令	
		
	for(i=0;i<50;i++)      //延时1S,等转换完成
	{
		Delayms(20);
	}		
}

//获得温度转换结果
void DS18B20_GetConvert(void)
{
	DS18B20_Init();    //初始化DSDS18B20
		
	Write_DS18B20(DS18B20_SKIP_ROM);  //发送ROM指令,跳过ROM匹配
		
	Write_DS18B20(DS18B20_READ_RAM);  //发送读取暂存器指令
		
	Temp_L = Read_DS18B20(); //获得温度的低位
	
	Temp_H = Read_DS18B20(); //获得温度的高位
}   

//启动温度转换,带ROM匹配
void DS18B20_StartConvert1(void)   
{
	unsigned char i;
	
	DS18B20_MatchROM();
		
	Write_DS18B20(DS18B20_CONVERT_RAM);  //	发送温度转换命令	
		
	for(i=0;i<50;i++)      //延时1S,等转换完成
	{
		Delayms(20);
	}		
}

//获得温度转换结果,带ROM匹配
void DS18B20_GetConvert1(void)
{
	DS18B20_MatchROM();
		
	Write_DS18B20(DS18B20_READ_RAM);  //发送读取暂存器指令
		
	Temp_L = Read_DS18B20(); //获得温度的低位
	
	Temp_H = Read_DS18B20(); //获得温度的高位
}   


 // 读取RAM内容
void DS18B20_ReadRAM(void)       
{
	unsigned char i;
	
	DS18B20_Init();     //初始化DSDS18B20
	
	Write_DS18B20(DS18B20_SKIP_ROM);  //发送ROM指令,跳过ROM匹配		
		
	Write_DS18B20(DS18B20_READ_RAM);  //发送读取暂存器指令
	
	for(i = 0;i < 9;i++)
	{
		ReadRAM_Buff[i] = Read_DS18B20();
	}	
}

//写温度上下限和配置寄存器到RAM
void DS18B20_WriteRAM(void)       
{
	DS18B20_Init();     //初始化DSDS18B20
		
	Write_DS18B20(DS18B20_SKIP_ROM);  //发送ROM指令,跳过ROM匹配
	
	Write_DS18B20(DS18B20_WRITE_RAM);  //	发送写RAM命令	
		
	Write_DS18B20(ThrH);        //写温度报警上限值
	Write_DS18B20(ThrL);        //写温度报警下限值
	Write_DS18B20(CFG);         //写配置寄存器
}

//复制RAM中的温度上下线和配置寄存器到EEPROM
void DS18B20_CopyEEPROM(void)     
{
	DS18B20_Init();     //初始化DSDS18B20
		
	Write_DS18B20(DS18B20_SKIP_ROM);  //发送ROM指令,跳过ROM匹配
	
	Write_DS18B20(DS18B20_COPY_RAM);  //	发送复制命令	
		
	Delayms(20);   //  等待复制完成	
}

//把EEPROM中的温度上下线和配置寄存器恢复到RAM
void DS18B20_RecallRAM(void)      
{
	DS18B20_Init();     //初始化DSDS18B20
	
	Write_DS18B20(DS18B20_SKIP_ROM);  //发送ROM指令,跳过ROM匹配
		
	Write_DS18B20(DS18B20_RECALL_EEPROM);  //	发送温度转换命令	
	
	Delayms(20);	
}

//读ROM,当总线上只有一个节点时,可以执行此操作
void DS18B20_ReadROM(void)
{
	unsigned char i;
	
	DS18B20_Init();     //初始化DS18B20
	
	Write_DS18B20(DS18B20_READ_ROM);  //发送读ROM指令
	
	for(i = 0;i < 8;i++)
	{
		ReadROM_Buff[i] = Read_DS18B20();
	}	
}   

//搜索ROM,确定总线上的节点数目和ROM内容
void DS18B20_SearchROM(void)  
{
	DS18B20_Init();     //初始化DS18B20
	
	Write_DS18B20(DS18B20_SEARCH_ROM);  //发送搜索ROM指令
}
 
// 跳过ROM,当总线上只有一个节点时,可以执行此操作
void DS18B20_SkipROM(void)  
{
	DS18B20_Init();     //初始化DS18B20
	
	Write_DS18B20(DS18B20_SKIP_ROM);  //发送ROM指令,跳过ROM匹配
}

//匹配ROM,此命令后紧跟64位ROM序列号,匹配的节点可以读写
void DS18B20_MatchROM(void) 
{
	unsigned char i;
	DS18B20_Init();     //初始化DS18B20
	
	Write_DS18B20(DS18B20_MATCH_ROM);  //发送匹配ROM指令
	
	for(i = 0;i < 8;i++)
	{
		Write_DS18B20(ROM_Buff2[i]);
	}	
}
//报警搜索ROM,只有温度超过设定值的才能响应
void DS18B20_AlarmROM(void)  
{
	DS18B20_Init();     //初始化DS18B20
	
	Write_DS18B20(DS18B20_ALARM_ROM);  //发送报警搜索ROM指令
}

⌨️ 快捷键说明

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