51单片机实现串行通信----a机显示温度,b机采集温度并通过两个按键实现控制显示和蜂鸣器报警

51单片机的串口通信————温度采集和显示

采集温度用DS18B20,显示采用数码管或者LCD1602,这里采用LCD方案


 

目录

前言

一、a机显示温度

二、b机采集温度

1.引脚定义

2.主函数

总结


 


前言

在51单片机的设计中,采取DS18B20采集温度,用LCD1602显示温度,通过用串口通信实现。


提示:以下是本篇文章正文内容,下面案例可供参考

一、a机显示温度

代码如下:

各种引脚定义,包括lcd的数据总线,

#define LCD1602_DB P1    
#define MAIN_Fosc        11059200UL    

typedef 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;       
}


总结

通过串口实现两个单片机的通信,简单功能的实现其实只用一个单片机就可以实现,这里为了实现串口通信而采取两机。

仿真原理图如下

 

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值