51单片机 1602液晶字符滚动演示+Proteus仿真

51单片机 1602液晶字符滚动演示+Proteus仿真


  • Proteus仿真
    在这里插入图片描述

主程序代码

/*************** ******************/
#include <reg52.h>
#include <string.h>
#define uchar 
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,你需要在 Proteus 中添加 51 单片机和 DS18B20 温度传感器、HC-SR04 超声波测距模块以及 1602A 液晶显示屏。 接下来,你需要编写 51 单片机的程序,用于读取 DS18B20 传感器的温度和 HC-SR04 模块的距离,并将它们显示在 1602A 液晶显示屏上。 以下是一个简单的示例程序: ``` #include <reg52.h> #include <stdio.h> #define LCD_RS P1_0 #define LCD_RW P1_1 #define LCD_E P1_2 #define LCD_DATA P2 sbit Trig = P3^5; // 超声波模块触发管脚 sbit Echo = P3^2; // 超声波模块回波管脚 sbit DQ = P3^7; // 温度传感器管脚 unsigned char idata temp[5]; // 存储温度值 unsigned char idata dis[5]; // 存储距离值 void delay(unsigned int x) // 延时函数 { unsigned int i, j; for (i = x; i > 0; i--) { for (j = 110; j > 0; j--); } } void write_command(unsigned char cmd) // 写命令函数 { LCD_RS = 0; LCD_RW = 0; LCD_E = 1; LCD_DATA = cmd; delay(5); LCD_E = 0; } void write_data(unsigned char dat) // 写数据函数 { LCD_RS = 1; LCD_RW = 0; LCD_E = 1; LCD_DATA = dat; delay(5); LCD_E = 0; } void init_lcd() // 初始化液晶屏函数 { write_command(0x38); write_command(0x0c); write_command(0x06); write_command(0x01); delay(20); } void write_string(unsigned char x, unsigned char y, unsigned char *s) // 写字符串函数 { unsigned char i = 0; if (y == 0) { write_command(0x80 + x); } else { write_command(0xc0 + x); } while (s[i] != '\0') { write_data(s[i]); i++; } } void ds18b20_init() // 初始化温度传感器函数 { DQ = 1; delay(1); DQ = 0; delay(480); DQ = 1; delay(60); } void ds18b20_write(unsigned char dat) // 写入温度传感器函数 { unsigned char i; for (i = 0; i < 8; i++) { DQ = 0; DQ = dat & 0x01; delay(6); DQ = 1; dat >>= 1; } } unsigned char ds18b20_read() // 读取温度传感器函数 { unsigned char i, dat = 0; for (i = 0; i < 8; i++) { DQ = 0; dat >>= 1; DQ = 1; if (DQ) { dat |= 0x80; } delay(6); } return dat; } void ds18b20_convert() // 转换温度函数 { ds18b20_init(); ds18b20_write(0xcc); ds18b20_write(0x44); } void ds18b20_readtemp() // 读取温度函数 { unsigned char i; ds18b20_init(); ds18b20_write(0xcc); ds18b20_write(0xbe); for (i = 0; i < 5; i++) { temp[i] = ds18b20_read(); } } void ultrasonic_init() // 初始化超声波模块函数 { Trig = 0; } void ultrasonic_send() // 发送超声波函数 { Trig = 1; delay(10); Trig = 0; } void ultrasonic_receive() // 接收超声波函数 { unsigned int i, j; if (Echo == 1) { while (Echo == 1); i = TH0; j = TL0; dis[0] = i / 100 + '0'; dis[1] = i % 100 / 10 + '0'; dis[2] = i % 10 + '0'; dis[3] = '.'; dis[4] = j / 10 + '0'; } } void main() { TMOD = 0x11; // 定时器 T0 和 T1 工作方式都为模式 1 TH1 = 0xfd; // 定时器 T1 计数初值,用于波特率设置 TL1 = 0xfd; TR1 = 1; // 启动定时器 T1 PCON = 0x80; // 波特率加倍 SCON = 0x50; // 串口工作方式为模式 1,允许接收 ES = 1; // 允许串口中断 EA = 1; // 允许总中断 TH0 = 0; TL0 = 0; ultrasonic_init(); init_lcd(); write_string(0, 0, "Temp:"); write_string(0, 1, "Dist:"); while (1) { ds18b20_convert(); delay(100); ds18b20_readtemp(); ultrasonic_send(); while (!Echo); TR0 = 1; while (Echo); TR0 = 0; ultrasonic_receive(); write_string(6, 0, temp); write_string(6, 1, dis); delay(1000); } } void ser() interrupt 4 // 串口中断函数 { if (RI == 1) { RI = 0; } if (TI == 1) { TI = 0; } } ``` 这个程序使用 51 单片机来读取 DS18B20 温度传感器和 HC-SR04 超声波测距模块的数据,然后将它们显示在 1602A 液晶显示屏上。程序通过串口将数据发送到计算机上,可以使用串口助手等工具来查看数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值