基于AVR单片机的18B20温度传感器及LCD显示的C语言程序设计

发布者:开元轩最新更新时间:2016-10-26 来源: eefocus关键字:AVR单片机  18B20  温度传感器  LCD显示 手机看文章 扫描二维码
随时随地手机看文章
***************************************************/
#include
#include
#define uchar unsigned char
#define uint  unsigned int
#include "1602LCD_drive.h"   //包含LCD驱动程序软件包
#include "DS18B20_drive.h"   //DS18B20驱动程序软件包
#define beep_0  (PORTD=PORTD&0xbf)  //PD6上的蜂鸣器发声
#define beep_1  (PORTD=PORTD|0x40)  //PD6上的蜂鸣器不发声
uchar  temp_flag ;   //判断DS18B20是否正常标志位,正常时为1,不正常时为0
uchar  temp_comp;   //用来存放测量温度的整数部分
uchar disp_buf[8]={0};   //显示缓冲
uchar  temp_data[2] = {0x00,0x00};  //用来存放温度数据的高位和低位
uchar   line1_data[] = "   DS18B20 OK   ";   //DS18B20正常时第1行显示的信息
uchar   line2_data[] = " TEMP:          ";  //DS18B20正常时第2行显示的信息
uchar   menu1_error[] = "   DS18B20 ERR  ";  //DS18B20出错时第1行显示的信息
uchar   menu2_error[] = " TEMP: ----     ";  //DS18B20出错时第2行显示的信息
/********以下是函数声明,由于本例采用的函数较多,应加入函数声明部分********/
void port_init(void);
void  TempDisp(void);   //温度值显示函数声明
void  beep(void);    //蜂鸣器响一声函数声明
void  MenuError(void);   //DS18B20出错菜单函数声明
void  MenuOk(void);    //DS18B20正常菜单函数声明
void GetTemperture(void);   //读取温度值函数声明
void TempConv(void);    //温度值转换函数声明
/********端口设置函数********/
void port_init(void)
{
 PORTA = 0xFF;   //输出高电平
 DDRA  = 0xFF;  //设为输出
 PORTC = 0xff;   //输出高电平
 DDRC  = 0xFF;   //设为输出
 //DDRD =(1<  DDRD =(0<  PORTD = 0xFF;
 PORTB=0xff;  

/*********蜂鸣器响一声函数********/
void  beep()
{
uint bb;
for(bb=0;bb<10;bb++)
{
  beep_0;         //蜂鸣器响
  Delay_ms(100); 
  beep_1;            //关闭蜂鸣器
  Delay_ms(100);    
}
}
/********温度值显示函数,负责将测量温度值显示在LCD上********/ 
void  TempDisp()
{  
 LocateXY(6,1);        //从第1行第6列开始显示温度值
 lcd_wdat(disp_buf[3]);        //百位数显示             
   lcd_wdat(disp_buf[2]);       //十位数显示              
   lcd_wdat(disp_buf[1]);       //个位数显示  
   lcd_wdat('.');             //显示小数点
   lcd_wdat(disp_buf[0]);       //小数位数显示
   lcd_wdat(0xdf);             //0xdf是圆圈°的代码,以便和下面的C配合成温度符号℃
   lcd_wdat('C');              //显示C
}
/********DS18B20正常时的菜单函数********/
void  MenuOk()
{
  LCD_write_str(0,0,line1_data); //在第0行的第0列显示"   DS18B20 OK   "
  LCD_write_str(0,1,line2_data); //在第1行的第0列显示" TEMP:          "
}
/********DS18B20出错时的菜单函数********/
void  MenuError()
{
 lcd_clr();     //LCD清屏 
 LCD_write_str(0,0,menu1_error); //在第0行的第0列显示"   DS18B20 ERR   "
  LCD_write_str(0,1,menu2_error); //在第1行的第0列显示" TEMP:          "
  LocateXY(11,1);     //从第1行第11列开始显示 
 lcd_wdat(0xdf);              //0xdf是圆圈°的代码,以便和下面的C配合成温度符号℃
   lcd_wdat('C');               //显示C
}
/********读取温度值函数********/
void GetTemperture(void)
{
 SREG=0x00;                      //禁止全局中断;                       //关中断,防止读数错误 
 Init_DS18B20();    //DS18B20初始化
  if(yes0==0)      // yes0为Init_DS18B20函数的返回值,若yes0为0,说明DS18B20正常
  {
   WriteOneByte(0xCC);    // 跳过读序号列号的操作
     WriteOneByte(0x44);    // 启动温度转换
  Delay_ms(1000);    //延时1s,等待转换结束
     Init_DS18B20();
     WriteOneByte(0xCC);    //跳过读序号列号的操作
     WriteOneByte(0xBE);    //读取温度寄存器
     temp_data[0] = ReadOneByte();   //温度低8位
     temp_data[1] = ReadOneByte();   //温度高8位 
  //temp_TH = ReadOneByte();   //温度报警TH
  //temp_TL = ReadOneByte();   //温度报警TL
  temp_flag=1;
   }
 else temp_flag=0;    //否则,出错标志置0
 SREG=0x80;                      //温度数据读取完成后再开中断
}
/********温度数据转换函数,将温度数据转换为适合LCD显示的数据********/
void TempConv()
{
 uchar sign=0;      //定义符号标志位
 uchar  temp;     //定义温度数据暂存
  if(temp_data[1]>127)                   //大于127即高4位为全1,即温度为负值
  {                                        
   temp_data[0]=(~temp_data[0])+1;      //取反加1,将补码变成原码
     if((~temp_data[0])>=0xff)   //若大于或等于0xff
     temp_data[1]=(~temp_data[1])+1; //取反加1
     else temp_data[1]=~temp_data[1]; //否则只取反
     sign=1;     //置符号标志位为1
  }
 temp =temp_data[0]&0x0f;    //取小数位
  disp_buf[0]=(temp *10/16)+0x30;   //将小数部分变换为ascii码
  temp_comp =((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);//取温度整数部分
 disp_buf[3]= temp_comp /100+0x30;  //百位部分变换为ascii码
  temp = temp_comp%100;    //十位和个位部分
  disp_buf[2]= temp /10+0x30;   //分离出十位并变换为ascii码
  disp_buf[1]= temp %10+0x30;   //分离出个位并变换为ascii码
  if(disp_buf[3]==0x30)           //百位ascii码为0x30(即数字0),不显示
  { 
   disp_buf[3]=0x20;               //0x20为空字符码,即什么也不显示
      if(disp_buf[2]==0x30)         //十位为0,不显示
      disp_buf[2]=0x20;
  }
  if(sign) disp_buf[3]=0x2d;             //如果符号标志位为1,则显示负号(0x2d为负号的字符码) 

/********主函数********/
void main(void)
{   
 port_init();
 PortDS18B20_Init();
  lcd_init();      //初始化LCD
 lcd_clr();    //LCD清屏  
 while(1)
  {   
  GetTemperture();  //读取温度数据
  if(temp_flag==0)
  {
   beep();      //若DS18B20不正常,蜂鸣器报警 
   MenuError();  //显示出错信息函数
  }
  if(temp_flag==1)  //若DS18B20正常,则往下执行
  {
   TempConv();    //将温度转换为适合LCD显示的数据
   MenuOk();    //显示温度值菜单
   TempDisp();    //调用LCD显示函数
  }
 }    
}
关键字:AVR单片机  18B20  温度传感器  LCD显示 引用地址:基于AVR单片机的18B20温度传感器及LCD显示的C语言程序设计

上一篇:AVR的模拟比较器功能实验
下一篇:基于AVR单片机的mega16内部EEPROM操作C语言程序设计

推荐阅读最新更新时间:2024-03-16 15:17

大连和华电气推出线性NTC温度传感器
大连和华电气制造公司成立于1994年,是一家专业从事生产具有自主知识产权的专利产品HN系列线性NTC温度 传感器 /温度补偿元件的公司。该公司在引进美国的成套测试系统的基础上,现已形成年产1000万支传感器的生产能力,产品遍布各个领域。 该公司此次推出的NTC温度传感器具有测温范围宽(-200~+200℃),温度系数高(-2mv/℃)、线性度好(±0.5%)、互换精度高(I级±0.3℃;J级±0.5℃;K级±1.0℃)、高稳定性(±0.05℃/年)等优点,同时还具备0℃基准电压规范(690~710mV)的特点。
[工业控制]
AVR单片机语音识别电路模块设计
  基于AVR单片机的语音识别系统设计,系统以AVR单片机为控制核心,实现对人的语音的识别控制。系统采用的主控芯片为Atreel公司的ATMEGAl28,语音识别功能采用ICR oute公司的单芯片LD3320。LD3320内部集成语音识别算法,无需外部FLASH,RAM资源,可以很好地完成非特定人的语音识别任务。同时该芯片内部集成了MP3播放功能,支持MPEG等格式,可实现语音提示或MP3歌曲的播放功能。由于内部含有16位A/D、D/A转换器和功放电路,所以不需要外接功放电路就可以产生清晰的声音。该系统已经预留好各种接口,具有良好的扩展性。   控制器电路   控制器选用Atmel公司生产的ATMEGA128芯片,采用先进的
[单片机]
<font color='red'>AVR单片机</font>语音识别电路模块设计
使用Atmel Studio7和USBasp烧写器烧写AVR单片机
很多教程中都提供使用Atmel Studio和MKII对AVR单片机进行烧写,但民间使用最多的烧写器是物美价廉的USBasp,10元左右的价格比200元的MKII亲民多了。但是在Atmel Studio中不可以直接使用USBasp进行烧写,于是通常需要借助其他软件,带来更多麻烦。 本文通过Atmel Studio的External Tools和Avrdude软件,达到可以在Atmel Studio中直接烧写单片机的目的。这样可以在开发环境中完成编程、编译和烧写,非常方便。 第一步:你需要有一个USBasp以及其驱动,驱动程序在网络上铺天盖地,在购买模块的时候向店家索要也可。在设备管理器中可以通过设定驱动搜索的路径来安装驱动
[单片机]
使用Atmel Studio7和USBasp烧写器烧写<font color='red'>AVR单片机</font>
avr单片机流水灯的程序
/******************************************************************************/ /*【编写时间】: 2011.07.07 * 【作 者】: 雁翎电子 * 【版 本】: V1.0 * 【编译环境】: ICCAVR * 【函数功能】: 流水灯实验 * 【晶 振】: 8M * 【芯 片】: ATMEGA16A * 【硬件连接】: J1短路帽接上 /******************************************************************************/ #d
[单片机]
LED/LCD显示原理
LED译码器采用标准数字电平输出,使LED显示器的七段发光二极管分别工作于导通或截止状态,从而使LLD显示相应的数字。而LCD显示器是利用液晶的动态散射效应来显示数字的,当没有外加电场时,液晶分子按一定方向整齐排列,射人的光线被反射电极反射回来,从而使液晶呈现白色;当电极上加人电压后,液晶电离正离子在电场的作用下运动而打乱液晶分子的规则排列,射入的光线不能正常反射回来,从而使液晶呈现暗色。液晶显示器两极不能施加直流电压,通常要求在两个电极上加50一100 Hz的交变信号,此信号可由两个同频反相的周期性矩形脉冲信号加在LCD电极的两端组成。当其正面电极和公共电极的脉冲信号同频反相时,液晶两极电压为方波信号,液晶工作呈现暗色;而当两极
[模拟电子]
LED/<font color='red'>LCD显示</font>原理
AVR单片机对挖掘机器人的控制设计
引言 挖掘机的出现使人类从繁重的体力劳动中解脱出来,然而传统的挖掘机操作复杂,对操作者的技能要求很高。人们一直谋求更省力、更高效率和更能实现精确轨迹的挖掘作业模式。随着微电子技术的进一步发展,集成电路的集成度和性能提高、价格下降,以微处理器为基础,实现挖掘机的机电一体化、机器人化、智能化进程,已经成为工程项目施工管理的一个重要研究课题与发展方向。本文以挖掘机器人为例,设计一种基于AVR单片机的挖掘机器人控制系统。 1 总体方案设计 挖掘机器人由挖掘机器人本体机械系统、红外传感器组成的传感器系统、直流电机驱动系统、以AVR单片机为核心的控制系统等四部分组成,其基本结构如图1所示。 图1 挖掘机器人的基本结构 挖掘机器人的
[单片机]
<font color='red'>AVR单片机</font>对挖掘机器人的控制设计
AVR单片机教程——定时器中断
本文隶属于AVR单片机教程系列。 中断,是单片机的精华。 中断基础 当一个事件发生时,CPU会停止当前执行的代码,转而处理这个事件,这就是一个中断。触发中断的事件成为中断源,处理事件的函数称为中断服务程序(ISR)。 中断在单片机开发中有着举足轻重的地位——没有中断,很多功能就无法实现。比如,在程序干别的事时接受UART总线上的输入,而uart_scan_char等函数只会接收调用该函数后的输入,先前的则会被忽略。利用中断,我们可以在每次接受到一个字节输入时把数据存放到缓冲区中,程序可以从缓冲区中读取已经接收的数据。 AVR单片机支持多种中断,包括外部引脚中断、定时器中断、总线中断等。每一个中断被触发时,通过中断向
[单片机]
AVR单片机在无线自动报靶系统中的应用
目前,在野外射击训练考核中,大部分还是通过人工报靶的方法,带有很多人为因素(如报靶人员的主观性、情绪等),影响报靶的结果,使得射手不能正确了解自己的成绩,不利于打靶水平的提高。虽然现在市面上出现了一些自动报靶产品,但这些产品的成本高、系统比较复杂,并且占用场地。因此,本文根据实际训练需要,研制出了集轻武器射击训练所需的所有功能于一体的、基于AVR单片机的一种无线自动报靶系统。该系统包括精确和非精确报靶,射击成绩的自动实时显示、统计和打印,可以满足多种武器和多种射击模式的训练需求,对目标的隐显时机、次数、间隔等均按训练大纲要求由电脑自动控制,既可同时监控多个(25个)靶位的射击情况,也可单独监控一个靶位的射击情况。 1 系统组成
[工业控制]
<font color='red'>AVR单片机</font>在无线自动报靶系统中的应用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved