找回密码
 立即注册

QQ登录

只需一步,快速开始

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

在Stc单片机上利用串口实现人机交互例(改编自KEIL C51 V7.0)

[复制链接]
跳转到指定楼层
楼主
ID:1045827 发表于 2022-9-25 18:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//在Stc单片机上利用串口实现人机交互例(改编自KEIL C51 V7.0)
#include"STC8AXX.h"
#include<stdio.h>
#include"types.h"
#include"Qport.h"
#include"delay.h"

#define uchar  unsigned char
#define uint   unsigned int       
#define FOSC    11059200UL
#define BAUD1                9600UL
#define BRT1    (65536 - FOSC / BAUD1 / 4)                                //FEE0


uchar code *s ="Please input the following commands:\n"
                 "Inport  p         (read port)\n"
                "Outport p nnn         (write port)\n"
                " where p=0..3, nnn=0..255\n"
                 "Help or ?  (display this text)\n";


uchar help(){
  printf( "\n%s\n", Q );
  return 0;
}


uchar Inport( uchar idata *rbuf ) {
           uint p;
                uchar v;
          if( sscanf( rbuf, "%i", &p ) != 1 )
    return 1;                                                                               
                    case 0: v=P0; break;               
                    case 1: v=P1; break;               
                    case 2: v=P2; break;               
                    case 3: v=P3; break;               
                    case 4: v=P4; break;               
                    case 5: v=P5; break;               
                    case 6: v=P6; break;               
                    case 7: v=P7; break;               

        default: return 2;                       
          }
          printf( "Port P%d = %02X\n", p, (uint)v );
          return 0;
}


uchar Outport( uchar idata *rbuf ) {
          uint p, v;
          if( sscanf( rbuf, "%i%i", &p, &v ) != 2 )
                    return 1;                                       
          switch( p ){
                    case 0: P0=v; break;                                               
                    case 1: P1=v; break;                                               
                    case 2: P2=v; break;                                               
                    case 3: P3=v; break;                                               
                    case 4: P4=v; break;                                               
                    case 5: P5=v; break;                                               
                    case 6: P6=v; break;                                               
                    case 7: P7=v; break;                                               

                        default: return 2;                                                       
          }
          return 0;
}


void main( void ) {
uchar idata buf[41];

        uchar elevel;
        uchar mjs;
        Qport_init();                                                                                               

//SCON:SM0 SM1 SM2 REN TB8 RB8 TI RI
//      0   1   0   1   X   X   1  0
        SCON = TI_+REN_+SM1_;                                                                //0x52

//TMOD: T1_GATE  T1_C/T  T1_M1 T1_M0 T1_GATE  T0_C/T  T0_M1  T0_M0
//         0        0      0     0     0        0       0      0
//
  TMOD = 0x00;
//AUXR: T0x12 T1x12        UART_M0x6  T2R T2_C/T T2x12 EXTRAM S1ST2
//        1     1        0       0    0     0      0     0

        AUXR = 0xc0;
        TL1 = BRT1;
  TH1 = BRT1 >> 8;
  TR1 = 1;                               


        for(;;){

//                if(!P30) IAP_CONTR=0x60;                                                                                                                                               
//                        WDT_CONTR|=0x10;                                                                       

                        for(mjs=0;mjs<=2;mjs++){
                                        DelayMs(200);
//                                        LED1=!LED1;
                                        LED2=!LED2;
                                        LED3=!LED3;
//                                        LED4=!LED4;
                                                }

                                        help();                                                                                                                       
                                        putchar('>');
                                        gets(buf,20);                                                       
                                        switch( elevel = command( buf ) ){       
                                                case 0: break;
                                                default: printf( "Error %d\n\n", (uint)elevel );}
                }
        }

//命令解析       
#include<stdlib.h>
#include<types.h>

typedef struct {
          uchar code *name;
          uchar (code *func)(uchar idata *);
}comm_struct;


comm_struct code comm_tab[] = {                       
                "Inport", Inport,
                "Outport", Outport,
                "help", help,
                "?", help,
                "", NULL                                                       
};


uchar command( uchar idata *buf ) {
          uchar i, j;                                       
          for( i = 0;; )
                    for( j = 0;; ){
                      if( comm_tab[i].name[j] != 0 ){
        if( ((comm_tab[i].name[j] ^ buf[j]) & 0x5F) == 0 ){
                                  j++;
                                                  continue;                               
                         }
                                i++;
        break;                                 
                      }
                      if( j == 0 )        return 255;                       
                      return comm_tab[i].func( buf+j );       
                    }
}

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

使用道具 举报

沙发
ID:1045827 发表于 2022-9-25 18:08 | 只看该作者
需要详细的工程文件,可以我;利用串口调试软件进行调试时,应输入如:inport 3\n这样的命令。
回复

使用道具 举报

板凳
ID:467178 发表于 2022-10-5 16:22 | 只看该作者
大侠能帮我看看这个问题吗?谢谢你呀http://www.51hei.com/bbs/dpj-223490-1.html
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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