89c52串口通信+LCD1602显示

接下来我们捡起来lcd1602的显示 与串口通信。实现的功能是通过上位机给单片机通过串口发送信息,然后将发送的信息在lcd1602上显示出来。
(码字好累啊,这是第二遍码字了刚刚这篇博客都要写完了,要粘贴最后代码的时候,被bug掉了,csdn的粘贴代码段千万不要有空行,分分钟要你老命,记得保存到草稿箱)
材料:单片机开发板 lcd1602 单片机小精灵 串口调试助手
1、首先我们新建工程,过程略
2、之前我有写过一lcd的库文件,可以实现简单的显示功能,我们将此头文件打包放在工程根目录下。
打包安放
库文件将在文章最后共享出来
然后设置include paths,把库函数所在文件夹添加进去
设置
程序中也包含进去

#include "lcd.h"

设置一下 lcd.h里的参数,打开原理图
原理图
对应的我们打开lcd.h修改下lcd.h 的参数

#define LCD1602_DATAPINS P0
sbit LCD1602_E=P1^4;
sbit LCD1602_RW=P1^5;
sbit LCD1602_RS=P1^6;

对于这个lcd库函数调用非常方便例如

 LcdInit(); //初始化
 LcdLine(1,1);//把光标定位在第一行第一个单元
 LcdWriteData(‘a’);显示a字符

a

3、然后设置串口中断,这里我偷懒了,用的单片机小精灵直接生成的c语言代码
生成代码
直接复制粘贴就好,然后在这个框架上进行修改,波特率600 这里无所谓,速度慢点而已
复(妈蛋这个复字又删除不了了,赶紧保存一下)。
4、下面是我写的代码

#include "reg52.h"
#include "lcd.h"
void InitUART(void);
void SOneByte(unsigned char c);
void UARTInterrupt(void);
unsigned char k;
unsigned char displaybuf[2][16]={"                ","                "};
unsigned char f1=0;
unsigned char f2=0;
int main()
{
 int a,b;
 InitUART();
 LcdInit(); 
 LcdLine(1,1);
 while(1)
{
 for(a=0;a<2;a++)
 {
  LcdLine(a+1,1);
  for(b=0;b<16;b++)
  LcdWriteData(displaybuf[a][b]);
 }
}
}
void InitUART(void)
{
 TMOD = 0x20;
 SCON = 0x50;
 TH1 = 0xA0;
 TL1 = TH1;
 PCON = 0x80;
 EA = 1;
 ES = 1;
 TR1 = 1;
}
void SOneByte(unsigned char c)
{
 SBUF = c;
 while(!TI);
 TI = 0;
}
void UARTInterrupt(void) interrupt 4
{
 if(RI)
 {
  RI = 0;
  if(f1<16) displaybuf[0][f1++]=SBUF;
  else if(f1==16&&f2<16) displaybuf[1][f2++]=SBUF;
  else 
  {
   for(;f1>0;f1--)
   {
    displaybuf[0][f1]=' ';
    displaybuf[1][f1]=' ';
   }
   f2=f1;
   displaybuf[0][f1++]=SBUF;
  }
  SBUF=k;
  SOneByte(SBUF);
 }
 else
 {
  TI = 0;
 }
}

5、编译链接生成hex 烧录即可
编(啊啊啊这个编又删不掉了 赶紧保存)
6、编译烧录后,用串口调试工具进行测试
调试

结果

搞定!1月3号就考试了,1天看一门课,难受。

链接:https://pan.baidu.com/s/1OmqfIiVFvTS_1MRG3uCaiQ
提取码:apfe
复制这段内容后打开百度网盘手机App,操作更方便哦

