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

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

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

#include

#include

#define uchar unsigned char

#define uint unsigned int

#include " LCD_drive.h" //包含LCD驱动程序软件包

#include "DS _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 GetTempe re(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; //温度数据读取完成后再开中断

}

/********温度数据转换函数,将温度数据转换为适合 的数据********/

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显示函数

}

}

}

责任编辑:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一章:AVR单片机C语言程序设计概述 1.1 AVR单片机简介 1.2 AVR Studio+WinAVR开发环境安装及应用 1.3 AVR-GCC程序设计基础 1.4 程序与数据内存访问 1.5 I/O端口编程 1.6 外设相关寄存器及应用 1.7 中断服务程序 1.8 GCC在AVR单片机应用系统开发中的优势 第二章:PROTEUS操作基础 2.1 PROTEUS操作界面简介 2.2 仿真电路原理图设计 2.3 元件选择 2.4 仿真运行 2.5 PROTEUS与AVR Studio的联合调试 2.6 PROTEUS在AVR单片机应用系统开发中的优势 第三章:基础程序设计 3.1 闪烁的LED 3.2 左右来回的流水灯 3.3 花样流水灯 3.4 LED模拟交通灯 3.5 单只数码管循环显示0~9 3.6 8只数码管滚动显示单个数字 3.7 8只数码管显示多个不同字符 3.8 K1~K4控制LED移位 3.9 数码管显示4×4键盘矩阵按键 3.10 数码管显示拨码开关编码 3.11 继电器控制照明设备 3.12 开关控制报警器 3.13 按键发音 3.14 INT0中断计数 3.15 INT0及INT1中断计数 3.16 TIMER0控制单只LED闪烁 3.17 TIMER0控制的流水灯 3.18 TIMER0控制数码管扫描显示 3.19 TIMER1控制交通指示灯 3.20 TIMER1与TIMER2控制十字路口秒计时显示屏 3.21 用工作于计数方式的T/C0实现100以内的按键计数 3.22 用定时器设计的门铃 3.23 报警器与旋转灯 3.24 100000秒以内的计时程序 3.25 用TIMER1输入捕获功能设计的频率计 3.26 用工作于异步模式的T/C2控制的可调式数码管电子钟 3.27 TIMER1定时器比较匹配中断控制音阶播放 3.28 用TIMER1输出比较功能调节频率输出 3.29 TIMER1控制的PWM脉宽调制器 3.30 数码管显示两路A/D转换结果 3.31 模拟比较器测试 3.32 EEPROM读写与数码管显示 3.33 Flash程序空间中的数据访问 3.34 单片机与PC机双向串口通讯仿真 3.35 看门狗应用 第四章:硬件应用 4.1 74HC138与74HC154译码器应用 4.2 74HC595串入并出芯片应用 4.3 用74LS148与74LS21扩展中断 4.4 62256扩展内存 4.5 用8255实现接口扩展 4.6 可编程接口芯片8155应用 4.7 可编程外围定时计数器8253应用 4.8 数码管BCD解码驱动器7447与4511应用 4.9 8×8LED点阵屏显示数字 4.10 8位数码管段位复用串行驱动芯片MAX6951应用 4.11串行共阴显示驱动器MAX7219与7221应用 4.12 16段数码管演示 4.13 16键解码芯片74C922应用 4.14 1602字符液晶测试程序 4.15 1602液晶显示DS1302实时时钟 4.16 1602液晶工作于四位模式实时显示当前时间 4.17 2×20串行字符液晶演示 4.18 LGM12864液晶显示程序 4.19 PG160128A液晶图文演示 4.21 TG126410液晶串行模式演示 4.21 用带SPI接口的MCP23S17扩展16位通用IO端口 4.22 用TWI接口控制MAX6953驱动4片5×7点阵显示器 4.23 用TWI接口控制MAX6955驱动16段数码管显示 4.24 用DAC0832生成多种波形 4.25 用带SPI接口的数模转换芯片MAX515调节LED亮度 4.26 正反转可控的直流电机 4.27正反转可控的步进电机 4.28 DS18B20温度传感器测试 4.29 SPI接口温度传感器TC72应用测试 4.30 SHT75温湿度传感器应用 4.31 用SPI接口读写AT25F1024 4.32 用TWI接口读写24C04 4.33 MPX4250压力传感器测试 4.34 MMC存储卡测试 4.35 红外遥控发射与解码仿真 第五章:综合设计 5.1 多首电子音乐的选播 5.2 电子琴仿真 5.3 普通电话机拨号键盘应用 5.4 手机键盘仿真 5.5 数码管模拟显示乘法口诀 5.6 用DS1302与数码管设计的可调电子钟 5.7 用DS1302与LGM12864设计的可调式中文电子日历 5.8 用PG12864LCD设计的指针式电子钟 5.9 高仿真数码管电子钟 5.10 1602LCD显示的秒表 5.11 用DS18B20与MAX6951驱动数码管设计温度报警器 5.12 用1602LCD与DS18B20设计温度报警器 5.13 温控电机在L298驱动下改变速度与方向运行 5.14 PG160128中文显示日期时间及带刻度显示当前温度 5.15 液晶屏曲线显示两路模数转换结果 5.16 用74LS595与74LS154设计的16×16点阵屏 5.17 用8255与74LS154设计的16×16点阵屏 5.18 8×8LED点阵屏仿电梯数字滚动显示 5.19 用内置EEPROM与1602液晶设计的MD5加密电子密码锁 5.20 12864LCD显示24C08保存的开机画面 5.21 12864LCD显示EPROM27C256保存的开机画面 5.22 IIC-AT24C1024×2硬字库应用 5.23 SPI-AT25F2048硬件字库应用 5.24 带液晶显示的红外遥控调速仿真 5.25 能接收串口信息的带中英文硬字库的80×16点阵显示屏 5.26 用AVR与1601LCD设计的计算器 5.27 电子秤仿真设计 5.28 模拟射击训练游戏 5.29 PC机通过485远程控制单片机 5.30 用IE访问AVR+RTL8019设计的以太网应用系统
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值