ds18b20温度传感器 lcd C语言,基于AVR单片机的18B20温度传感器及LCD显示的C语言程序设计...
***************************************************/
#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显示函数
}
}
}
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号
享受更多官方福利
推荐阅读
AVR单片机需要设置合适的熔丝位才能实现其功能,如果熔丝位设置的不对将有可能导致单片机自锁,这是我整理的AVR单片机熔丝位的设置及拯救方,希望对大家有帮助。
发表于 2020-09-17
单片机源程序如下:/***版权所有(c)2018,艁ukasz Marcin Podkalicki*2009年12月13日 *简单定时器(启动/复位/停止),使用基于TM1637的一个按钮和7段显示模块。 * *注意,这个ATtiny13项目使用的内部时钟并不精确  
发表于 2020-09-16
为0到9,分别表示LED的占空比为0/9到9/9。比如,当占空比为4/9时,在9毫秒的周期中,前4毫秒LED亮,后5毫秒LED不亮。可以看见,占空比越大,LED亮度也越高。原来,在亮与暗之间,LED还有中间的状态。我们不是通过让引脚输出一个0V和5V之间的电压,而是让引脚电平迅速地在高低之间变化来实现的。这种通过电平的快速跳变来实现模拟量效果的技术,称为脉冲宽度调制,简称PWM。定时器大多数单片机的定时器都可以输出PWM波,外设丰富的AVR单片机自然不例外。上一讲提到定时器0有四种工作模式,后两种就是快速PWM模式与相位修正PWM模式。在快速PWM模式中,TCNT0寄存器的动作与普通模式相同,但还可以把OCR0A作为上限。对于非反转输出
发表于 2020-09-09
7)接到一个单片机引脚上。关于为什么会有这种诡异的接法,这是设计时的失误(也可能是不得已吧,毕竟单片机的32个IO已经占满了),参见:一个低电平引发的思考。协议1602与单片机之间是通过并行总线通信的。AVR单片机硬件上不支持并行总线,需要通过软件模拟时序来实现。写操作的时序如下:进行一个写操作,需要先让RS根据写的类型设置电平,R/W输出低电平,D0~D7输出要发送的数据,然后在E的上升沿数据被对方读取,并保持R/W与D0~D7电平不变,直到E的下降沿之后。两次E的上升沿之间至少需要400us时间间隔。1602共有8条指令,都是一字节长度的。从高位到低位,每一条指令都由若干个0、一个1和有效指令组成,使得没有两条指令会有相同的二进制
发表于 2020-09-09
在第一期中,我们已经开始使用UART来实现单片机开发板与计算机之间的通信,但只是简单地讲了讲一些概念和库函数的使用。在这一篇教程中,我们将从硬件与软件等各方面更深入地了解UART。USART组件一直在讲的UART其实是USART组件的一部分,USART比UART多了同步的一部分,但这一部分用得太少(我从来没用过),而且缺乏实例,所以就略过了。然而,单片机的设计者很机智地把这个鸡肋功能升华了一下,USART组件可以支持SPI模式。SPI是一种同步串行总线,可以支持很高的传输速率。这个功能使得ATmega324PA支持最多3个SPI通道,其中一个是纯SPI,另两个就是SPI模式下的USART。我们将在下一讲中揭开SPI的神秘面纱。回到
发表于 2020-09-08
开发板上有4个按键,我们可以把每一个按键连接到一个单片机引脚上,来实现按键状态的检测。但是常见的键盘有104键,是每一个键分别连接到一个引脚上的吗?我没有考证过,但我们确实有节省引脚的方法。矩阵键盘这是一个4*4的矩阵键盘,共有16个按键只需要8个引脚就可以驱动。我们先来看看它的原理。每个按键有两个引脚,当按键按下时接通。每一行的一个引脚接在一起,分别连接到左边4个端口,称为“行引脚”;每一列的另一个引脚接在一起,分别连接到右边的4个端口,称为“列引脚”。这就是矩阵键盘内部的电路连接方式。那么如何驱动它呢?首先我们简化一下,只考虑第一排:这样就很简单了吧,只要让行引脚保持低电平,4个列引脚设置为输入并开启上拉电阻,读到低电平
发表于 2020-09-08
ds18b20温度传感器 lcd C语言,基于AVR单片机的18B20温度传感器及LCD显示的C语言程序设计...相关推荐
- 单片机包络检波c语言,基于AVR单片机的125kHz简易RFID阅读器设计.PDF
基于AVR单片机的125kHz简易RFID阅读器设计 基于AVR单片机的125 敖 华1,陈渊睿1'2,骆祖国1,李婷1 510640) (1.华南理工大学电力学院,广东广州510640:2.华南理工 ...
- 单片机c语言实训例子基于mega16,基于AVR单片机的mega16内部EEPROM操作C语言程序设计...
原标题:基于AVR单片机的mega16内部EEPROM操作C语言程序设计 #include #include #include #define uchar unsigned char #define ...
- AVR单片机计算器C语言源程序,一个基于AVR单片机的计算器程序.doc
一个基于AVR单片机的计算器程序 #include #include//延时函数的头文件 #include // 中断函数的头文件 #define uint unsigned int #define ...
- 基于AVR单片机PWM功能的数控恒流源研制
随着电子技术的深入发展,各种智能仪器越来越多,涉及领域越来越广,而仪器对电源的要求也越来越高.现今,电源设备有朝着数字化方向发展的趋势.然而绝大多数数控电源设计是通过高位数的A/D和D/A芯片来实现的 ...
- 74hc164驱动数码管c语言程序,基于51单片机的74HC164驱动数码管显示程序与仿真
基于51单片机的74HC164驱动数码管显示程序与仿真 基于51单片机的74HC164驱动一位数码管显示程序与仿真 #include #include #define uchar unsigned c ...
- 单片机8位数码管时钟c语言汇编,基于8051单片机和DS12C8878位数码管显示的时钟.docx...
基于8051单片机和DS12C8878位数码管显示的时钟 #include #include #define sec XBYTE[0xed00]//秒寄存器地址 #define min XBYTE[0 ...
- 基于51单片机的自动浇花系统设计/基于51单片机的智能抽奖系统控制设计/基于51单片机的数字时钟与日历显示控制设计 毕业设计
1147基于51单片机的自动浇花系统设计 设计思路:通湿度传感器实时监测湿度,通过LCD显示出实时的湿度采集值,可以通过按键设定目标界限,当达到这个界限值时,浇花系统的电机装置运行. 电路包含:LCD ...
- 基于51单片机十字路口交通灯_只显示绿灯时间+黄灯5s
基于51单片机十字路口交通灯_只显示绿灯时间+黄灯5s (程序+仿真+参考报告) 仿真:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 编号J011 目录标题 基于5 ...
- 基于51单片机的8位数码管显示的可调时电子时钟
基于51单片机的8位数码管显示的可调时电子时钟 本人大二本科生,第一次发东西,功能比较简单,代码有点复杂,希望能有大神指正. 基于51单片机的不可调时间的时钟显示,晶振为11.0592MHZ,60H ...
最新文章
- 病毒及***防御手册之一
- 【深度学习入门到精通系列】神经进化 (NeuroEvolution)
- 分布式事务 dtc 的使用
- 关于Ubuntu的默认python版本
- 进程中的信号赋值与变量赋值
- 运行报错Error:(29, 41) java: 无法将类 com.imooc.dataobject.ProductCategory中的构造器 ProductCategory应用到给定类型
- AS3.1.2配置gradle阿里云镜像(可用)
- netty权威指南学习笔记一——NIO入门(4)AIO
- Windows 硬盘分区整数大小计算
- 数据处理中常用的Excel函数
- 数据恢复陶工希捷ST1000DM003硬盘不识别系统不认盘数据恢复
- 1. Hadoop原理简述
- 11中常见的句法成分
- OpenStreetMap初探(一)——了解OpenStreetMap
- 华为p60pro和mate50pro哪个好 华为p60pro和mate50pro参数对比
- wpa_supplicant 工具操作wifi模块
- Qt MetaObject sysmtem 详解之三:QMetaObject接口实现
- android handler的机制和原理_Android完整知识体系路线(菜鸟-资深-大牛必进之路)
- Allegro导出元器件pad坐标和网络(附带ODB++插件下载)
- 解决邮件客户端QQ Mail及Thunderbird无法登入Outlook的问题