Beginner_lx 2023-12-09 11:49 采纳率: 100%
浏览 6
已结题

基于51单片机的C语言程序修改

51单片机LCD显示三个温度传感器的均值(浮点型),需要补充代码。


#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}

sbit DQ1 = P3^3;
sbit DQ2 = P3^4;
sbit DQ3 = P3^5;
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;

uchar code Temp_Disp_Title[]={"Current Temp : "};
uchar Current_Temp_Display_Buffer[]={" TEMP:   "};

uchar code Temperature_Char[8] =
{
     0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00
};

uchar code df_Table[]=
{
     0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9
};

uchar CurrentT = 0;
uchar Temp_Value[]={0x00,0x00};
uchar Display_Digit[]={0,0,0,0};
bit DS18B20_IS_OK = 1;

void DelayXus(uint x)
{
     uchar i;
    while(x--)
    {
         for(i=0;i<200;i++);
    }
}

bit LCD_Busy_Check()
{
     bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    delayNOP();
    result = (bit)(P0&0x80);
    LCD_EN=0;
    return result;
}

void Write_LCD_Command(uchar cmd)
{
    while(LCD_Busy_Check());
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    _nop_();
    _nop_();
    P0 = cmd;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;
}

void Write_LCD_Data(uchar dat)
{
    while(LCD_Busy_Check());
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    P0 = dat;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;
}

void LCD_Initialise()
{
     Write_LCD_Command(0x01);
    DelayXus(5);
    Write_LCD_Command(0x38);
    DelayXus(5);
    Write_LCD_Command(0x0c);
    DelayXus(5);
    Write_LCD_Command(0x06);
    DelayXus(5);
}

void Set_LCD_POS(uchar pos)
{
     Write_LCD_Command(pos|0x80);
}

void Delay(uint x)
{
     while(--x);
}

uchar Init_DS18B20()
{
     uchar status;
    DQ1 = 1;
    Delay(8);
    DQ1 = 0;
    Delay(90);
    DQ1 = 1;
    Delay(8);
    DQ1 = 1;
    DQ2 = 1;
    Delay(8);
    DQ2 = 0;
    Delay(90);
    DQ2 = 1;
    Delay(8);
    DQ2 = 1;
    DQ3 = 1;
    Delay(8);
    DQ3 = 0;
    Delay(90);
    DQ3 = 1;
    Delay(8);
    DQ3 = 1;
    return status;
}

uchar ReadOneByte()
{
     uchar i,dat=0;
    DQ1 = 1;
    DQ2 = 1;
    DQ3 = 1;
    _nop_();
    for(i=0;i<8;i++)
    {
         DQ1 = 0;
        DQ2 = 0;
        DQ3 = 0;
        
        dat >>= 1;
        DQ1 = 1;
        DQ2 = 1;
        DQ3 = 1;
        _nop_();
        _nop_();
        if(DQ1,DQ2,DQ3)
            dat |= 0X80;
        Delay(30);
        DQ1 = 1;
        DQ2 = 1;
        DQ3 = 1;
    }
    return dat;
}

void WriteOneByte(uchar dat)
{
     uchar i;
    for(i=0;i<8;i++)
    {
         DQ1 = 0;
        DQ2 = 0;
        DQ3 = 0;
        DQ1 = dat& 0x01;
        DQ2 = dat& 0x01;
        DQ3 = dat& 0x01;
        Delay(5);
        DQ1 = 1;
        DQ2 = 1;
        DQ3 = 1;
        dat >>= 1;
    }
}

void Read_Temperature()
{
     if(Init_DS18B20()==1)
        DS18B20_IS_OK=0;
    else
    {
        WriteOneByte(0xcc);
        WriteOneByte(0x44);
        Init_DS18B20();
        WriteOneByte(0xcc);
        WriteOneByte(0xbe);
        Temp_Value[0] = ReadOneByte();
        Temp_Value[1] = ReadOneByte();
        DS18B20_IS_OK=1;
    }
}

