找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2847|回复: 0
收起左侧

自己做的单片机串口控制台 调试用 (原理图,文档,源码)

[复制链接]
ID:246783 发表于 2020-3-20 15:20 | 显示全部楼层 |阅读模式
自己做的一个控制板,上面挂的器件比较多,IO 不够用了,
同时也不想用按键来控志;
直接写了一个的串口控制台,用来PC下发命令字调试其它器件
(相比串口直接字节下发数据,  命令字多了稳定性和杂波干扰的可能, 重启和插拔串口不会导致控制中心不稳
以及避除了数据与命令重复的问题),
单片机再执行命令字各种操作,  -------单片机接收时先寻找第一字节=AA,再寻找第二字节55,匹配后才认为是命令字

单片机程序内简单使用了16组CMD,   可以按照自行情况修改,很好用  ,测试了1w次没有问题


帧头1帧头2CMD(理论可以做254组命令字,0初值)
帧头AA551
帧头AA552
帧头AA553
帧头AA554
帧头AA555
帧头AA556
帧头AA557
帧头AA558
帧头AA559
帧头AA5510
帧头AA55..
帧头AA55..
帧头AA55FE
帧头AA55FF


单片机用的STC15FW408AS, 数码管:共阳三位5631AS

电路原理图如下:
408as.JPG uart1.JPG uart11.JPG

