找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 795|回复: 2
打印 上一主题 下一主题
收起左侧

单片机与PC机通信实验及双机通信实验 LCD显示乱码

[复制链接]
跳转到指定楼层
楼主

  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. // 定义独立按键连接引脚,这里假设连接到P3^2,可根据实际调整
  6. sbit key = P3^2;  

  7. // LCD1602控制引脚定义
  8. sbit RS = P2^0;
  9. sbit RW = P2^1;
  10. sbit E = P2^2;

  11. // 要发送给PC机的8个数据
  12. uchar data_to_send[8] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38};  
  13. // 用于缓存接收自PC机的数据
  14. uchar received_data[16];  
  15. // 记录接收数据的个数
  16. uchar received_count = 0;  

  17. // 软件延时函数,用于产生一定时间的延时
  18. void delay(uint ms) {
  19.     uint i, j;
  20.     for (i = ms; i > 0; i--)
  21.         for (j = 110; j > 0; j--);
  22. }

  23. // 向LCD1602写入命令
  24. void LCD_WriteCmd(uchar cmd) {
  25.     RS = 0;
  26.     RW = 0;
  27.     P0 = cmd;
  28.     E = 1;
  29.     _nop_();
  30.     E = 0;
  31.     delay(5);
  32. }

  33. // 向LCD1602写入数据
  34. void LCD_WriteData(uchar dat) {
  35.     RS = 1;
  36.     RW = 0;
  37.     P0 = dat;
  38.     E = 1;
  39.     _nop_();
  40.     E = 0;
  41.     delay(5);
  42. }

  43. // 初始化LCD1602
  44. void LCD_Init() {
  45.     LCD_WriteCmd(0x38);  // 设置16*2显示,5*7点阵,8位数据接口
  46.     LCD_WriteCmd(0x0C);  // 显示开,光标关,光标不闪烁
  47.     LCD_WriteCmd(0x06);  // 文字不动,地址自动+1
  48.     LCD_WriteCmd(0x01);  // 清屏
  49.     delay(5);
  50. }

  51. // 在LCD1602上显示给定缓冲区中的数据
  52. void LCD_Display(uchar dat_buf[], uchar length) {
  53.     uchar i;
  54.     for (i = 0; i < length; i++) {
  55.         LCD_WriteData(dat_buf[i]);
  56.     }
  57. }

  58. // 初始化串口
  59. void UART_Init() {
  60.     SCON = 0x50;  // 设置串口工作模式1,8位数据,1位停止位
  61.     TMOD = 0x20;  // 设置定时器1为模式2,自动重装
  62.     TH1 = 0xFD;   // 波特率9600bps,晶振11.0592MHz
  63.     TL1 = 0xFD;
  64.     TR1 = 1;      // 启动定时器1
  65.     ES = 1;       // 使能串口中断
  66.     EA = 1;       // 使能总中断
  67. }

  68. // 通过串口发送一个字节的数据
  69. void UART_Send(uchar dat) {
  70.     SBUF = dat;   // 发送数据
  71.     while (!TI);  // 等待发送完成
  72.     TI = 0;       // 清除发送标志
  73. }

  74. // 串口中断服务函数,用于接收数据
  75. void UART_ISR() interrupt 4 {
  76.     if (RI) {
  77.         RI = 0;  // 清除接收标志
  78.         received_data[received_count++] = SBUF;  // 接收数据到缓存数组
  79.         if (received_count >= 16) {
  80.             received_count = 0;  // 防止缓存溢出,重置计数
  81.         }
  82.     }
  83. }

  84. void main() {
  85.     uchar i;

  86.     UART_Init();  // 初始化串口
  87.     LCD_Init();   // 初始化LCD1602

  88.     while (1) {
  89.         if (key == 0) {  // 检测按键是否按下
  90.             for (i = 0; i < 8; i++) {
  91.                 UART_Send(data_to_send[i]);  // 循环发送8个数据给PC机
  92.             }
  93.             while (key == 0);  // 等待按键释放
  94.         }

  95.         if (received_count > 0) {  // 如果有接收到的数据
  96.             LCD_WriteCmd(0x80);  // 设置LCD显示位置为第一行
  97.             LCD_Display(received_data, received_count);  // 在LCD上显示接收的数据
  98.             received_count = 0;  // 清空接收缓存计数,准备下次接收
  99.         }
  100.     }
  101. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1134903 发表于 2024-12-17 22:57 | 只看该作者
这是仿真

51hei.png (79.11 KB, 下载次数: 0)

51hei.png
回复

使用道具 举报

板凳
ID:275826 发表于 2024-12-18 15:27 | 只看该作者
有1602显示了为什么还要虚拟终端
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表