采集温度用DS18B20,显示采用数码管或者LCD1602,这里采用LCD方案
目录
前言
在51单片机的设计中,采取DS18B20采集温度,用LCD1602显示温度,通过用串口通信实现。
提示:以下是本篇文章正文内容,下面案例可供参考
一、a机显示温度
代码如下:
各种引脚定义,包括lcd的数据总线,
#define LCD1602_DB P1
#define MAIN_Fosc 11059200ULtypedef unsigned char uchar;
typedef unsigned int uint;typedef unsigned char INT8U;
typedef unsigned int INT16U;
unsigned int temp_sz[5];
unsigned int temp;
unsigned int num=0;
unsigned int display_flag=0;
unsigned int bai,shi,ge;sbit KEY = P2^0;
sbit a_control_b_sign = P2^5;
sbit b_control_a_sign = P2^6;
sbit LCD1602_RS = P3^5;
sbit LCD1602_RW = P3^6;
sbit LCD1602_EN = P3^4;
用函数判断led忙,并等待
void Read_Busy()
{
uchar busy;
LCD1602_DB = 0xff;
LCD1602_RS = 0;
LCD1602_RW = 1;
do
{
LCD1602_EN = 1;
busy = LCD1602_DB;
LCD1602_EN = 0;
}while(busy & 0x80);
}
主函数
void main(void)
{
uint i;
uchar L, M;
Init_LCD1602();
UART_init();while(1)
{
if(KEY == 0)
{
a_control_b_sign = 0;
}
if(KEY == 1)
{
a_control_b_sign = 1;
}
if(b_control_a_sign == 0)
{
display_flag = 1;
}
if(b_control_a_sign == 1)
{
display_flag = 0;
}
if(display_flag == 1)
{
LCD1602_Dis_OneChar(0,0,bai+0x30);
LCD1602_Dis_OneChar(1,0,shi+0x30);
LCD1602_Dis_OneChar(2,0,'.');
LCD1602_Dis_OneChar(3,0,ge+0x30);
LCD1602_Dis_OneChar(4,0,'C');
}
if(display_flag == 0)
{
LCD1602_Dis_OneChar(0,0,' ');
LCD1602_Dis_OneChar(1,0,' ');
LCD1602_Dis_OneChar(2,0,' ');
LCD1602_Dis_OneChar(3,0,' ');
LCD1602_Dis_OneChar(4,0,' ');
}
bai = temp/100;
shi = temp/10%10;
ge = temp%10;
}
}
对于a机显示的代码,可以采取调用头文件的方法,将LCD1602的代码全部放进头文件中可以让代码更加简
二、b机采集温度
1.引脚定义
代码如下(示例):
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned char INT8U;
typedef unsigned int INT16U;
unsigned int temp_sz[5];
unsigned int temp,num;
volatile unsigned char sending;
unsigned int bai,shi,ge;
sbit beep = P2^0;
sbit DS = P2^2;
sbit a_control_b_sign = P2^5;
sbit b_control_a_sign = P2^6;
sbit KEY = P2^7;
sbit LCD1602_RS = P3^5;
sbit LCD1602_RW = P3^6;
sbit LCD1602_EN = P3^4;
2.主函数
代码如下(示例):
void main(void)
{
uint i;
uchar L, M;
UART_init();
while(1)
{
ds_init();
write_byte(0xcc);
write_byte(0x44);
ds_init();
write_byte(0xcc);
write_byte(0xbe);
L = read_byte();
M = read_byte();
i = M;
i <<= 8;
i |= L;
i = i * 0.0625 * 10 + 0.5;
temp = i;
if(temp >= 850)
{
if(a_control_b_sign == 0)
{
beep = 0;
}
if(a_control_b_sign == 1)
{
beep = 1;
}
}
if(temp < 850)
{
beep = 1;
}
if(KEY == 0)
{
b_control_a_sign = 0;
}
if(KEY == 1)
{
b_control_a_sign = 1;
}
bai = temp/100;
shi = temp/10%10;
ge = temp%10;
temp_sz[0] = bai + 0x30;
temp_sz[1] = shi + 0x30;
temp_sz[2] = ge + 0x30;
for(num=0;num<3;num++)
{
send(temp_sz[num]);
}
}
}
通过按键控制,当按键按下的时候,如果温度大于85°,则蜂鸣器报警;另外一个的按键控制LCD1602的显示;
在硬件设计时,由于按键不好控制,我们可以采取用一个电钮开关即可实现这样的功能。
发送字节数据
void send(unsigned char d)
{
SBUF=d;
sending=1;
while(sending);
}
串口初始化
void UART_init()
{
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
SM0 = 0;
SM1 = 1;
REN = 1;
EA = 1;
ES = 1;
}
总结
通过串口实现两个单片机的通信,简单功能的实现其实只用一个单片机就可以实现,这里为了实现串口通信而采取两机。
仿真原理图如下