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

📄 1820.c

📁 基于ATMEGA16的温度传感器原代码
💻 C
字号:
/////////////////////////////////////////////////////////////
//  文件:DS18B20.C                                        //
//  环境:编译为ICC AVR6.31A,仿真为AVR Studio4.12sp4      //
//  硬件:ATMEGA16芯片                                     //
//  日期:2007年5月28日                                    //
//  功能:读取18B20温度,在数码管显示                      //
//  备注:                                                 //
/////////////////////////////////////////////////////////////
#include <iom16v.h>				//包含单片机型号头文件
#include <macros.h>				//包含"位"操作头文件
#include "delay.h"				//包含延时头文件
#include "AVR_XQV12.h"			//包含通用函数及宏定义头文件
#include "lcd.h"
/*******************************************************/
/******   函数名称: init_1820()                   ******/
/******   功    能: 复位18B20                     ******/
/******   参    数: 无                            ******/
/******   返回值  : 无                            ******/
/*******************************************************/
void init_1820(void) 
{
	ddrt|=D0;		 					//设置端口输出
	port|=D0;							//输出一个脉冲
	port&=~D0;
	delay_nus(500);      	  			//延时480us以上
	port|=D0;							//输出一个脉冲
	ddrt&=~D0;
	delay_nus(30);     		  			//15~60us
	while(pin&D0); 						//等待应答
    ddrt|=D0; 							//设置输出
    port|=D0; 							//输出高电平
    delay_nus(80);    		  			//60~240us 
}
/*******************************************************/
/******   函数名称: write_1820()                  ******/
/******   功    能: 写18B20                       ******/
/******   参    数: x--要写的数据                 ******/
/******   返回值  : 无                            ******/
/*******************************************************/
void write_1820(unsigned char x) 
{
 	unsigned char m;
	for(m=0;m<8;m++) 
    {
	 	port&=~D0;	 	 	  	 		//写数据,从低位开始
		if(x&(1<<m))					//判断数据极性
		port|=D0;
		else
		port&=~D0;
		delay_nus(30);     				 //延时15~60us
		port|=D0;						 
    } 
    port|=D0; 							 //结束写数据,置高总线
} 
/*******************************************************/
/******   函数名称: read_1820()                   ******/
/******   功    能: 读18B20                       ******/
/******   参    数: 无                            ******/
/******   返回值  : 读取的数据                    ******/
/*******************************************************/
unsigned char read_1820(void) 
{     
    unsigned char temp=0,k,n; 
    for(n=0;n<8;n++) 
    { 
		port&=~D0;	 		  			//输出一个起始脉冲
    	port|=D0;
		ddrt&=~D0;						//设端口为输入
		k=(pin&D0);      		 		//读数据,从低位开始 
		if(k)							//判断数据极性
		temp|=(1<<n);
		else
		temp&=~(1<<n);
		delay_nus(50); 	  				 //延时60~120us
		ddrt|=D0;						 //设端口为输出
	}
	return (temp);						 //返回读出的数据
}
/*******************************************************/
/******   函数名称: Read_1820_temprter()          ******/
/******   功    能: 读取18B20温度                 ******/
/******   参    数: 无                            ******/
/******   返回值  : 读取的温度数据                ******/
/*******************************************************/
unsigned int Read_1820_temprter(void)
{
 	unsigned int count;
	unsigned char temh,teml; 
 	init_1820();        	   		 //复位18b20
	write_1820(0xcc);   			 //发出转换命令
	write_1820(0x44);
	delay_nus(400);
	init_1820();
	write_1820(0xcc);  				 //发出读命令
	write_1820(0xbe);
	teml=read_1820();  				 //读数据
	temh=read_1820();
	count=(temh*256+teml)*6.25;  	 //计算具体温度
	return count;					 //返回温度数据
}
/*******************************************************/
/******   函数名称: main()                        ******/
/******   功    能: 读取18B20温度,在数码管显示   ******/
/******   参    数: 无                            ******/
/******   返回值  : 无                            ******/
/*******************************************************/
void main(void)
{unsigned int tem;
	CPU_Init();	  							//初始化单片机
	while(1)								//无限循环
	{
		temprter=Read_1820_temprter();		//读取温度
		
            Lcd_INT();                      //初始化液晶屏
			lcd_clear();                    //清屏
			
			 lcd_write2(2,1,temprter%10000/1000);  //显示温度的十位
             lcd_write2(2,2,temprter%10000%1000/100); //显示温度的个位
			  
			
			LCD_Write_string(2,3,".");	
           //lcd_write2(2,4,5); 
            lcd_write2(2,4,temprter%10000%1000%100/10); 	//显示小数点后一位
	        lcd_write2(2,5,temprter%10000%1000%100%10); //显示小数点后两位
		delay_nms(500);		
						
											
											
	} 
}

⌨️ 快捷键说明

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