### ATM89C52单片机与ADC0832模数转换器连接并通过LCD1602显示光亮度 #### 硬件连接说明 为了实现ATM89C52单片机读取由ADC0832采集到的模拟信号并将其结果显示LCD1602上,硬件部分需按照如下方式连接: - **电源供电** - 将ATM89C52、ADC0832以及LCD1602模块均接入稳定的+5V直流电压源。 - **数据线连接** - 对于ADC0832而言,其CS(Chip Select)、CLK(Clock)、DIN(Data In)和DOUT(Data Out)四个管脚分别对应接到ATM89C52相应的I/O口线上;具体来说可以是P1.0~P1.3这样的分配方案[^1]。 - **控制线配置** - CS应始终保持低电平有效状态以便选通芯片,在程序设计时可通过软件拉低该位来启动一次A/D转换操作; - CLK用于同步串行通信过程中的每一位传输动作,频率不宜过高以免影响精度; - DIN负责向ADC发送命令字节而DOUT则用来接收来自传感器端的数据流。 - **LCD接口定义** - RS (Register Select),R/W(Read/Write), E(Enable)三个控制信号同样要连至微控制器上的指定GPIO引脚,比如可设为P2.0, P2.1 和 P2.2; - 数据总线DB0~DB7建议采用四位模式工作以节省资源开销,则只需占用P0组内的任意连续四根针脚即可完成字符输出功能[^2]。 #### 软件编程指导 以下是基于上述电路布局编写的一份简易测试代码片段,它能够周期性地获取光照强度数值并将之呈现在液晶屏中央位置处。 ```c #include <reg52.h> sbit LCD_RS = P2^0; // 定义RS端子所对应的物理地址 sbit LCD_RW = P2^1; sbit LCD_E = P2^2; #define CMD_CLEAR_DISPLAY 0x01 /* 清除屏幕 */ #define CMD_RETURN_HOME 0x02 #define CMD_ENTRY_MODE_SET 0x04 #define CMD_DISPLAY_ON 0x0F #define CMD_FUNCTION_SET 0x28 void delay(unsigned int ms){ unsigned char i,j; for(i=ms;i>0;i--) for(j=11;j>0;j--); } // 初始化函数初始化LCD1602 void lcd_init(void){ LCD_E=0; LCD_RS=0; LCD_RW=0; write_command(CMD_FUNCTION_SET); // 设置为4-bit模式 write_command(CMD_DISPLAY_ON); // 打开显示器 write_command(CMD_CLEAR_DISPLAY); // 清屏 write_command(CMD_RETURN_HOME); // 光标返回起始位置 } // 向LCD写入指令 void write_command(unsigned char cmd){ P0=(cmd&0xF0)|0x08; // 高4位送入P0口 LCD_E=1; delay(1); LCD_E=0; P0=((cmd<<4)&0xF0)|0x08; // 低4位送入P0口 LCD_E=1; delay(1); LCD_E=0; delay(2); } // 向LCD写入数据 void write_data(unsigned char dat){ P0=(dat&0xF0)|0x0C; // 高4位送入P0口 LCD_E=1; delay(1); LCD_E=0; P0=((dat<<4)&0xF0)|0x0C; // 低4位送入P0口 LCD_E=1; delay(1); LCD_E=0; delay(2); } // 在屏幕上打印字符串 void putstr(char *string){ while(*string != '\0'){ write_data(*string++); } } // 主循环体逻辑处理流程 void main(){ float voltage; unsigned char str[16]; adc_init(); // ADC初始化 lcd_init(); while(1){ voltage=get_adc_value()/255*5.0; // 获取当前环境下的光线强度比例值,并转化为实际伏特数 sprintf(str,"%.2f V",voltage); gotoxy(0,0); // 移动光标到第1行首列 clear_line(); // 清空整行内容以防残留旧数据显示不全 putstr(str); // 输出最新测量结果 delay(1000); // 延迟一秒再重复采样刷新界面 } } ``` 此段代码实现了基本的功能需求,即每隔一段时间就去查询一次光电二极管反馈回来的信息量级大小,并经过简单的量化运算之后呈现给用户直观易懂的形式——具体的毫伏级别单位表示法。当然这只是一个非常基础版本的例子供学习交流用途,实际应用当中可能还需要考虑更多细节方面的问题,例如抗干扰措施、误差校正机制等等[^3]。
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值