找回密码
 立即注册
搜索
热搜: 中医 针灸 咳嗽
查看: 177|回复: 0

串口通信方案,并且附带接收中文案列

[复制链接]

3711

主题

1

回帖

1万

积分

管理员

积分
11937
发表于 2023-2-7 21:37:25 | 显示全部楼层 |阅读模式
  1. /*
  2. 串口通信方案,并且附带接收中文案列

  3. */
  4. #include <reg52.h>
  5. #include <stdio.h>
  6. #include <intrins.h>

  7. #define uint  unsigned int
  8. #define uchar unsigned char

  9. sbit DU = P2 ^ 6; // 数码管段选
  10. sbit WE = P2 ^ 7; // 数码管段选
  11. uchar num;        // 数码管显示的值
  12. int Send_Cn = 1;  // 电脑端是否接收发送固定汉字文本
  13. // 共阴数码管段选表0-9
  14. uchar code SMGduan[] = {
  15.     0x3F,
  16.     0x06,
  17.     0x5B,
  18.     0x4F,
  19.     0x66,
  20.     0x6D,
  21.     0x7D,
  22.     0x07,
  23.     0x7F,
  24.     0x6F,
  25. };
  26. // 数码管位选码
  27. uchar code SMGwei[] = {0xfe, 0xfd, 0xfb};

  28. void InitTimer0(void);
  29. void UART_Init_T1();
  30. void delay(uint z);
  31. void display(uchar i)
  32. {
  33.     static uchar wei;
  34.     P0 = 0XFF; // 清除断码
  35.     WE = 1;    // 打开位选锁存器
  36.     P0 = SMGwei[wei];
  37.     WE = 0; // 锁存位选数据
  38.     switch (wei) {
  39.         case 0:
  40.             DU = 1;
  41.             P0 = SMGduan[i / 100];
  42.             DU = 0;
  43.             break;
  44.         case 1:
  45.             DU = 1;
  46.             P0 = SMGduan[i % 100 / 10];
  47.             DU = 0;
  48.             break;
  49.         case 2:
  50.             DU = 1;
  51.             P0 = SMGduan[i % 10];
  52.             DU = 0;
  53.             break;
  54.     }
  55.     wei++;
  56.     if (wei == 3)
  57.         wei = 0;
  58. }

  59. void main(void)
  60. {
  61.     int count;
  62.     InitTimer0();
  63.     UART_Init_T1();
  64.     while (1) {
  65.         if (Send_Cn) {

  66.             TI = 1;

  67.             printf("%d.单片机中文串口测试\n", count++);
  68.             while (!TI)
  69.                 ;
  70.             TI = 0;
  71.             delay(1000);
  72.         }
  73.     }
  74. }

  75. void InitTimer0(void)
  76. {

  77.         EA = 1;        //打开总中断
  78.         ET0 = 1;//打开定时器0中断
  79.         TR0 = 1;         //启动定时器0
  80.         REN = 1;//允许串口接收
  81.         TMOD |= 0X01; //定时器工作模式1,16位定时模式
  82.         TH0 = 0xED;
  83.         TL0 = 0xFF; //定时5ms
  84. }

  85. void Timer0Interrupt(void) interrupt 1
  86. {
  87.         TH0 = 0xED;
  88.         TL0 = 0xFF; //定时5ms
  89.     display(num);
  90. }
  91. /*
  92. 定时器1串口初始化
  93. */
  94. void UART_Init_T1()
  95. {
  96.     if (Send_Cn) {
  97.         SM0 = 0;
  98.         SM1 = 1;      // 串口工作方式1,8位UART波特率可变
  99.         TR1 = 1;      // 启动定时器1
  100.         TMOD |= 0x20; // 定时器1,工作模式2 8位自动重装
  101.         TH1 = 0xfd;
  102.         TL1 = 0xfd; // 设置比特率9600

  103.     } else {
  104.         EA  = 1; // 打开总中断
  105.         ES  = 1; // 打开串口中断
  106.         SM0 = 0;
  107.         SM1 = 1;      // 串口工作方式1,8位UART波特率可变
  108.         REN = 1;      // 串口允许接收
  109.         TR1 = 1;      // 启动定时器1
  110.         TMOD |= 0x20; // 定时器1,工作模式2 8位自动重装
  111.         TH1 = 0xfd;
  112.         TL1 = 0xfd; // 设置比特率9600
  113.     }
  114. }

  115. // 串口中断函数
  116. void UART() interrupt 4
  117. {
  118.     uchar temp;

  119.     if (RI) // 判断接收是否完成
  120.     {
  121.         num  = SBUF; // 读SBUF,读出串口接收到的数据
  122.         RI   = 0;    // 软件清零接收标志位
  123.         temp = num;  //
  124.         SBUF = temp; // 写SBUF,把要发送的数据送给发送缓存器
  125.     }
  126.     if (TI)     // 判断是否发送完成
  127.         TI = 0; // 清零发送完成标志位
  128. }
  129. // 毫秒级延时函数定义
  130. void delay(uint z)
  131. {
  132.     uint x, y;
  133.     for (x = z; x > 0; x--)
  134.         for (y = 114; y > 0; y--)
  135.             ;
  136. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|私人站点 ( 冀ICP备2023028127号-2 )

GMT+8, 2025-7-5 13:49 , Processed in 0.080664 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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