找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机比较两数是否相同(接受串口数据)

[复制链接]
跳转到指定楼层
楼主
ID:426161 发表于 2018-11-14 09:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
  1. #include<reg51.h>
  2. #include<string.h> //后面有一个比较函数
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. bit  UART_Flag=0;  //定义串口接收标志位
  6. uchar str[50];   //定义一数组
  7. uchar length=0;  //数组长度从0开始
  8. void init() //初始化uart
  9. {
  10.   
  11.   
  12.    TMOD=0X20;  //定时器1定时器方式  工作模式2,可自动重载的8位计数器常把定时/计数器1以模式2作为串行口波特率发生器
  13. SCON=0X50; //选择工作模式1使能接收,允许发送,允许接收
  14.     EA=1; //开总中断
  15. ES=1;  //打开串口中断
  16. ET1=0;  //打开定时器中断
  17.        PCON=0X80; //8位自动重载,波特率加倍
  18. TH1=0XFF;  //用22.1184 mhz波特率
  19. TL1=0XFF;
  20.    
  21. TR1=1; //打开中时器
  22.    

  23. }
  24. void UART_Putch(uchar dat)  //输出一个字符
  25. {
  26. SBUF=dat; //把数据送给sbuf缓存器中
  27. while(TI!=1);//发送标志位 TI如果发送了为1,没发送为0,没发送等待,到了退出循环
  28. TI=0;  //到了,TI清为0
  29. }
  30. void init1() interrupt 4  //uart中断 ,4为串口中断
  31. {

  32.   if(RI==1)  //收到数据
  33.   {
  34.      uchar m=SBUF; //m为计算机发送给串口的数据,例,open //总体思想是,计算机通知串口,我要发数据了
  35.   RI=0;   //收到清0
  36.   
  37.      if(m=='\r')   //判断m这位数据有无\r
  38.        {
  39.        UART_Putch('\r');  //回车
  40.        UART_Putch('\n');  // 换行
  41.     str[length]='\0'; //数据最后位加0标志位表示发完了数据
  42.     UART_Flag=1;  // 传 完 标 志 位
  43.         }
  44.    else if(m=='\n')
  45.   {

  46.   }
  47.      else if(m=='\b')//b表退格 //下面几句表删锄
  48.        {
  49.          UART_Putch('\b');
  50.     UART_Putch('');
  51.    UART_Putch('\b');
  52.    length=length-1; //删锄了后总长度减一
  53.        }
  54.   
  55.    
  56.      else
  57.      {
  58.      str[length++]=m; //比如m为open,先传0后传p,length加一
  59.   UART_Putch(m);    //输出 比如open
  60.      }
  61.   
  62. }
  63. }
  64. void check(char *str)  //计算机发一数据,我来检查,
  65. {
  66.    if( strcmp("open",str)==0 ) //比较两数是否相同,相同为0,不同为1 //要加string.h头文件
  67.    {
  68.        UART_Putch('o'); //计算机中写入open我回复ok
  69.     UART_Putch('k');
  70.        UART_Putch('\r'); //回车是跑到这一行的最前      UART_Putch('\n'); //换行是跳到下一行
  71.   }
  72.    else if( strcmp("close",str)==0 )
  73.    {
  74.        UART_Putch('o');
  75.     UART_Putch('k');
  76.        UART_Putch('\r');
  77.        UART_Putch('\n');
  78.   
  79.   
  80.    }
  81.    else    //否则出错
  82.    {
  83.        UART_Putch('e');
  84.     UART_Putch('r');
  85.        UART_Putch('r');
  86.        UART_Putch('o');
  87.        UART_Putch('r');
  88.        UART_Putch('!');
  89.     UART_Putch('\r');
  90.     UART_Putch('\n');
  91.    }

  92. }
  93. void main()
  94. {
  95.   init();
  96.   while(1)
  97.   {
  98.     if(UART_Flag==1)  //接收标志位表示接收完成
  99.      {
  100.      check(str);//检查
  101.      length=0; //长度清0
  102.      UART_Flag=0;//标志位清0
  103.   }

  104.   }

  105. }
复制代码


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

使用道具 举报

沙发
ID:95613 发表于 2021-9-13 15:50 | 只看该作者
后面函数在哪啊
回复

使用道具 举报

板凳
ID:965912 发表于 2021-9-14 00:09 | 只看该作者
没有仿真学习下吗
回复

使用道具 举报

地板
ID:875095 发表于 2021-9-15 00:11 | 只看该作者
看着好累,就不能直接写:
void serial_out(char* pchar)
{
   while(*pchar)
    {
       SBUF = *pchar;
       while(TI == 0);
       TI = 0;
    }
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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