scanf_s123456 2024-06-16 11:48 采纳率: 66.7%
浏览 2

LCD1602显示代码编写

img


这是一个基于单片机的pt100热敏电阻数字温度计,电压采集芯片为ADC0804,求以此为基础编写的LCD1602显示代码,管脚定义为RS = P2^2; RW = P2^1; EN = P2^0;

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-16 11:48
    关注

    引自免费微信小程序:皆我百晓生

    要实现基于51单片机的PT100热敏电阻数字温度计,并在LCD1602上显示温度,我们需要结合ADC0804的读取和LCD1602的显示功能。以下是整合了AD转换、温度计算以及LCD显示的完整代码示例。

    定义管脚和初始化LCD

    首先,定义单片机管脚和LCD初始化子程序。管脚定义如下:RS = P2^2, RW = P2^1, EN = P2^0

    #include <reg51.h>
    
    #define RS P2_2
    #define RW P2_1
    #define EN P2_0
    
    // LCD1602初始化子程序
    void lcd_init() {
        // 初始化指令
        lcd_cmd(0x38);
        lcd_cmd(0x0C);
        lcd_cmd(0x01);
        
        // 延时
        _delay_ms(2);
    }
    
    // 发送命令到LCD
    void lcd_cmd(unsigned char cmd) {
        P0 = cmd;
        RS = 0;
        RW = 0;
        EN = 1;
        _delay_ms(1);
        EN = 0;
    }
    
    // 在LCD上显示字符
    void lcd_display_char(unsigned char data) {
        P0 = data;
        RS = 1;
        RW = 0;
        EN = 1;
        _delay_ms(1);
        EN = 0;
    }
    
    // 在指定位置显示字符串
    void lcd_display_string(unsigned char x, unsigned char y, char *str) {
        lcd_move(x, y);
        while (*str != '\0') {
            lcd_display_char(*str++);
        }
    }
    
    // 移动光标位置
    void lcd_move(unsigned char x, unsigned char y) {
        unsigned char addr;
        if (y == 0) {
            addr = 0x80 + x;
        } else if (y == 1) {
            addr = 0xC0 + x;
        }
        lcd_cmd(addr);
    }
    

    AD转换和温度计算

    接下来,使用ADC0804进行AD转换并计算温度。

    // ADC0804相关管脚定义
    sbit CS = P2^4;
    sbit RD = P2^7;
    sbit WR = P2^6;
    sbit INTR = P2^5;
    
    // 启动AD转换子程序
    void start_ad() {
        CS = 0;
        WR = 0;
        _nop_();
        WR = 1;
        while(INTR);
        CS = 1;
    }
    
    // 读取AD转换后的数据
    unsigned int read_ad() {
        unsigned int ad_data;
        CS = 0;
        RD = 0;
        _nop_();
        ad_data = P0;
        RD = 1;
        CS = 1;
        return ad_data;
    }
    
    // 数据处理函数
    void data_shout(unsigned int ad_data) {
        float temp;
        unsigned int T;
        if (ad_data < 79) {
            temp = 614.422 - 7.811 * ad_data;
        } else if (ad_data <= 204) {
            temp = 7.990 * ad_data - 628.491;
        } else {
            temp = 8.124 * ad_data - 655.742;
        }
        T = (unsigned int)temp;
        static unsigned char dat_AD[4];
        dat_AD[0] = T / 1000;
        dat_AD[1] = T % 1000 / 100;
        dat_AD[2] = T % 100 / 10;
        dat_AD[3] = T % 10;
    }
    
    // 主函数
    void main() {
        lcd_init();
        while(1) {
            start_ad();
            unsigned int ad_data = read_ad();
            data_shout(ad_data);
            
            // 显示温度
            char str[10];
            sprintf(str, "Temp: %d.%d%d", dat_AD[0], dat_AD[1], dat_AD[2]);
            lcd_display_string(0, 0, str);
        }
    }
    

    这个代码示例包含了从ADC0804读取数据、计算温度并最终在LCD1602上显示温度的过程。注意,_delay_ms()是一个延时函数,用于确保LCD和AD转换器有足够的反应时间。这个函数的具体实现可能需要根据你的开发环境来调整。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月16日

悬赏问题

  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价
  • ¥15 在anaconda上pytorch和paddle paddle下载报错
  • ¥25 自动填写QQ腾讯文档收集表