void Display_Temperature()
{
     uchar i;
    uchar t = 150, ng = 0;
    if((Temp_Value[1]&0xf8)==0xf8)
    {
         Temp_Value[1] = ~Temp_Value[1];
        Temp_Value[0] = ~Temp_Value[0]+1;
        if(Temp_Value[0]==0x00)
            Temp_Value[1]++;
        ng = 1;
    }
    Display_Digit[0] = df_Table[Temp_Value[0]&0x0f];
    CurrentT = ((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4);
    Display_Digit[3] = CurrentT/100;
    Display_Digit[2] = CurrentT%100/10;
    Display_Digit[1] = CurrentT%10;
    Current_Temp_Display_Buffer[11] = Display_Digit[0] + '0';
    Current_Temp_Display_Buffer[10] = '.';
    Current_Temp_Display_Buffer[9]  = Display_Digit[1] + '0';
    Current_Temp_Display_Buffer[8]  = Display_Digit[2] + '0';
    Current_Temp_Display_Buffer[7]  = Display_Digit[3] + '0';
    if(Display_Digit[3] == 0)
        Current_Temp_Display_Buffer[7]  = ' ';
    if(Display_Digit[2] == 0&&Display_Digit[3]==0)
        Current_Temp_Display_Buffer[8]  = ' ';
    if(ng)
    {
         if(Current_Temp_Display_Buffer[8]  == ' ')
            Current_Temp_Display_Buffer[8]  = '-';
        else if(Current_Temp_Display_Buffer[7]  == ' ')
            Current_Temp_Display_Buffer[7]  = '-';
        else
            Current_Temp_Display_Buffer[6]  = '-';
    }
    Set_LCD_POS(0x00);
    for(i=0;i<16;i++)
    {
        Write_LCD_Data(Temp_Disp_Title[i]);
    }
    Set_LCD_POS(0x40);
    for(i=0;i<16;i++)
    {
        Write_LCD_Data(Current_Temp_Display_Buffer[i]);
    }
    Set_LCD_POS(0x4d);
    Write_LCD_Data(0x00);
    Set_LCD_POS(0x4e);
    Write_LCD_Data('C');
}

void main()
{
     LCD_Initialise();
    Read_Temperature();
    Delay(50000);
    Delay(50000);
    while(1)
    {
         Read_Temperature();
        if(DS18B20_IS_OK)
            Display_Temperature();
        DelayXus(100);
    }

}






  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-12-09 14:02
    关注

    【相关推荐】



    • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7724170
    • 这篇博客你也可以参考下:51单片机LCD显示温度与串口接受温度
    • 除此之外, 这篇博客: 基于51的电压采集并LCD显示的系统中的 程序设计 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
      1. 串口初始化 ,掉用简单的51串口初始化,用定时器定义波特率;
      2. 与AD数据交互 ,通过串行的ADC移位输入;
      3. 数据处理 ,单片机内部操作一下,处理一下接受的数据(毕竟51就测量个5v,但是实际上还得把数值放大回去);
      4. LCD显示 ,位置码和显示码相互结合操作
        软件流程图,画的很草率

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月1日
  • 已采纳回答 3月24日
  • 创建了问题 12月9日

悬赏问题

  • ¥15 锌合金的耐温能到多少度。可以持续多长时间
  • ¥15 .net调用本地office组件出现问题
  • ¥15 docker镜像拉取失败请教教我
  • ¥15 https访问nginx上的http
  • ¥15 需要完整规则的五子棋博弈代码
  • ¥15 Hadoop的部署与安装的一些疑问
  • ¥15 短剧的sdk在哪里接入
  • ¥30 智能割草机自动化割草
  • ¥15 求:可不可以提供一些 在国内可以用,低代码不要太难 在电脑上可以下载的 制作app的软件
  • ¥15 fluke高精度万用表8845A型号测交流电压一直跳动,且去掉输入后显示不归零