AVR单片机采集DS18B20并LCD显示

发布者:星尘之泪最新更新时间:2020-04-18 来源: eefocus关键字:AVR单片机  DS18B20  LCD显示 手机看文章 扫描二维码
随时随地手机看文章

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define beep_0 (PORTD = PORTD&0x7F)

#define beep_1 (PORTD = PORTD|0x80)


#define RS_0 PORTC &= ~(1<#define RS_1 PORTC |= (1<#define RW_0 PORTC &= ~(1<#define RW_1 PORTC |= (1<#define EN_0 PORTC &= ~(1<#define EN_1 PORTC |= (1<

#define DQ PB3

#define DQ_SET (PORTB)|=(1<#define DQ_CLR (PORTB)&=~(1<#define DQ_IN (PINB)&(1<#define SET_OUT (DDRB)|=(1<#define SET_IN (DDRB)&=~(1<

uchar yes0;

uchar temp_flag;

uchar temp_comp;

uchar disp_buf[8]={0};

uchar temp_data[2]={0x00,0x00};

uchar line1_data[]=" DS18b20 OK ";

uchar line2_data[]=" TEMP:      ";

uchar menu1_error[]=" DS18B20 ERR ";

uchar menu2_error[]=" TEMP:---    ";


/*****函数声明*****/

void port_init(void);

void TempDisp(void);

void beep(void);

void MenuError(void);

void MenuOk(void);

void GetTemperture(void);

void TempConv(void);


void delay_us(unsigned int n);

void Delay_ms(uint xms);

uchar lcd_busy(void);

void lcd_wcmd(uchar cmd);

void lcd_wdat(uchar dat);

void lcd_clr(void);

void lcd_init(void);

void LocateXY(uchar x,uchar y);

void LCD_write_char(uchar x,uchar y,uchar data);

void LCD_write_str(uchar x,uchar y,uchar *s);


void PortDS18B20_Init(void);

uchar Init_DS18B20(void);

uchar ReadOneByte(void);

void WriteOneByte(uchar dat);



/*****端口设置函数*****/

void port_init(void)

