***************************************************/

#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项目使用的内部时钟并不精确           &nbsp

发表于 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语言程序设计...相关推荐

  1. 单片机包络检波c语言,基于AVR单片机的125kHz简易RFID阅读器设计.PDF

    基于AVR单片机的125kHz简易RFID阅读器设计 基于AVR单片机的125 敖 华1,陈渊睿1'2,骆祖国1,李婷1 510640) (1.华南理工大学电力学院,广东广州510640:2.华南理工 ...

  2. 单片机c语言实训例子基于mega16,基于AVR单片机的mega16内部EEPROM操作C语言程序设计...

    原标题:基于AVR单片机的mega16内部EEPROM操作C语言程序设计 #include #include #include #define uchar unsigned char #define ...

  3. AVR单片机计算器C语言源程序,一个基于AVR单片机的计算器程序.doc

    一个基于AVR单片机的计算器程序 #include #include//延时函数的头文件 #include // 中断函数的头文件 #define uint unsigned int #define ...

  4. 基于AVR单片机PWM功能的数控恒流源研制

    随着电子技术的深入发展,各种智能仪器越来越多,涉及领域越来越广,而仪器对电源的要求也越来越高.现今,电源设备有朝着数字化方向发展的趋势.然而绝大多数数控电源设计是通过高位数的A/D和D/A芯片来实现的 ...

  5. 74hc164驱动数码管c语言程序,基于51单片机的74HC164驱动数码管显示程序与仿真

    基于51单片机的74HC164驱动数码管显示程序与仿真 基于51单片机的74HC164驱动一位数码管显示程序与仿真 #include #include #define uchar unsigned c ...

  6. 单片机8位数码管时钟c语言汇编,基于8051单片机和DS12C8878位数码管显示的时钟.docx...

    基于8051单片机和DS12C8878位数码管显示的时钟 #include #include #define sec XBYTE[0xed00]//秒寄存器地址 #define min XBYTE[0 ...

  7. 基于51单片机的自动浇花系统设计/基于51单片机的智能抽奖系统控制设计/基于51单片机的数字时钟与日历显示控制设计 毕业设计

    1147基于51单片机的自动浇花系统设计 设计思路:通湿度传感器实时监测湿度,通过LCD显示出实时的湿度采集值,可以通过按键设定目标界限,当达到这个界限值时,浇花系统的电机装置运行. 电路包含:LCD ...

  8. 基于51单片机十字路口交通灯_只显示绿灯时间+黄灯5s

    基于51单片机十字路口交通灯_只显示绿灯时间+黄灯5s (程序+仿真+参考报告) 仿真:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 编号J011 目录标题 基于5 ...

  9. 基于51单片机的8位数码管显示的可调时电子时钟

     基于51单片机的8位数码管显示的可调时电子时钟 本人大二本科生,第一次发东西,功能比较简单,代码有点复杂,希望能有大神指正. 基于51单片机的不可调时间的时钟显示,晶振为11.0592MHZ,60H ...

最新文章

  1. 病毒及***防御手册之一
  2. 【深度学习入门到精通系列】神经进化 (NeuroEvolution)
  3. 分布式事务 dtc 的使用
  4. 关于Ubuntu的默认python版本
  5. 进程中的信号赋值与变量赋值
  6. 运行报错Error:(29, 41) java: 无法将类 com.imooc.dataobject.ProductCategory中的构造器 ProductCategory应用到给定类型
  7. AS3.1.2配置gradle阿里云镜像(可用)
  8. netty权威指南学习笔记一——NIO入门(4)AIO
  9. Windows 硬盘分区整数大小计算
  10. 数据处理中常用的Excel函数
  11. 数据恢复陶工希捷ST1000DM003硬盘不识别系统不认盘数据恢复
  12. 1. Hadoop原理简述
  13. 11中常见的句法成分
  14. OpenStreetMap初探(一)——了解OpenStreetMap
  15. 华为p60pro和mate50pro哪个好 华为p60pro和mate50pro参数对比
  16. wpa_supplicant 工具操作wifi模块
  17. Qt MetaObject sysmtem 详解之三:QMetaObject接口实现
  18. android handler的机制和原理_Android完整知识体系路线(菜鸟-资深-大牛必进之路)
  19. Allegro导出元器件pad坐标和网络(附带ODB++插件下载)
  20. 解决邮件客户端QQ Mail及Thunderbird无法登入Outlook的问题

热门文章

  1. 本地---tcpserver与tcpclient
  2. 创建xmlhttp对象
  3. 当我谈跑步时我谈些什么——村上春树
  4. android如何编译出带符号表的.so库
  5. 用map实现数据字典功能
  6. [翻译]Windows Phone 7用户界面框架
  7. Java 实现 淘宝秒杀 聚划算 自己主动提醒 源代码
  8. PowerDesigner将PDM导出生成WORD文档(转)
  9. Hanlder Looper MessageQueue Message
  10. ppt android sdk,《0.AndroidSDK概述.ppt