单片机源程序如下:

  1. /******************************************/

  2. /*************        本地常量声明        **************/
  3. #define MAIN_Fosc                22118400L        //定义主时钟
  4. #include        "STC15Fxxxx.H"

  5. /*****************************************************************************/
  6. #include<3LED_anode.H>//数码管驱动显示程序       
  7. #include<beep.H>   //蜂鸣器驱动
  8. #include<UART1.H> // UART1, 408AS没有串口2,TIMER1  
  9. #include<led.H>           // LED显示灯
  10. /*****************************************************************************/
  11. //IO 设置
  12. //P1 标准双向  
  13. #define P1M0SET                0x00 //设置I/O口工作方式//00000000(左到右,高到低位)
  14. #define P1M1SET                0x00 //设置I/O口工作方式//00000000
  15. // P2 标准双向        
  16. #define P2M0SET                0x00 //设置I/O口工作方式//00000000
  17. #define P2M1SET                0x00 //设置I/O口工作方式//00000000
  18. //P3.6 (DS18B20---DATA OD门)
  19. #define P3M0SET                0x40 //设置I/O口工作方式//01000000
  20. #define P3M1SET                0x40 //设置I/O口工作方式//01000000


  21. /*************        串口部分        **************/
  22. u8        idata RX1_Buffer[RX1_Lenth];        //接收缓冲
  23. u8        TX1_Cnt;        //发送计数
  24. u8        RX1_Cnt;        //接收计数
  25. bit        B_TX1_Busy;        //发送忙标志

  26. /**********************************************/
  27. //串口发送数组,测试数组
  28. unsigned char code TXtest_data[]={
  29. 0x88,0x99,0x66,0x77,0x99,
  30. };//


  31. /**********************************************/
  32. unsigned int tmp=0;
  33. unsigned int tem=0;//

  34. unsigned char rec_cnt=0;
  35. unsigned char rec_cmd=0;  
  36. /***********************************************/
  37. void rec_cmd1(void);
  38. void CMD_DO(void);
  39. void trans_tmp(void);
  40. void Pinit (void);
  41. /*************        本地函数声明        **************/       

  42. /**********************************************/
  43. void main()
  44. {


  45. /**********************************************/
  46.         unsigned char i;
  47.         unsigned int KK;
  48.         unsigned int sn;
  49.         unsigned char CMD_TYPE;

  50.        

  51.         delay1ms(300); //延时待系统稳定
  52. /**********************************************/
  53.         beepdi();        //蜂鸣
  54. /**********************************************/
  55.         UART1_init ();         //串口初始化 串口1,timer2
  56. /**********************************************/

  57.         REN = 1;        //允许接收
  58.         ES  = 1;        //允许中断
  59.         EA = 1;                //允许全局中断
  60. /**********************************************/       
  61.         ledoff(1);
  62.         ledoff(2);
  63.         ledoff(3);
  64.         ledoff(4);
  65. /**********************************************/
  66.         SendString("STC15W408AS Uart Test !\r\n");
  67.         SendString("帧头:");
  68.         SendString("aa:");
  69.         SendString("55:");
  70. /**********************************************/
  71.        
  72.        
  73.        
  74.         while (1)
  75.         {

  76.                
  77.         rec_cmd1();       
  78.         CMD_DO();



  79.         }

  80. /**********************************************/




  81. /**********************************************/
  82. }

  83. /*************        408AS        **************/
  84. void rec_cmd1(void)
  85. {
  86.        
  87.                
  88.     if (rec_cnt!=RX1_Cnt) //  接收计数有变化
  89.         {
  90.                 rec_cnt=RX1_Cnt;
  91.         /**********************************************/
  92.             if(RX1_Cnt == 0)                //收到过数据>=3字节,接收计数变化,寻找帧头会有浪费
  93.                 {
  94.                  
  95.                 if(RX1_Buffer[29]==0xaa)                //aa 帧头寻找
  96.                         {
  97.                            if ((RX1_Buffer[29]==0xaa)&(RX1_Buffer[30]==0x55))//AA&55双字节定帧
  98.                                    {
  99.                                         rec_cmd=RX1_Buffer[31];                                               
  100.                                 }
  101.                         }
  102.                 }       

  103. /**********************************************/
  104.                 if(RX1_Cnt == 1)                //收到过数据>=3字节,接收计数变化,寻找帧头会有浪费
  105.                 {                  
  106.                         if(RX1_Buffer[30]==0xaa)                //aa 帧头寻找
  107.                         {
  108.                            if ((RX1_Buffer[30]==0xaa)&(RX1_Buffer[31]==0x55))//AA&55双字节定帧
  109.                                    {
  110.                                         rec_cmd=        RX1_Buffer[0];                                        
  111.                                 }
  112.                         }               

  113.                 }       
  114. /**********************************************/
  115.                 if(RX1_Cnt == 2)                //收到过数据>=3字节,接收计数变化,寻找帧头会有浪费
  116.                 {
  117.                  
  118.                         if(RX1_Buffer[31]==0xaa)                //aa 帧头寻找
  119.                         {
  120.                            if ((RX1_Buffer[31]==0xaa)&(RX1_Buffer[0]==0x55))//AA&55双字节定帧
  121.                                    {
  122.                                         rec_cmd=RX1_Buffer[1];                                
  123.                                        
  124.                                
  125.                                 }
  126.                         }       
  127.                        

  128.                 }       
  129. /**********************************************/
  130.                 if(RX1_Cnt >= 3)                //收到过数据>=3字节,接收计数变化,寻找帧头会有浪费
  131.                 {
  132.                  
  133.                         if(RX1_Buffer[RX1_Cnt-3]==0xaa)                //aa 帧头寻找
  134.                         {
  135.                                    if ((RX1_Buffer[RX1_Cnt-0x03]==0xaa)&(RX1_Buffer[RX1_Cnt-0x02]==0x55))//AA&55双字节定帧
  136.                                    {
  137.                                         rec_cmd=RX1_Buffer[RX1_Cnt-1];       
  138.                                 }
  139.                         }       

  140.                 }         
  141.                      
  142.         }
  143. }
  144. /*************        408AS        **************/


  145. /********************* UART1中断函数************************/
  146. /*************        408AS        **************/
  147. void CMD_DO(void)
  148. {


  149.        
  150.                                         switch(rec_cmd)
  151.                                         {
  152.                                         case 0x1://                       
  153.                                                 ledon(0x01);
  154.                                                 rec_cmd=0;       
  155.                                                 break;//               
  156.                                         case 0x02://                       
  157.                                                 ledon(0x02);
  158.                                                 rec_cmd=0;                
  159.                                                 break;//               
  160.                                         case 0x03://                       
  161.                                                 ledon(0x03);
  162.                                                 rec_cmd=0;       
  163.                                                 break;//
  164.                                         case 0x04://                       
  165.                                                 ledon(0x04);
  166.                                                 rec_cmd=0;
  167.                                                 break;//
  168.                                         case 0x5://                       
  169.                                                 displayHH1(1) ;
  170.                                                 rec_cmd=0;
  171.                                                 break;//               
  172.                                         case 0x06://                       
  173.                                                 displayHH1(2);
  174.                                                 rec_cmd=0;               
  175.                                                 break;//               
  176.                                         case 0x07://                       
  177.                                                 displayHH1(3);
  178.                                                 rec_cmd=0;       
  179.                                                 break;//
  180.                                         case 0x08://                       
  181.                                                 displayHH1(4);
  182.                                                 rec_cmd=0;
  183.                                                 break;//
  184.                                         case 0x9://                       
  185.                                                 displayHH2(1) ;
  186.                                                 rec_cmd=0;
  187.                                                 break;//               
  188.                                         case 0x0a://                       
  189.                                                 displayHH2(2);
  190.                                                 rec_cmd=0;
  191.                                                 break;//               
  192.                                         case 0x0b://                       
  193.                                                 displayHH2(3);
  194.                                                 rec_cmd=0;
  195.                                                 break;//
  196.                                         case 0x0c://                       
  197.                                                 displayHH2(4);
  198.                                                 rec_cmd=0;       
  199.                                                 break;//
  200.                                         case 0x0d://                       
  201.                                                 displayHH3(1) ;       
  202.                                                 rec_cmd=0;
  203.                                                 break;//               
  204.                                         case 0x0e://                       
  205.                                                 displayHH3(2);
  206.                                                 rec_cmd=0;               
  207.                                                 break;//               
  208.                                         case 0x0f://                       
  209.                                                 displayHH3(3);
  210.                                                 rec_cmd=0;
  211.                                                 break;//
  212.                                         case 0x10://                       
  213.                                                 displayHH3(4);
  214.                                                 rec_cmd=0;       
  215.                                                 break;//
  216.                                         case 0x11://                       
  217.                                                 displayHH3(8);
  218.                                                 rec_cmd=0;       
  219.                                                 break;//
  220.                                         default         :
  221.                                     rec_cmd=0;;       

  222.         };               
  223.                
  224. }


  225. /********************* 函数************************/
  226. //M0,M1  IO口设定模式
  227. //(0,0)  标准双向
  228. //(0,1)  推挽输出,强上拉输出
  229. //(1,0)  高阻,仅输入
  230. //(1,1)  开漏IO,内部上拉断开
  231. /***********************************************///P口初始化 DS18B数据要OD设计

  232. void Pinit (void){       
  233.                 P3M1=P3M1SET;
  234.                 P3M0=P3M0SET;
  235.                 P1M0=P1M0SET;
  236.                 P1M1=P1M1SET;
  237.                 P2M0=P2M0SET;
  238.                 P2M1=P2M1SET;
  239.                 }

  240. /*******************************************/

  241. /**********************************************/
  242. /*
  243.        
  244. //串口数据处理               
  245. ……………………

  246. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:

串口控制台.zip

63.44 KB, 下载次数: 18, 下载积分: 黑币 -5

源码--调试用-STC15W408AS

408AS.zip

334.2 KB, 下载次数: 14, 下载积分: 黑币 -5

原理图和数码管以及串口控制台编码文档

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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