找回密码
 立即注册

QQ登录

只需一步,快速开始

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

电脑COM口命令51单片机串口控制IO开关输出 含源码+Proteus+工具

[复制链接]
跳转到指定楼层
楼主
一个用电脑的com串口命令单片机控制开关输出的小程序,如串口发送led0_open回车后,单片机点亮led0
请多指教!.......

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)



单片机源程序如下:
  1. /* 发一个用串口命令单片机控制开关输出的小程序,如串口发送led0_open回车后,单片机点亮led0  */

  2. #include<reg51.h>
  3. #include<string.h> //后面有一个比较函数

  4. bit  UART_Flag=0;             //定义串口接收标志位
  5. idata unsigned char str[50];  //定义一数组,用于串口接收命令缓存
  6. unsigned char length=0;       //数组长度从0开始

  7. unsigned char ID=0;           //用于查找命令数组ID

  8. sbit led0=P1^0; //定义led接口
  9. sbit led1=P1^1; //同上
  10. sbit led2=P1^2; //同上
  11. sbit led3=P1^3; //同上
  12. sbit led4=P1^4; //同上
  13. sbit led5=P1^5; //同上
  14. sbit led6=P1^6; //同上
  15. sbit led7=P1^7; //同上

  16. code unsigned char *coun[16]=  //命令数组(字符串数组必须定义为指针型),用于查找swtish case命令对应ID执行对应功能
  17.               {
  18.                       {"led0_open"},   //ID 0
  19.                       {"led0_close"},
  20.                       {"led1_open"},
  21.                       {"led1_close"},
  22.                       {"led2_open"},
  23.                       {"led2_close"},
  24.                       {"led3_open"},
  25.                       {"led3_close"},
  26.                       {"led4_open"},
  27.                       {"led4_close"},
  28.                       {"led5_open"},
  29.                       {"led5_close"},
  30.                       {"led6_open"},
  31.                       {"led6_close"},
  32.                       {"led7_open"},
  33.                       {"led7_close"}  //ID 15
  34.               };
  35.                                                         
  36. code char *com_face[19]=  //分配使用 idata\xdata\code.
  37.                {
  38.                          "  ~★★   ★★~* \r\n",
  39.                          " *★  ∴*★ *  ∴°★\r\n",
  40.                          "★        *°★\r\n",
  41.                          "★°*   心想事成  *°★\r\n",
  42.                          "  ★‘& ?*°∴°°☆☆★ *°☆☆\r\n",
  43.                          "   ★ °∴°°☆°∴★*°☆∴新°∴*☆\r\n",
  44.                          "    ★*°∴°°☆★∴°∴*°年°∴*°☆\r\n",
  45.                          "     ★°∴★☆∴° ∴*快°∴*°☆\r\n",
  46.                          "      ★  ☆∴*乐°∴°☆\r\n",
  47.                          "       ﹨  ☆*  ☆\r\n",
  48.                          "        ﹨   ☆\r\n",
  49.                          "         ﹨ │\r\n",
  50.                          "          ﹨/ \r\n",
  51.                          "           ▏\r\n",
  52.                          "           ﹨● \r\n",
  53.                          "             ■﹨\r\n",
  54.                          "   A.y            / ﹨\r\n",
  55.                          "-----------------------------------------------\r\n",
  56.                          "                 串口通信测试v2.0\r\n"
  57.                };

  58. /****************************************************************************************************
  59. //  SCON    D7    D6    D5    D4    D3    D2    D1    D0
  60. //  98H   SM0   SM1   SM2   REN   TB8   RB8    TI    RI
  61. // SM0、SM1:串行口工作方式选择 01 为方式1、8位异步通信、波特率可变。SM2多机通讯控制位
  62. // REN:接收允许控制位,TB8:要发送数据的第9位,RB8:接收到的数据的第9位。
  63. // TI: 发送中断标志,RI:接收中断标志。
  64. *****************************************************************************************************/
  65. void init() //串口初始化
  66. {
  67.     /******************设定定时器*********************/
  68.     TMOD=0X20;   //定时器1定时器方式  工作模式2,可自动重载的8位计数器常把定时/计数器1以模式2作为串行口波特率发生器.
  69.     TH1=0XFD;    //11.0592 19200MHz=9600*2
  70.     TL1=0XFD;  
  71.     ET1=0;       //打开定时器中断
  72.     TR1=1;       //打开中时器

  73.    /*******************设定串口**********************/
  74.     SCON=0X50;   //选择工作模式1使能接收,允许发送,允许接收

  75.    /*******************设定中断**********************/
  76.     EA=1;        //开总中断
  77.     ES=1;        //打开串口中断

  78.    /****************设定波特率加倍*******************/
  79.     PCON=0X80;   //8位自动重载,波特率加倍
  80. }

  81. void UART_Send_Byte(unsigned char dat)  //输出一个字符
  82. {
  83. SBUF=dat;       //把数据送给sbuf缓存器中
  84. while(TI!=1);   //发送标志位 TI如果发送了为1,没发送为0,没发送等待,到了退出循环
  85. TI=0;           //到了,TI清为0
  86. }

  87. void UART_Send_Enter() //改送回车换行(\r\n 或 0x0d、0x0a)
  88. {
  89.     UART_Send_Byte(0x0d);
  90.     UART_Send_Byte(0x0a);
  91. }

  92. void UART_Send_String(unsigned char *p) //串口发送字符串
  93. {
  94.         EA=0;
  95.   while(*p != '\0')                                       //字符串会以 '\0'结束存在,遇到'\0'则结束发送
  96.   {
  97.           UART_Send_Byte(*p);                 //发送单个字符
  98.           p++;
  99.   }
  100.     EA=1;
  101. }

  102. void UART_service() interrupt 4   //uart中断服务 ,4为串口中断
  103. {

  104.     if(RI==1)  //如果数据已经接收完,即RI=1
  105.     {

  106.         unsigned char m=SBUF;  //m为计算机发送给串口的数据,例,open //总体思想是,计算机通知串口,我要发数据了
  107.         RI=0;                  //收到清0
  108.   
  109.         if(m=='\r')            //判断m这位数据有无\r
  110.         {
  111.             UART_Send_Enter(); //回车换行
  112.             str[length]='\0';  //数据最后位加0标志位表示发完了数据
  113.             UART_Flag=1;       // 传 完 标 志 位
  114.         }
  115.         else if(m=='\n')
  116.         { }
  117.             else if(m=='\b')   //b表退格 //下面几句不要删除
  118.             {
  119.                 UART_Send_Byte('\b');
  120.                 UART_Send_Byte(' ');
  121.                 UART_Send_Byte('\b');
  122.                 length=length-1;  //删除了后总长度减一
  123.             }
  124.         else
  125.         {
  126.             str[length++]=m;      //比如m为open,先传0后传p,length加一
  127.             if(length>45)         //命令缓存数组最大是50.
  128.             length=0;             //防止接收过长错误命令造成档机
  129.             UART_Send_Byte(m);    //输出 比如open
  130.         }
  131.     }
  132. }

  133. void Get_command_ID(unsigned char *str) //获取命令在命令数组中的ID
  134. {
  135.         for (ID = 0; ID < 16; ID++)           //"16"为命令数组的层数
  136.         {
  137.                 if(strcmp(coun[ID],str)==0)         //"strcmp"函数用于命令数组的命令与接收到的命令进行对比,相同结果为0.
  138.                         break;                            //相同则结束对比
  139.         }

  140.         if (ID >= 16) //所有命令不符。
  141.         {
  142.                  ID=255;    //得到提示命令错误的ID
  143.         }
  144. }

  145. void Command_function()  //得到命令对应命令数组的层数ID后执行相对功能
  146. {
  147.         switch(ID)
  148.         {
  149.                 case 0:          //命令数组第1个命令
  150.                      led0 = 0;
  151.                      UART_Send_String("led0_open OK\r\n\r\n");
  152.                      break;
  153.                 case 1:          //命令数组第2个命令
  154.                      led0 = 1;
  155.                      UART_Send_String("led0_close OK\r\n\r\n");
  156.                      break;
  157.                 case 2:
  158.                      led1 = 0;
  159.                      UART_Send_String("led1_open OK\r\n\r\n");
  160.                      break;
  161.                 case 3:
  162.                      led1 = 1;
  163.                      UART_Send_String("led1_close OK\r\n\r\n");
  164.                      break;
  165.                 case 4:
  166.                      led2 = 0;
  167.                      UART_Send_String("led2_open OK\r\n\r\n");
  168.                      break;
  169.                 case 5:
  170.                      led2 = 1;
  171.                      UART_Send_String("led2_close OK\r\n\r\n");
  172.                      break;
  173.                 case 6:
  174.                      led3 = 0;
  175.                      UART_Send_String("led3_open OK\r\n\r\n");
  176.                      break;
  177.                 case 7:
  178.                      led3 = 1;
  179.                      UART_Send_String("led3_close OK\r\n\r\n");
  180.                      break;
  181.                 case 8:
  182.                      led4 = 0;
  183.                      UART_Send_String("led4_open OK\r\n\r\n");
  184.                      break;
  185.                 case 9:
  186.                      led4 = 1;
  187.                      UART_Send_String("led4_close OK\r\n\r\n");
  188.                      break;        
  189.                 case 10:
  190.                      led5 = 0;
  191.                      UART_Send_String("led5_open OK\r\n\r\n");
  192.                      break;
  193.                 case 11:
  194.                      led5 = 1;
  195.                      UART_Send_String("led5_close OK\r\n\r\n");
  196.                      break;        
  197.                 case 12:
  198.                      led6 = 0;
  199.                      UART_Send_String("led6_open OK\r\n\r\n");
  200.                      break;
  201.                 case 13:
  202.                      led6 = 1;
  203.                      UART_Send_String("led6_close OK\r\n\r\n");
  204.                      break;
  205.                 case 14:
  206.                      led7 = 0;
  207.                      UART_Send_String("led7_open OK\r\n\r\n");
  208.                      break;
  209.                 case 15:
  210.                      led7 = 1;
  211.                      UART_Send_String("led7_close OK\r\n\r\n");
  212.                      break;        
  213.                 case 255:
  214.                      UART_Send_String("Error:-999 --> Command error\r\n\r\n");
  215.                      break;                                       
  216.                 default:
  217.                break;
  218.         }
  219. }

  220. void main(void)
  221. {
  222.           unsigned char i;
  223.     P0=0xff;
  224.     init();
  225.           for (i = 0; i < 19; i++)
  226.     {
  227.               UART_Send_String(com_face[i]);
  228.     }
  229.                 UART_Send_Enter();
  230.     UART_Send_String("初始化......... OK!\r\n");
  231.     while(1)
  232.     {
  233.         if(UART_Flag==1)             //接收标志位表示接收完成
  234.         {
  235.             Get_command_ID(str);     //查检所收命令与命令数组所对应的导数
  236.             Command_function();      //执行功能
  237.             length=0;                //长度清0
  238.          //   memset(str,'\0',50);     //清空str命令缓存数组(memset函数须包含“string.h”头文件)
  239.             UART_Flag=0;             //标志位清0
  240.         }
  241.     }
  242. }
复制代码

所有资料51hei提供下载:
51 串口通信程序.7z (660.33 KB, 下载次数: 91)


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

使用道具 举报

沙发
ID:338810 发表于 2018-10-12 16:15 | 只看该作者
希望有用。下载需用5黑币
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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