设为首页收藏本站淘宝杂货铺

从F到0 - From F to 0

 找回密码
 注册已关闭
搜索
查看: 1632|回复: 2
收起左侧

STC15F104E/W 系列单片机 外部中断实现软串口收发程序 (无需定时器,带FIFO帧缓存)

[复制链接]
发表于 2020-7-22 18:25:26 | 显示全部楼层 |阅读模式
本帖最后由 哒哒哒 于 2020-7-22 18:25 编辑

1.png
  1. #include "stc15f104e.h"
  2. #include "intrins.h"
  3. #define U8 unsigned char
  4. #define U16 unsigned int
  5. #define U32 unsigned long
  6. #define FIFO 16         //串口1帧最大缓存字节数
  7. sbit rxd = P3 ^ 0;
  8. sbit txd = P3 ^ 1;

  9. void delay_uart() {     //33.1776Mhz 延时1/9600秒
  10.     U8 data a, b;
  11.     for (b = 246; b > 0; b--)
  12.         for (a = 2; a > 0; a--);
  13. }

  14. void TXD_Byte(U8 Byte) {   //串口发送1字节
  15.     U8 j = 1;
  16.     delay_uart();
  17.     txd = 0;
  18.     do {
  19.         delay_uart();
  20.         txd = Byte & j;
  21.         j <<= 1;
  22.     } while (j);
  23.     delay_uart();
  24.     txd = 1;
  25. }

  26. void TXD_Text(U8* text) {      //串口发送字符串
  27.     for (;*text;text++) {
  28.         TXD_Byte(*text);
  29.     }
  30. }

  31. void TXD_FiFo(U8* FiFo, U8 len) {       //串口发送1帧数据 参数1:FIFO指针 参数2:FIFO帧字节数
  32.     U8 j;
  33.     if (!len || len > FIFO) return;
  34.     for (j = 0; j < len; j++) {
  35.         TXD_Byte(FiFo[j]);
  36.     }
  37. }

  38. void RXD_FiFo(U8* FiFo,U8 len) {      //串口接收1帧数据 参数1:FIFO指针 参数2:FIFO帧字节数 (0为错误帧)
  39.     //此处添加用户代码
  40.     U8 j,k;
  41.     if (!len) {
  42.         TXD_Text("Error!\r\n");
  43.         return;
  44.     }
  45.     //ROT13算法处理
  46.     for (j = 0; j < len; j++) {
  47.         k = FiFo[j];
  48.         if (k >= 65 && k <= 77 || k >= 97 && k <= 109) {
  49.             k += 13;
  50.         }
  51.         else if (k >= 78 && k <= 90 || k >= 110 && k <= 122) {
  52.             k -= 13;
  53.         }
  54.         FiFo[j] = k;
  55.     }
  56.     TXD_FiFo(FiFo, len);
  57.     TXD_Byte(0x0D);
  58.     TXD_Byte(0x0A);

  59. }

  60. void main() {
  61.     P3 = 0xFF;                  //P3口置高电平
  62.     INT_CLKO |= 0x40;           //(EX4 = 1)开INT4(P3.0)下降沿中断
  63.     EA = 1;                     //开总中断
  64.     TXD_Text("Hello World!\r\n");
  65.     while (1) {
  66.         _nop_();
  67.         _nop_();
  68.         _nop_();
  69.         _nop_();
  70.     }
  71. }

  72. void _16() interrupt 16{    //INT4(P3.0)下降沿中断
  73.     U8 j, Byte, len = 0;
  74.     U8 FiFo[FIFO];
  75.     do {
  76.         j = 1;
  77.         Byte = 0;
  78.         while (rxd);
  79.         do {
  80.             delay_uart();
  81.             if (rxd) Byte |= j;
  82.             j <<= 1;
  83.         } while (j);
  84.         delay_uart();
  85.         if (len >= FIFO || !rxd) {
  86.             len = 0;
  87.             break;
  88.         }
  89.         FiFo[len++] = Byte;
  90.         delay_uart();
  91.     } while (!rxd);
  92.     RXD_FiFo(&FiFo, len);
  93. }
复制代码

相关帖子

您需要登录后才可以回帖 登录 | 注册已关闭

本版积分规则

QQ|手机版|Archiver|从F到0 ( 蒙ICP备17002595号-1 )
蒙公网安备15010402000325号

腾讯云安全认证

GMT+8, 2024-3-29 15:46 , Processed in 0.638036 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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