{

         PORTA = 0xFF;

         DDRA = 0xFF;

         PORTC = 0xFF;

         DDRC = 0xFF;

         DDRD = (1<         DDRB = (0<         PORTD = 0xFF;

         PORTB = 0xFF;

}


/*****蜂鸣器函数*****/

void beep()

{

         beep_0;

         Delay_ms(100);

         beep_1;

         Delay_ms(100);

}


/*****温度值显示函数*****/

void TempDisp()

{

         LocateXY(6,1);

         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);

         lcd_wdat('C');

}


/*****DS18B20正常时的菜单函数*****/

void MenuOk()

{

         LCD_write_str(0,0,line1_data);

         LCD_write_str(0,1,line2_data);

}


/*****DS18B20出错时的菜单函数*****/

void MenuError()

{

         lcd_clr();

         LCD_write_str(0,0,menu1_error);

         LCD_write_str(0,1,menu2_error);

         LocateXY(11,1);

         lcd_wdat(0xDF);

         lcd_wdat('C');

}


/*****读取温度值函数*****/

void GetTemperture(void)

{

         SREG = 0x00;

         Init_DS18B20();

         IF(yes0==0)

         {

                  WriteOneByte(0xCC);

                WriteOneByte(0x44);

                Delay_ms(1000);

                Init_DS18B20();

                WriteOneByte(0xCC);

                WriteOneByte(0xBE);

                temp_data[0] = ReadOneByte();

                temp_data[1] = ReadOneByte();

                temp_flag = 1;

         }

         else temp_flag = 0;

         SREG = 0x80;

}


/*****温度数据转换函数*****/

void TempConv()

{

         uchar sign = 0;

         uchar temp;

         if(temp_data[1]>127)

         {

                  temp_data[0] = (~temp_data[0]) + 1;

                if((~temp_data[0])>=0xFF)

                temp_data[1] = (~temp_data[1]) + 1;

                else temp_data[1]=~temp_data[1];

                sign = 1;

         }

         temp = temp_data[0]&0x0F;

         disp_buf[0] = (temp*10/16) + 0x30;

         temp_comp = ((temp_data[0]&0xF0)>>4)|((temp_data[1]&0x0F)<<4);

         disp_buf[3] = temp_comp/100 + 0x30;

         temp = temp_comp % 100;

         disp_buf[2] = temp/10 + 0x30;

         disp_buf[1] = temp%10 + 0x30;

         if(disp_buf[3] == 0x30)

         {

                  disp_buf[3] = 0x20;

                if(disp_buf[2] == 0x30)

                disp_buf[2] = 0x20;

         }

         if(sign)

         disp_buf[3] = 0x2D;

}


/*****主函数*****/

void main(void)

{

         port_init();

         PortDS18B20_Init();

         lcd_init();

         lcd_clr();

         while(1)

         {

                  GetTemperture();

                if(temp_flag == 0)

                {

                         beep();

                        MenuError();

                }

                if(temp_flag == 1)

                {

                         TempConv();

                        MenuOk();

                        TempDisp();

                }

         }

}



/*****  #include"1602LCD_drive.h"  *****/

/****us延时函数*****/


void delay_us(unsigned int n)

{

         if(n == 0)

         return;

         while(--n);

}


/*****ms延时函数*****/

void Delay_ms(uint xms)

{

         int i,j;

         for(i=0;i         {for(j=0;j<1140;j++);}

}


/*****LCD忙碌检查函数*****/

uchar lcd_busy()

{

          uchar result;

          DDRA = 0x00;

          RS_0;

          RW_1;

          EN_1;

          delay_us(40);

          result = PINA&0x80;

          EN_0;

          return result;

}


/*****写指令寄存器IR函数*****/

void lcd_wcmd(uchar cmd)

{

         DDRA = 0xFF;

         while(lcd_busy());

         RS_0;

         RW_0;

         EN_0;

         PORTA = cmd;

         delay_us(40);

         EN_1;

         delay_us(40);

         EN_0;

}


/*****写寄存器DR函数*****/

void lcd_wdat(uchar dat)

{

         DDRA = 0xFF;

         while(lcd_busy());

         RS_1;

         RW_0;

         EN_0;

         PORTA = dat;

         delay_us(40);

         EN_1;

         delay_us(40);

         EN_0;         

}


/*****LCD清屏函数*****/

void lcd_clr()

{

         lcd_wcmd(0x01);

         Delay_ms(5);

}


/*****LCD初始化函数*****/

void lcd_init()

{

         Delay_ms(15);

         while(lcd_busy());

         lcd_wcmd(0x38);

         Delay_ms(10);

         while(lcd_busy());

         lcd_wcmd(0x38);

         Delay_ms(10);

         while(lcd_busy());

         lcd_wcmd(0x38);

         Delay_ms(10);

         while(lcd_busy());

         lcd_wcmd(0x0c);

         Delay_ms(10);

         while(lcd_busy());

         lcd_wcmd(0x06);

         Delay_ms(10);

         while(lcd_busy());

         lcd_wcmd(0x01);

[1] [2]
关键字:AVR单片机  DS18B20  LCD显示 引用地址:AVR单片机采集DS18B20并LCD显示

上一篇:如何解决AVR单片机烧写过程中弄错熔丝位而造
下一篇:为什么AVR单片机需要写1作为清0中断标志位

推荐阅读最新更新时间:2024-11-09 09:58

51单片机多路测温报警系统(AT89C51、多个DS18B20、LCD1602)
一、简介 此系统主要由AT89C51、多个DS18B20温度模块和LCD1602组成。 大致的原理是多个DS18B20按顺序采集温度到的数据传送给AT89C51的P2.7,最后通过LCD1602显示当前的实时温度,按键可以设置上下限温度,根据温度判断是否需要报警。 二、运行效果图 模拟仿真运行 三、部分代码 /*想要更多项目私wo!!!*/ #include reg52.h #include intrins.h unsigned int iTempDataH; unsigned int SetTemp = 30; int SetTemp1 = 1; int num = 0; //ÅжÏæָÁî void
[单片机]
51单片机多路测温报警系统(AT89C51、多个<font color='red'>DS18B20</font>、LCD1602)
STM32入门学习笔记之TFTLCD显示实验2
Bit 19:成组写使能位 0:写操作始终处于异步模式 1:写操作为同步模式 Bit 14:EXTMOD:扩展模式使能(即允许读和写使用不同的时序) 0:不使用FSMC_BWTR寄存器(默认) 1:FSMC使用FSMC_BWTR寄存器 Bit 13:等待使能位 0:禁用NWAIT信号,在设置的闪存保持周期之后不会检测NWAIT信号插入等待状态 1:使用NWAIT信号,在设置的闪存保持周期之后根据NWAIT信号插入等待状态(默认) Bit 12:写使能位 0:禁止FSMC对存储器的写操作,否则产生一个AHB错误 1:允许FSMC对存储器的写操作(默认) Bit 11:配置等待时序 0:N
[单片机]
u-boot支持LCD显示(基于TQ2440)
平台简介 Linux版本:Linux-3.14 u-boot版本:u-boot-2015.04 硬件:TQ2440(内存:64MB NandFlash:256MB) 作者:彭东林 邮箱: pengdonglin137@163.com 摘要 这个版本的u-boot支持LCD很容易,期间,参考了tq2440官方u-boot中的LCD驱动。我们只需要在配置文件中配置相应的宏,实现LCD的初始化和使能函数即可。 代码我已经上传到CSDN上了, git@code.csdn.net:pengdonglin137/u-boot.git 其中一共有两个分支,一个是master分支,用于跟踪u-boot的最近分支,另一个是u-boot-2015
[单片机]
基于51单片机+DS18B20温度测温器+LCD1602显示
DS18B20特性 1.独特的单总线接口,就需一条线则可实现双向通信(测温) 2.测温范围:-55℃~+125℃,可通过编程设定9—12位分辨率,对应分辨温度分别为0.5、0.25、0.125、0.0625℃。 3.支持多点组网(可连接多个DS18B20温度传感器),多个DS18B20可以并联(3或2线)实现多个组网测温,但注意超过8个要解决好供电问题,否则电压过低会导致传输不稳定,从而数据不准确。 4.工作电压:3.0~5.5V (寄生电源方式下可由数据线供电) 5.在使用过程中不需要外围电路,全部传感元件及转换电路都在芯片内了。(上拉电阻) 6.测温结果直接是数字量输出,单总线串行传送方式,同时可传送CRC校验码(校验数据采集
[单片机]
基于51单片机+<font color='red'>DS18B20</font>温度测温器+LCD1602显示
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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